인프런 커뮤니티 질문&답변
인터페이스에서 구현체를 굳이 두개로 나누는 이유가 있나요?
작성
·
938
0
현재 구성은
DiscountPolicy 인터페이스
- RateDiscountPolicy 클래스
- FixDiscountPolicy 클래스
제가 생각하는 구성
DiscountPolicy 인터페이스
- PriceDiscountPolicy 상속
RateDiscount( )
FixDiscount( )
이처럼 구현체 클래스를 두 개가 아니라
하나의 구현체 안에 두 개의 메소드를 상속 받아서 쓰면
안좋은 점이 어떤건가요?
***************************
@primary, @Qualifier, @Autowired 필드
구현제 빈을 지정해주는 세 가지 방법이 있는데
@Autowired 필드 방법은
테스트가 안되기 때문에 권장하지 않는건가요?
우선순위 방법인 @Primary 방법은
구현 클래스가 두개일 경우에만 사용하고
두개가 넘어갈 경우 사용하지 못하는건가요?
퀴즈
필드 주입(Field Injection) 방식이 일반적으로 권장되지 않는 이유는 무엇일까요?
불변성을 보장하기 어려워서
의존성 변경이 쉬워서
순수 Java 코드로 테스트하기 어려워서
설정 코드 작성이 복잡해서
답변 1
0
안녕하세요. okky님, 공식 서포터즈 David입니다.
1. 인터페이스를 사용하여 구현체를 여러 개를 만드는 이유는 클라이언트(인터페이스를 사용하는 곳)쪽의 코드를 변경하지 않고 구현을 변경하기 위해서 입니다. 말씀하신대로 하면 새로운 정책이 추가되고 그것을 사용하려 할 때 기존 코드를 변경해야 하는 상황이 발생합니다. 위 내용을 인지하신 상태에서 아래 강의를 참고해주세요.
2. 네, 맞습니다. @Autowired를 사용하여 필드주입을 하게 되면 테스트 작성에 어려움이 있습니다.
3. 3개 이상의 구현체에서도 @Primary는 사용 가능합니다.
감사합니다.
DiscountPolicy 인터페이스(discount 메소드)
- RateDiscountPolicy(@primary) 가장우선순위
- FixDiscountPolicy
- AgeDiscountPolicy
세 개의 구현체가 discount 상속을 받아서 처리할 때
클라이언트에서 discountPolicy.discount 쓸려고 가정하겠습니다.
현재
private final DiscountPolicy discountPolicy; -> RateDiscountPolicy 호출이 되겠죠
왜냐하면 @primary 가장 우선순위가 되어있기 때문에
만약 AgeDiscountPolicy, FixDiscountPolicy 둘 중에 하나 쓰고싶은데
@primary는 RateDiscountPolicy 쓰고 있기 때문에
나머지 두 개는 동등한 순위가 갖게 되어서 구별할 수 없기 때문에
@primary는 3개일 경우 안쓰는 게 좋은 거 아닌가요?






3. 3개 이상의 구현체에서도 @Primary는 사용 가능합니다.
만약 구현체가 3개일 경우
우선순위를 3 class > 2 calss > 1 class 두고 싶다면
3 class에 @primary를 두면 우선으로 되지만
나머지 2 calss = 1 class 동등한 순위를 갖게 되는데
이럴 때는 @primary 사용하지 않는 게 좋은 거 아닌가요?