조회 대상 빈이 2개 이상일 때 해결 방법을 하나씩 살펴본다.
1. @Autowired 필드명 매칭
# @Autowired 필드명 매칭 : 타입 매칭 시도 후 여러 빈이 있을 때, 필드명, 파라미터명으로 빈 이름 매칭하는 기능
기존 코드)
@Autowired
private DiscountPolicy discountPolicy;
필드명을 빈 이름으로 변경)
@Autowired
private DiscountPolicy rateDiscountPolicy;
필드명이 rateDiscountPolicy 이므로 정상 주입된다.
2. @Qualifier 사용
# @Qualifier : 추가 구분자를 붙여, 주입시 추가적인 방법을 제공 (빈 이름 변경 X)
@Qualifier 끼리 매칭 -> 빈 이름 매칭 -> NoSuchBeanDefinitionException 예외 발생
1) 빈 등록시 @Qualifier 붙이기
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
2) 주입시 @Qualifier 붙이고, 등록한 이름 적어주기
생성자 자동 주입 예시)
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
수정자 자동 주입 예시)
@Autowired
public DiscountPolicy setDiscountPolicy(@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
필드 주입에도 사용 가능하다.
@Qualifier 로 주입할 때, @Qualifier("mainDiscountPolicy") 를 못찾으면 mainDiscountPolicy 라는 이름의 스프링 빈을 추가로 찾는다.
하지만 @Qualifier 는 @Qualifier 를 찾는 용도로만 사용하는게 명확하고 좋다.
직접 빈 등록시 @Qualifier 를 동일하게 사용 가능하다.
@Bean
@Qualifier("mainDiscountPolicy")
public DiscountPolicy discountPolicy() {
return new ...
}
3. @Primary 사용
# @Primary : @Autowired 에서 여러 빈 매칭 시, 우선권을 가지게 함
rateDiscountPolicy 가 우선권을 가지도록 한다.
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
사용 코드)
// 생성자
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
// 수정자
@Autowired
public DiscountPolicy setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
코드 실행시 문제 없이 @Primary 가 잘 동작한다.
4. 어떤 방법을 사용할까?
@Qualifier 의 단점은 주입 받을 때 모든 코드에 @Qualifier 를 붙여주어야 한다.
반면에 @Primary 사용시 @Qualifier 같은 것을 붙일 필요 없이 코드가 간단해진다.
1) @Primary, @Qualifier 함께 활용
자주 쓰는 메인 데이터베이스 커넥션을 획득하는 스프링 빈 vs 특별한 기능으로 가끔 쓰는 서브 데이터베이스 커넥션을 획득하는 스프링 빈
메인 DB 커넥션 획득 스프링 빈 : @Primary
-> 조회하는 곳에서 별다른 설정 없이 편리하게 조회
서브 DB 커넥션 획득 스프링 빈 : @Qualifier
-> @Qualifier 지정하여 명시적으로 획득
이 때, 메인 DB 커넥션 획득 스프링 빈도 @Qualifier 로 지정해도 상관 없다.
우선순위)
@Qualifier > @Primary
@Primary 는 기본값처럼 동작
@Qualifier 는 상세하게 동작
스프링은 자동보다 수동이, 넓은 범위 선택권보다 좁은 범위 선택권이 우선 순위가 높다.
따라서 @Qualifier 가 우선권이 높다.
참고링크 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8?cid=325969
스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의
현재 평점 5.0점 수강생 49,567명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 스프링 기본 기능, 스프
www.inflearn.com
'강의 실습 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| 조회한 빈이 모두 필요할 때, List, Map (0) | 2026.04.30 |
|---|---|
| 어노테이션 직접 만들기 - @Qualifier 재정의 (0) | 2026.04.29 |
| 조회 빈이 2개 이상 - 문제 (0) | 2026.04.27 |
| 롬복과 최신 트랜드 (0) | 2026.04.27 |
| 생성자 주입을 선택해라! (0) | 2026.04.26 |
댓글