녕의 학습 기록

[Spring 기본] 의존관계 자동 주입 (3) 본문

Dev/Spring

[Spring 기본] 의존관계 자동 주입 (3)

kjyyjk 2022. 11. 19. 17:47

 학습 내용 

의동일한 타입의 빈이 두개 이상일 경우에 의존관계 자동 주입 / 애노테이션 생성


* 여러 동일 타입 빈

 

Autowired는 컨테이너에서 빈을 찾아 자동으로 주입해준다는 것을 학습했다.

 

이때 빈을 찾는 방식은 타입으로 조회이다.

 

ac.getBean(DiscountPolicy.class);

와 비슷하다.

 

그렇다면 컨테이너에 동일한 타입의 스프링 빈이 두개 이상이라면 어떻게 될까??

 

실행 시 오류가 발생한다

 

NoUniqueBean예외 터진다
하나를 기대했지만, 조회 시 2개가 조회됨

 

어떻게 해결할 수 있을까??

 

만약 다음과 같이 하위 타입으로, 구현에 의존한다면 오류는 사라질 것이다

 

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, RateDiscountPolicy discountPolicy) {
...
}

 

하지만 역할이 아닌 구현에 의존했기 때문에 DIP위배 ..!

 

이를 해결하기 위한 3가지 방법

 

1. Autowired필드 명

2. @Qualifier

3. @Primay

 

* Autowired -  필드명

 

Autowired는 위와 같이 동일한 타입이 두개 이상 발견될 시에 필드 또는 파라미터 이름으로 추가로 조회 한다.

 

즉, 타입 매칭을 시도하고 실패하면 필드나 파라미터 명으로 매칭을 다시 한 번 더 시도한다는 것

 

파라미터 명을 rateDiscountPolicy로 변경

이를 실행하면 첫번째 타입 매칭에 실패한 이후 이름으로 매칭을 한 결과로

 

실행 성공 초록색을 볼 수 있다!!!

( 컴포넌트 스캔 시에 앞 글자는 소문자로 bean이름 생성되기 때문에 "r" ateDiscountPolicy )

 

* @Qualifier

 

이 @Qualifier 애노테이션을 사용해보고 나서 느낀 점은 html 태그에서 id나 class 선택자를 주는 것과 비슷하다고 느꼈다.

 

제 2의 이름을 부여하여 구분한달까..?

 

RateDiscountPolicy

 

이렇게 @Qualifier 애노테이션으로 서로를 구분, 괄호 안의 이름을 같게 해주어 연결해주면 자동 주입 성공한다

 

만약 주입할 때 @Qualifier("mainDiscountPolicy")를 가진 대상을 찾지 못한다면 

 

문자를 이름으로 하는 스프링 빈을 추가로 찾는다고 한다.

 

하지만 @Qualifier 애노테이션은 @Qualifier 찾는 용도로만 사용하는 것이 적당하고 한다.

 

* @Primary

 

가장 우선순위를 두는 애노테이션이다.

 

Primary 애노테이션으로 RateDiscountPolicy에 우선순위를 두었다

위와 같이 @Primary 애노테이션을 붙이면 우선순위를 가지게 됨

 

따라서 타입 조회 시 여러개가 조회되어도 우선권을 가진 해당 스프링 빈이 매칭된다.

 

@Qualifier는 모든 코드에 @Qualifier를 붙여주어야하는 단점이 있지만 

 

@Primary 애노테이션은 그럴 필요가 없다는 점에서 편리하당

 

 

 

만약 @Primay와 @Qualifier가 동시에 적용된다면 세세하게 이름을 지정해 매칭하는

@Qualifier가 우선순위를 가진다.

 

* 애노테이션 만들기

 

@Qualifier("이름") 할 시에 문자이기 때문에 컴파일 확인이 불가!

 

→ 애노테이션을 만들어 사용하자 ( 컴파일 체크 가능 / 깔끔 )

 

생성
설정

 

 

실행 시에 정상적으로 돌아감

 


 다음 학습 내용 

 

조회되는 동일 타입의 빈 중 한가지 고르는 것이 아닌, 모두 필요로 할 경우

 

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com