스프링에서 빈을 생성하다보면, 중복 조회대는 경우가 종종있다.
예시를 하나 들어보자.
평소에 이용하는 할인정책 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를 설정하는방법도 나쁘지않는방법이다.
'자바 > 스프링(Spring)' 카테고리의 다른 글
스프링 빈 생명주기 (0) | 2021.12.26 |
---|---|
스프링 : 원하는 타입의 빈 복수 조회하기 (0) | 2021.12.22 |
자바 스프링 롬복(lombok) 라이브러리 (0) | 2021.12.21 |
스프링의 다양한 AutoWired (의존관계) 주입법 (0) | 2021.12.19 |
스프링(Spring) 빈 수동등록, 자동등록 하는법 (0) | 2021.10.04 |