녕의 학습 기록
[Spring 기본] 의존관계 자동 주입 (3) 본문
♪ 학습 내용
의동일한 타입의 빈이 두개 이상일 경우에 의존관계 자동 주입 / 애노테이션 생성
* 여러 동일 타입 빈
Autowired는 컨테이너에서 빈을 찾아 자동으로 주입해준다는 것을 학습했다.
이때 빈을 찾는 방식은 타입으로 조회이다.
ac.getBean(DiscountPolicy.class);
와 비슷하다.
그렇다면 컨테이너에 동일한 타입의 스프링 빈이 두개 이상이라면 어떻게 될까??
실행 시 오류가 발생한다
어떻게 해결할 수 있을까??
만약 다음과 같이 하위 타입으로, 구현에 의존한다면 오류는 사라질 것이다
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, RateDiscountPolicy discountPolicy) {
...
}
하지만 역할이 아닌 구현에 의존했기 때문에 DIP위배 ..!
이를 해결하기 위한 3가지 방법
1. Autowired필드 명
2. @Qualifier
3. @Primay
* Autowired - 필드명
Autowired는 위와 같이 동일한 타입이 두개 이상 발견될 시에 필드 또는 파라미터 이름으로 추가로 조회 한다.
즉, 타입 매칭을 시도하고 실패하면 필드나 파라미터 명으로 매칭을 다시 한 번 더 시도한다는 것
이를 실행하면 첫번째 타입 매칭에 실패한 이후 이름으로 매칭을 한 결과로
실행 성공 초록색을 볼 수 있다!!!
( 컴포넌트 스캔 시에 앞 글자는 소문자로 bean이름 생성되기 때문에 "r" ateDiscountPolicy )
* @Qualifier
이 @Qualifier 애노테이션을 사용해보고 나서 느낀 점은 html 태그에서 id나 class 선택자를 주는 것과 비슷하다고 느꼈다.
제 2의 이름을 부여하여 구분한달까..?
이렇게 @Qualifier 애노테이션으로 서로를 구분, 괄호 안의 이름을 같게 해주어 연결해주면 자동 주입 성공한다
만약 주입할 때 @Qualifier("mainDiscountPolicy")를 가진 대상을 찾지 못한다면
문자를 이름으로 하는 스프링 빈을 추가로 찾는다고 한다.
하지만 @Qualifier 애노테이션은 @Qualifier 찾는 용도로만 사용하는 것이 적당하고 한다.
* @Primary
가장 우선순위를 두는 애노테이션이다.
위와 같이 @Primary 애노테이션을 붙이면 우선순위를 가지게 됨
따라서 타입 조회 시 여러개가 조회되어도 우선권을 가진 해당 스프링 빈이 매칭된다.
@Qualifier는 모든 코드에 @Qualifier를 붙여주어야하는 단점이 있지만
@Primary 애노테이션은 그럴 필요가 없다는 점에서 편리하당
만약 @Primay와 @Qualifier가 동시에 적용된다면 세세하게 이름을 지정해 매칭하는
@Qualifier가 우선순위를 가진다.
* 애노테이션 만들기
@Qualifier("이름") 할 시에 문자이기 때문에 컴파일 확인이 불가!
→ 애노테이션을 만들어 사용하자 ( 컴파일 체크 가능 / 깔끔 )
실행 시에 정상적으로 돌아감
♪ 다음 학습 내용
조회되는 동일 타입의 빈 중 한가지 고르는 것이 아닌, 모두 필요로 할 경우
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
'Dev > Spring' 카테고리의 다른 글
[Spring 기본] 빈 생명주기 콜백 (0) | 2022.11.22 |
---|---|
[Spring 기본] 의존관계 자동 주입 (4) (0) | 2022.11.20 |
[Spring 기본] 의존관계 자동 주입 (2) (0) | 2022.11.18 |
[Spring 기본] 의존관계 자동 주입 (1) (0) | 2022.11.13 |
[Spring 기본] 컴포넌트 스캔 (2) (0) | 2022.11.12 |