Backend

[스프링 핵심 원리 이해] 조회할 빈이 2개 이상 - 문제

햣둘 2025. 2. 10. 07:54

@Autowired는 타입(Type)으로 조회한다.

@Autowired
private DiscountPolicy discountPolicy

 

타입으로 조회하기 때문에, 마치 다음 코드와 유사하게 동작한다.

(실제로 더 많은 기능을 제공한다.)

ac.getBean(DiscountPolicy.class)

 

스프링 빈 조회에서 학습했듯이 타입으로 조회하면, 선택된 빈이 2개 이상일 때 문제가 발생한다.

DiscountPolicy의 하위 타입인 FixDiscountPolicy, RateDiscountPolicy 둘 다 스프링 빈으로 선언해보자.

@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}

 

그리고 이렇게 의존관계 자동 주입을 실행하면

@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

 

오류메세지가 친절하게도 하나의 빈을 기대했는데 fixDiscountPolicy, rateDiscountPolicy 2개가 발견되었다고 알려준다.

이때 하위 타입으로 지정할 수도 있지만, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다. 

그리고 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결히 안 된다.

스프링 빈을 수동 등록해서 문제를 해결해도 되지만, 의존 관계 자동 주입에서 해결하는 여러 방법이 있다.

다음 시간에 의존 관계 자동 주입에서 해결하는 방법에 대해 알아보자!