[Spring] Bean이 여러 개 조회 - NoUniqueBeanDefinitionException

[Spring] Bean이 여러 개 조회 - NoUniqueBeanDefinitionException

728x90

에러 내역

"expected single matching bean but found *"빈을 주입할 때 여러개의 빈이 조회가 되면 에러가 발생한다.

해결 방법은 3가지가 있다.

@Autowired 필드명

@Qualifier

@Primary

@Autowired 필드명

@Autowired에서 여러 빈이 매칭되면, 필드의 이름으로 매칭한다.

변경 전 변경 후

변경전 코드에서 DiscountPolicy가 여러개 매칭되어 문제가 발생하였다. DiscountPolicy의 필드명 discountPolicy를 매칭할 빈의 이름으로 변경을 해준다면 문제가 해결된다.

@Qualifier

@Qualifier은 구분할 수 있는 조건을 하나 더 추가하는 방법이다.

겹치는 빈 1 겹치는 빈 2

겹쳐지는 빈들 대상으로 @Qualifier을 사용하여 추가적인 이름을 붙여 준다.

필드 앞에 @Qualifier 추가

필드 앞에 @Qualifer을 추가하여 어떤 빈을 사용할 것인지 적어준다.

@Primary

@Primary는 우선순위를 지정하는 방법이다. 여러 빈이 매칭될 때 @Primary가 붙은 빈이 사용된다.

@Primary를 붙인 모습

겹치는 빈 중에서 많이 쓰는 빈이 있다면 @Primary를 붙이고 적게 사용하는 빈은 그 외의 방법을 사용하면 된다.

RateDiscountPolicy를 90% 사용하고 FixDiscountPolicy를 10% 정도 사용하면 @Primary를 RateDiscount에 사용하고 그 외의 경우에는 @Qualify나 혹은 @Autowired가 붙은 생성자의 필드에 이름을 지정하는 식으로 사용하면 된다.

@Primary를 사용하면 @Qualify보다 작성해야 하는 코드가 줄어들기 때문에 간단하다는 장점이 있다.

728x90

from http://sdardew-valley.tistory.com/133 by ccl(A) rewrite - 2021-12-07 14:27:19