조회 빈이 2개 이상 일때

도도·2023년 3월 22일
0

SPRING

목록 보기
10/14

조회 빈이 2개 이상일 때

  • @Autowired 는 타입(Type) 으로 조회된다.
    타입으로 조회하기 때문에 밑의 코드와 유사하게 동작한다
ac.getBean(DiscountPolicy.class)
  • DiscountPolicy 의 하위 타입이 2개가 스프링 빈으로 등록 되어 있다면

NoUniqueBeanDefinitionException 오류 발생!!!

해결 방법

  • @Autowired 필드 명 매칭
  • @Qualifier ➡️ @Qualifier 끼리 매칭 ➡️ 빈 이름 매칭
  • @Primary 사용

@Autowired 매칭 정리

  1. 타입 매칭
  2. 타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 이름 매칭
// 기존코드 
@Autowired 
public DiscountPolicy discountPolicy

// 필드명으로 빈 이름을 변경
@Autowired
public DiscountPolicy rateDiscountPolicy

@Qualifier 사용

  • 추가 구분자를 붙여주는 방법
  • 주입 시 추가적인 방법을 제공하는 것이지, 빈 이름을 변경하는게 아님
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
  • 주입 시 @Qualifier 를 붙여주고 등록한 이름을 적어 줌

생성자 자동 주입 예시

@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
                         @Qualifier("mainDiscountPolicy") DiscountPolicy
  discountPolicy) {
      this.memberRepository = memberRepository;
      this.discountPolicy = discountPolicy;
}

@Primary 사용

  • @Primary는 우선순위를 정하는 방법
  • @Autowired 시에 여러 빈이 매칭되면 @Primary 가 우선권을 가짐
  @Component
  @Primary
  public class RateDiscountPolicy implements DiscountPolicy {}
  @Component
  public class FixDiscountPolicy implements DiscountPolicy {}

📍 @Qualifier 의 단점은 주입 받을 때 모든 코드에 @Qualifier 를 붙여줘야 한다

@Qualifier 와 @Primary 우선순위

  • @Primary는 기본값 처럼 동작하고
  • @Qualifier는 매우 상세하게 동작
    ➡️ 스프링은 자동보다는 수동이, 넓은 범위의 선택원 보다는 좁은 범위의 선택권이 우선순위가 높다 따라서 @Qualifier가 우선권이 높다

이 게시글은 인프런 김영한님의 스프링 강의를 정리한 글입니다.

profile
공부한것 정리하는 중입니다~

0개의 댓글