자바/스프링(Spring)

스프링 빈 중복 조회 해결법

류창 2021. 12. 22. 00:32
반응형

 

 

스프링에서 빈을 생성하다보면, 중복 조회대는 경우가 종종있다.

 

 

 

예시를 하나 들어보자.

 

평소에 이용하는 할인정책 1번과 가끔 이벤트 성으로 쓰는 할인정책 2번이 동시에 Bean을 등록하면 어떡할까?

 

잘 설계된 스프링 구조는  Interface 할인정책을 호출을하면, 

1번과 2번 할인정책이 동시에 호출이된다.

 

 

스프링은 1번 할인정책을 사용할지? 2번 할인정책을 사용할지 몰라서 오류를 뱉는다.

이걸 해결하는 방법이 3가지가 존재한다.

 

 

1. @AutoWired 파라미터 이름 설정

2. @Quilfier 사용

3. @Primary 사용

 

이 코드를통해 살펴볼것이다.

 

 

1. AutoWried 파라미터 이름 설정

 

 

DiscountPolicy의 파라미터를  rateDiscountPolicy로 직접 선언해주는방법이있다.

 

 

@AutoWired는 탐색하는 순서가있다.

 

1. 먼저 타입으로 탐색한다. (DiscountPolicy)

-> 중복 빈이 존재하면 필드명으로 탐색한다.

 

2.필드로 탐색한다. (rateDiscountPolicy)

 

이를 통해서, 중복을 해결할수가 있다. 하지만 그렇게 좋지못한방법이다.

 

DIP에 위반하는 방식이다.

DIP: 의존관계 역전 법칙 (Dependancy Inversion Principle)

 

현재 이 방식은 구현체에 의존하고 있으므로, 되도록이면 상위 인터페이스를 의존하는 방식이 좋다.

 

따라서 아래와 같은 방식을 더 추천한다.

2.Quilfier 사용

 

 

Qualifier로 설정하는법이있다.

 

quailifer로 "MainDiscount" 이름을 설정해준다.  이 이름을 설정하면,

 

내가 사용할 할인정책에다가 @Qualifier로  "MainDiscount"로 설정한다.

 

쉽게생각해서  Qualifier -> Qualifier 로 연결시켜준다라고 이해하면 쉽다.

 

 

 

3.@Primary 설정

 

 

가장 많이 사용하는 방법이다. 이 방법의 놀라운점은 아무것도 손을 안댄상태에서

 

중복되는 빈에서 내가 자주쓸 빈을 @Primary 를 통해 우선순위를 달아주면 끝이다.

 

원본은 그대로 냅둔다.

 

 

 

 

그래서 무엇을쓸까?

 

Qualifier 과  Primary 두 방법을 활용해서 사용하는걸 추천한다.

 

평소에 자주 쓰는 구현체를 @Primary를 지정해놓다가,

 

가끔 다른 구현체를 사용할때는 @Qualifier을 활용해서 지정설정을 해주면된다.

 

아예, 자주 쓰는 구현체에다가도 @Qualifer를 설정하는방법도 나쁘지않는방법이다.

 

반응형