본문 바로가기
강의 실습/스프링 핵심 원리 - 기본편

@Autowired 필드 명, @Qualifier, @Primary

by jint 2026. 4. 28.

조회 대상 빈이 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

댓글