노션으로 다시 돌아갔습니다 😅

@Autowired 사용할 때 빈 이름 중복 매칭 문제 - @Qualifier, @Primary

by mignon25

@Autowired 로 자동 의존관계 주입 시,

(생성자 주입이 아무래도 가장 많이 사용될 것이다.)

생성자의 파라미터의 타입과 매칭되는 클래스를 찾아서 스프링 컨테이너에 등록한다. 

(해당 타입 포함 하위 타입 모두 조회)

그러다보면 필연적으로 타입이 같은 클래스가 존재하여 중복이 발생할 수 있고, 스프링은 어떤 클래스를 대상으로 DI 를 진행해야 할지 결정할 수 없어서 에러가 발생하게 된다. 

 

이러한 중복 문제를 해결하는 방법에 대해 살펴보자. 

 

1. @Autorired 필드 명 매칭

@Autoried 는 타입 매칭을 시도하고, 이 때 여러 빈이 있으면, 필드 이름 또는 파라미터 이름으로 빈 이름을 추가 매칭한다.

 

 

2. @Qualifier 사용

  • @Qualifier 는 추가 구분자를 붙여주는 방법이다. 
  • 주입시 추가적인 방법을 제공하지만 빈 이름을 변경하는 것은 아니다.

 

빈 등록시 @Qualifier 를 붙여준다.

@Component
@Qualifier("mainDiscountPolicy") 
public class RateDiscountPolicy implements DiscountPolicy {}


@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}

 

의존관계 주입 시 @Qualifier 를 붙여주고 등록한 이름을 적어준다.

(생성자 자동 주입 시 예시)

@Component
public class OrderServiceImpl implements OrderService{

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

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

 

@Qualifier 로 주입 대상을 특정했는데  @Qualifier("mainDiscountPolicy") 라는 애너테이션을 못찾으면 어떻게 될까?

=> 이 때는 mainDiscountPolicy 라는 이름의 스프링 빈을 추가로 찾는다.

=> 하지만, @Qualifier 는 @Qualifier 를 찾는 용도로만 사용하는 것이 명확하고 좋다. 

 

 

Qualifier 정리

  1. @Qualifier 끼리 매칭
  2. 빈 이름 매칭
  3. NoSuchBeanDefinitionException 예외 발생

 

 

3. @Primary 사용

  • 우선순위를 정하는 방법.
  • @Autowired 시에 여러 빈이 매칭되면 @Primary 가 붙어있는 클래스가 우선권을 가진다.  
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}

 

 

@Qualifier 와 @Primary 의 활용

  • 주로 사용되는 스프링 빈에 대해서는 좀 더 간편한 @Primary 를 활용하고,
  • 가끔 사용되는 스프링 빈에 대해 사용할 때마다 명시적으로 @Qualifier 를 지정하는 방식으로 사용

 

우선순위

  • 직접 특정해주는 @Qualifier 가 @Primary 보다 우선권이 높다. 

'Spring' 카테고리의 다른 글

[AOP] Pointcut  (0) 2023.04.12
조회한 빈이 모두 필요할 때 - List, Map 사용  (0) 2023.04.12
AOP의 용어  (0) 2023.04.11
의존관계 주입 시 옵션 처리  (0) 2023.04.09
객체 지향 설계 원칙 - SOLID  (0) 2023.04.09

블로그의 정보

Mignon'S Dev Log

mignon25

활동하기