2023. 8. 1. 13:51ㆍSpring/[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가 우선순위가 더 높다.
☆ 참고
'Spring > [inflearn]스프링 핵심 원리 - 기본편' 카테고리의 다른 글
조회한 빈이 모두 필요한 경우 (List, Map) (0) | 2023.08.01 |
---|---|
애노테이션 직접 만들기 (0) | 2023.08.01 |
롬복을 통한 코드 최적화 (0) | 2023.08.01 |
생성자 주입을 사용하는 이유 (0) | 2023.08.01 |
옵션 처리 (0) | 2023.07.31 |