본문 바로가기
Spring

[Spring] @Qualifier, @Primary

by happyhelen 2021. 12. 7.

 

 

** 공유가 아닌 개인 공부에 목적을 둔 글입니다

** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다

 

 

 

 

@Autowired 로 의존관계 주입시 여러 빈이 찾아져서 매칭되려고 할 때 스프링이 에러를 뱉게 된다

 

이 문제는 어떻게 해결할까

 

 

@Qualifier

 

@Qualifier 은 추가 구분자로서 빈을 구분하는 역할을 하지 빈 이름 자체를 변경하는 것이 아니다

 

빈을 등록할 때 @Qualifier 로 이름을 정해주고, 생성자 주입시나 수정자 주입시, 필드 주입시 등 다양한 주입에서

 

활용할 수 있다

 

아래 예시를 보자

 

 

RateDiscountPolicy 클래스에 @Qualifier 구분자 어노테이션을 추가해줌으로써 "mainDiscountPolicy"라는 이름으로

 

해당 빈을 추가적으로 구분할 수 있게 되었다

 

 

 

원래 DiscountPolicy 인터페이스를 구현한 구현체가 Rate, Fix 두 개가 있어서 어느 빈을 가져와야 하는지 불명확했지만

 

Qualifier 어노테이션을 통해 명확히 Rate 구현체를 주입할 수 있게 되었다

 

우선 Qualifier 끼리 매칭을 시도하고, 실패하면 빈 이름과 매칭을 시도하는데 그냥 Qualifier 끼리 매칭하도록 쓰는 것이

 

좋다


 

@Primary

Primary 는 우선순위를 정해주는 방법이다

 

여러 빈들 중에 @Primary 가 있는 빈이 우선적으로 의존관계 주입된다

 

 

 

RateDiscountPolicy 에 @Primary 를 붙이면 이 빈이 우선순위를 갖고 가장 먼저 매칭된다

 

 

코드에 변경할 사항은 없다

 


실무에서 사용할 때는 메인 db 의 스프링 빈은 @Primary 를 붙여서 빈을 조회할 때 따로 @Qualifier 로 찾을 필요 없이

 

편하게 조회하고,

 

서브 db 빈을 조회할 때는 @Qualifier 를 지정해서 명확하게 지정하는 방식으로 사용한다

 

이 둘의 우선순위는 Qualifier 가 Primary 보다 우선한다