[Spring] @Qualifier, @Primary

[Spring] @Qualifier, @Primary

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

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

@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 보다 우선한다

from http://programming-hyerim.tistory.com/77 by ccl(A) rewrite - 2021-12-07 15:01:07