Spring :: bean 충돌 해결 방법

숑숑·2022년 1월 28일
0

Spring

목록 보기
9/11
post-thumbnail

0. 가정 코드

  • DiscountPolicy (interface)
    - rateDiscountPolicy
    - fixDiscountPolicy

위와 같이 인터페이스와 구현체가 있고,
모두 스프링 빈으로 등록한 상태다.

@Autowired
private DiscountPolicy discountPolicy

그리고 위 코드로 호출을 했을 때,
충돌이 난다고 가정한다.

1. @Autowired 필드명 매칭

@Autowired
private DiscountPolicy rateDiscountPolicy

위와 같이, 구현체의 이름을 필드명으로 한다면 그에 해당하는 빈을 찾는다.

2. @Qualifier

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

구현체마다 Qualifier를 지정한다.
실제로 빈의 이름을 바꾸는 것이 아닌, 단순 식별자라는 것에 유의한다.

3. @Primary

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}

@Component
public class FixDiscountPolicy implements DiscountPolicy {}

특정 구현체에 우선권을 부여한다.


@Qualifier vs @Primary?

@Autowired 필드명을 통한 구현체 지정은 DIP를 위반하므로 논외

우선 순위
@Qualifier로 특정 구현체를 지정했지만,
@Primary를 지정한 구현체가 별도로 있는 경우,

-> @Qualifier로 지정한 구현체가 우선권을 가진다.

권장 사용법
메인 구현체를 @Primary,
가끔 쓰는 구현체를 @Qualifier로 지정해주는 것이 편하다.

profile
툴 만들기 좋아하는 삽질 전문(...) 주니어 백엔드 개발자입니다.

0개의 댓글