조회 빈이 2개 이상인 경우

2023. 8. 1. 13:51Spring/[inflearn]스프링 핵심 원리 - 기본편

-> @Autowired는 타입으로 조회한다. 따라서 ac.getBean(~.class)와 유사하게 동작한다.

-> 타입으로 조회할 때 빈이 2개 이상이라면 문제가 발생한다.

-> 문제 상황을 확인하기 위해 DiscountPolicy의 하위타입인 RateDiscountPolicy와 FixDiscountPolicy를 모두 스프링 빈으로 선언한다.

- 두 클래스에 @Component를 붙여 테스트를 실행해본다.

-> 실행하면 아래와 같은 에러로그가 나타난다.

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'practice.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy

-> fixDiscountPolicy, rateDiscountPolicy 2개가 발견되었다고 나온다.

 

◎ 해결방법

-> 다음은 조회할 빈이 2개 이상인 경우에 대한 해결방법이다.

-> @Autowired 필드명 매칭

-> @Qualifier를 통한 빈이름 매칭

-> @Primary 사용

 

◎ @Autowired 필드명 매칭

-> @Autowired는 타입매칭을 시도하고, 이 과정에서 여러 개의 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 매칭한다.

-> 필드명이 rateDiscountPolicy로 정상 주입된다.

-> 필드명 매칭은 타입 매칭을 먼저 시도하고 중복이 있을 때 추가로 동작하는 기능이다.

 

◎ @Quailfier를 통한 빈이름 매칭

-> 추가 구분자를 붙여주는 방법이다. 

-> 주입 시 @Qualifier를 붙이고 등록한 이름을 적는다.

 

◎ @Primary 사용

-> 우선순위를 정하는 방법이다. @Autowired 시 여러 빈이 매칭되면 @Primary가 우선권을 가진다.

 

◎ @Primary vs @Qualifier

-> @Primary는 기본값 처럼 동작하고 @Qualifier는 상세하게 동작한다. 스프링은 자동 보다 수동이 우선순위가 높고, 넓은 범위의 선택권 보다 좁은 범위의 선택권이 우선순위가 높다. 따라서 @Qualifer가 우선순위가 더 높다.

 

☆ 참고

[인프런]스프링 핵심 원리 - 기본편