Spring/김영한 스프링 핵심원리 - 기본편
[섹션 7-5] @Autowired와 조회할 빈이 2개 이상인 경우
보름달빵
2024. 2. 29. 18:32
@Autowired는 타입으로 빈을 조회한다.
@Autowired
private DiscountPolicy discountPolicy
타입으로 빈을 조회하기 때문에 마치 다음과 유사하게 동작한다 ( 실제로는 더 많은 기능이 있다 )
ac.getBean(DiscountPolicy.class)
그런데, 빈 조회에서 공부했듯이 같은 타입의 빈이 2개이상 조회되는 경우 문제가 발생한다.
DiscountPolicy는 RateDiscountPolicy 와 FixDisCountPolicy 라는 두 개의 구체화 클래스가 있었다.
이전에는 컴포넌트 스캔의 대상으로 RateDiscountPolicy 만 등록해줬지만,
FixDisCountPolicy에 @Component를 추가해서 컴포넌트 스캔의 대상으로 만들어주자.
그리고 나서 의존 관계 자동 주입을 실행하면
@Autowired
private DiscountPolicy discountPolicy
NoUniqueBeanDefinitionException 오류가 발생한다.
.NoUniqueBeanDefinitionException:
No qualifying bean of type 'hello.core.discount.DiscountPolicy' available:
expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
오류 메세지를 읽어보니 하나의 빈을 기대했는데 DiscountPolicy 타입이 2개가 조회되어서 어떤 빈을 줘야하는지 구분을 못하겠다고 한다.
이때 필드를 하위 타입으로 지정할 수 도 있지만, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다.
그리고 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결이 안된다.
스프링 빈을 수동 등록해서 문제를 해결해도 되지만, 의존 관계 자동 주입에서 해결하는 여러 방법이 있다.
다음글에서 의존 관계 자동 주입시 조회되는 빈이 2개 이상일때 해결 방법에 대해서 알아보자