인프런 커뮤니티 질문&답변

okky님의 프로필 이미지
okky

작성한 질문수

스프링 핵심 원리 - 기본편

@Autowired 필드 명, @Qualifier, @Primary

인터페이스에서 구현체를 굳이 두개로 나누는 이유가 있나요?

작성

·

764

0

현재 구성은

DiscountPolicy 인터페이스

- RateDiscountPolicy 클래스

- FixDiscountPolicy 클래스

 

제가 생각하는 구성

DiscountPolicy 인터페이스

- PriceDiscountPolicy 상속

RateDiscount( ) 

FixDiscount( )

 

이처럼 구현체 클래스를 두 개가 아니라

하나의 구현체 안에 두 개의 메소드를 상속 받아서 쓰면

안좋은 점이 어떤건가요?

 

***************************

@primary, @Qualifier, @Autowired 필드

구현제 빈을 지정해주는 세 가지 방법이 있는데

@Autowired 필드 방법은

테스트가 안되기 때문에 권장하지 않는건가요?

 

우선순위 방법인 @Primary 방법은

구현 클래스가 두개일 경우에만 사용하고

두개가 넘어갈 경우 사용하지 못하는건가요?

답변 1

0

안녕하세요. okky님, 공식 서포터즈 David입니다.

1. 인터페이스를 사용하여 구현체를 여러 개를 만드는 이유는 클라이언트(인터페이스를 사용하는 곳)쪽의 코드를 변경하지 않고 구현을 변경하기 위해서 입니다. 말씀하신대로 하면 새로운 정책이 추가되고 그것을 사용하려 할 때 기존 코드를 변경해야 하는 상황이 발생합니다. 위 내용을 인지하신 상태에서 아래 강의를 참고해주세요.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/lecture/55342

2. 네, 맞습니다. @Autowired를 사용하여 필드주입을 하게 되면 테스트 작성에 어려움이 있습니다.

3. 3개 이상의 구현체에서도 @Primary는 사용 가능합니다.

감사합니다.

okky님의 프로필 이미지
okky
질문자

3. 3개 이상의 구현체에서도 @Primary는 사용 가능합니다.

만약 구현체가 3개일 경우

우선순위를 3 class > 2 calss > 1 class 두고 싶다면

3 class에 @primary를 두면 우선으로 되지만 

나머지 2 calss = 1 class 동등한 순위를 갖게 되는데

이럴 때는 @primary 사용하지 않는 게 좋은 거 아닌가요?

2 class, 1 class가 동등한 순위를 갖게 될 때 @Primary를 사용하는게 왜 좋지 않은지 설명해주실 수 있으실까요?

okky님의 프로필 이미지
okky
질문자

DiscountPolicy 인터페이스(discount 메소드)

- RateDiscountPolicy(@primary) 가장우선순위

- FixDiscountPolicy 

- AgeDiscountPolicy 

 

세 개의 구현체가 discount 상속을 받아서 처리할 때 

클라이언트에서 discountPolicy.discount 쓸려고 가정하겠습니다.

 

현재 

private final DiscountPolicy discountPolicy;  -> RateDiscountPolicy 호출이 되겠죠

왜냐하면 @primary 가장 우선순위가 되어있기 때문에

 

만약 AgeDiscountPolicy, FixDiscountPolicy 둘 중에 하나 쓰고싶은데

@primary는 RateDiscountPolicy 쓰고 있기 때문에

나머지 두 개는 동등한 순위가 갖게 되어서 구별할 수 없기 때문에

@primary는 3개일 경우 안쓰는 게 좋은 거 아닌가요?

 

위와 같은 상황에서 다른 빈을 사용하려면 @Qualifier로 더 상세하게 사용할 빈을 지정하는 방법을 사용하시면 됩니다.

okky님의 프로필 이미지
okky

작성한 질문수

질문하기