강의

멘토링

로드맵

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

okky님의 프로필 이미지
okky

작성한 질문수

스프링 핵심 원리 - 기본편

@Autowired 필드 명, @Qualifier, @Primary

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

작성

·

938

0

현재 구성은

DiscountPolicy 인터페이스

- RateDiscountPolicy 클래스

- FixDiscountPolicy 클래스

 

제가 생각하는 구성

DiscountPolicy 인터페이스

- PriceDiscountPolicy 상속

RateDiscount( ) 

FixDiscount( )

 

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

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

안좋은 점이 어떤건가요?

 

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

@primary, @Qualifier, @Autowired 필드

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

@Autowired 필드 방법은

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

 

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

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

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

퀴즈

필드 주입(Field Injection) 방식이 일반적으로 권장되지 않는 이유는 무엇일까요?

불변성을 보장하기 어려워서

의존성 변경이 쉬워서

순수 Java 코드로 테스트하기 어려워서

설정 코드 작성이 복잡해서

답변 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

작성한 질문수

질문하기