같은 타입의 빈이 여러개일 경우? (@Qualifier @Primary)

NNIIE·2022년 9월 2일
0

spring

목록 보기
11/12
post-thumbnail

@Autowired 가 등록된 빈을 찾을 때 동일한 타입의 빈이 2개 이상이라면,
NoUniqueBeanDefinitionException 오류가 발생한다.

해결 방법은 아래와 같다.


필드 명 매칭

@Autowired
private DiscountPolicy fixDiscountPolicy // FixDiscountPolicy 매칭

@Autowired
private DiscountPolicy rateDiscountPolicy // RateDiscountPolicy 매칭
  • 똑같은 타입의 Bean이 2개 이상 조회가 될시 필드 명을 구분하여 매칭을 한다.



@Qaulifier

빈 등록시 @Qualifer("구분자 이름")을 사용하여 추가 구분자를 붙이는 방법이다.

@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, 
						@Qualifier("mainDiscountPolicy") DiscountPolicy iscountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}



@Primary

@Primary 는 우선순위를 정하는 방법이다.
@Autowired 시에 여러 빈이 매칭되면 @Primary 가 우선권을 가진다.

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}

@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
    this.memberRepository = memberRepository;
    this.discountPolicy = discountPolicy;
}



활용

코드에서 자주 사용하는 메인 데이터베이스의 커넥션을 획득하는 스프링 빈이 있고, 코드에서 특별한
기능으로 가끔 사용하는 서브 데이터베이스의 커넥션을 획득하는 스프링 빈이 있다고 생각해보자.
메인 데이터베이스의 커넥션을 획득하는 스프링 빈은 @Primary를 적용해서 조회하는 곳에서
@Qualifier지정 없이 편리하게 조회하고, 서브 데이터베이스 커넥션 빈을 획득할 때는
@Qualifier 를 지정해서 명시적으로 획득 하는 방식으로 사용하면 코드를 깔끔하게 유지할 수 있다.



우선순위?

@Primary 는 기본값 처럼 동작하는 것이고, @Qualifier 는 상세하게 동작한다.
이런 경우 어떤 것이 우선권을 가져갈까?
스프링은 자동보다는 수동이, 넒은 범위의 선택권 보다는 좁은 범위의 선택권이 우선순위가 높다.
따라서 @Qualifier 가 우선권이 높다.

0개의 댓글