본문 바로가기
spring/스프링

조회 빈이 2개 이상 문제, Qualifer/Primary, Annotation만들기

by ddanss 2023. 3. 12.
728x90

@Autowired는 Type으로 조회함

타입으로 조회하면 선택된 빈이 2개 이상일때 문제가 발생.

@Component
public lass FixDiscountPolicy implements DiscountPolicy {}

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

//의존관계 주입
@Autowired
private DiscountPolicy discountPolicy
//오류발생
//NoUniqueBeanDefinitionException - 2개의 빈이 발견됨

 

조회 대상 빈이 2개 이상일때 해결방법

1. @Autowired 필드명 매칭

2. @Qualifier -> @Qalifier끼리 매칭 -> 빈이름 매칭

3. @Primary사용

 

@AutoWired 필드명 매칭

- 타입 매칭을 시도

- 타입 매칭의 결과가 2개 이상일 때 필드명, 파라미터명으로 빈 이름을 추가 매칭

 

@Qualifer사용

- @Qualifer는 추가 구분자를 붙여주는 방법. 주입시 추가적인 방법을 제공하는 것이지 빈 이름을 변경하는 것은 아님

- @Qualifier 끼리 매칭

- 빈 이름 매칭

- 정의되어 있지 않으면 NoSuchBeanDefinitionException 예외 발생

- @Qualifier는 @Qualifier를 찾는 용도로만 사용하는게 명확하고 좋음

 

@Primary사용

- 우선순위를 정하는 방법

- @Autowired시에 여러 빈이 매칭되면 @Primary가 우선권을 가짐

 

 

@Qualifer, Primary활용법

- 자주 사용하는 메인 데이터 베이스의 커넥션 빈을 획득하는 스프링 빈은 @Primary를 적용해서 조회하는 곳에서 @Qualifere지정없이 편리하게 조회하고

- 특별한 기능으로 가끔 사용하는 서브 데이터베이스 커넥션 빈을 획득할 때는 @Qualifer를 지정해서 명시적으로 획득하는 방식으로 사용하면 

- 코드를 깔끔하게 유지할 수 있음

- 메인 데이터베이스의 스프링빈을 등록할때 @Qualifer를 지정해주는 것은 상관없음

- 스프링은 자동보다는 수동이, 넓은 범위의 선택권 보다는 좁은 범위의 선택권이 우선순위가 높아서 @Primary보다 @Qualifer의 우선권이 높다

 

 

 

Annotation을 직접 만드는건

https://shinsunyoung.tistory.com/83

이분의 블로그를 보니 이해하기 좋았다

반응형

댓글