본 게시물은 김영한 선생님의 강의를 학습하며 작성하였습니다.
- 두 개의 컴포넌트 annotation을 달 경우에 아래와 같은 에러 문구가 뜬다.
하나의 빈을 기대했는데 2개가 나왔다고 알려준다!!
하위 타입으로 짖어할 수도 있는데, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어진다. 그리고 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 해결이 안된다.
스프링 빈을 수동 등록해서 문제를 해결해도 되지만, 의존 관계 주입에는 해결하는데 다양한 방법이 있다.
조회 대상 빈이 2개 이상일 때 해결 방법
@Autowired
필드 명 매칭@Qualifier
→@Qualifier
끼리 매칭 → 빈 이름 매칭@Primary
사용
@Autowired 필드 명 매칭
- autowired는 처음에 타입 매칭을 하고, 여러 빈이 있으면 이름,파라미터 이름으로 빈 이름을 추가 매칭한다.
@Qualifier
- 주입받을 때 모든 코드에
@Qualifier
를 붙여주어야 하는 단점이 있다. - 반면에
@Primary
는 굳이 더 붙일 필요가 없다.
활용
코드에서 자주 사용하는 메인 데이터베이스의 커넥션을 스프링 빈이 있고, 코드에서 특별한 기능으로 가끔 사용하는 서브 데이터베이스의 커넥션을 획득하는 스프링 빈이 있다고 생각해보자. 메인 데이터베이스의 커넥션을 획득하는 스프링 빈은 @Primary
를 적용해서 조회하는 곳에서 @Qualifier
지정 없이 편리하게 조회하고, 서브 데이터베이스 커넥션 빈을 획득할 때는 @Qualifier
를 지정해서 명시적으로 획득 하는 방식으로 사용하면 코드를 깔끔하게 유지할 수 있다. 물론 이때 메인 데이터베이스의 스프링 빈을 등록할 때 @Qualifier
를 지정해주는 것은 상관없다.
“우선순위”
@Primary
는 기본 값 처럼 동작하는 것이고,@Qualifier
는 매우 상세하게 동작한다. 이런 경우 어떤 것이 우선권을 가져갈까? 스프링은 자동보다는 수동이, 넓은 범위의 선택권 보다는 좁은 범위의 선택권이 우선순위가 높다. 따라서 여기서도@Qualifier
가 우선권이 높다.
'Backend > Spring' 카테고리의 다른 글
[Spring MVC] 로깅(Logging) (0) | 2024.04.01 |
---|---|
[섹션 7] 롬북과 최신 트랜드 (0) | 2024.03.18 |
[섹션 7] 생성자 주입을 선택해라 (0) | 2024.03.18 |
[섹션 7] 옵션 처리 (0) | 2024.03.18 |
[섹션 7]의존관계 자동 주입 - 다양한 의존관계 (0) | 2024.03.18 |