@Autowired
에 필요한 과정 복습
1)Component Scan
+@Component
로 객체를 스프링 빈에 등록
2)@Autowired
를 통해 등록된 빈에서 필요한 의존관계를 설정
(우선적으로,타입(Type)
으로 해당빈(Bean)
을 찾는다!)
- 만약,
@Autowired
를 통한 자동 의존관계 주입시 여러개의 빈을 찾는다면?
- 오류가 발생!
- 스프링은 찾은 여러개의 빈(Bean)들 중 어떤 것을 할 기준이 없기 때문
- 여러개의 빈을 찾을 때 해결할 수 있는
3가지 방법
1)@Autowired
필드 명 매칭
2)@Qualifier
3)@Primary
@Autowired
는 우선적으로타입(Type)
으로 빈을 찾지만, 찾지 못하면 필드 이름으로 찾는 특징이 있다.- 내가 의존성 주입을 받는
필드 이름
을구현체의 이름
으로 명시하여 찾게하는 방법
- 필드의 이름을 인터페이스가 아닌 실제 원하는 구현체의 이름으로 적용!
- 이렇게 필드명을 원하는 구현체와 일치시키면 여러개의 빈 찾을 때 해결가능
- 추천하는 방법은 X
:
@Primary
어노테이션을 붙혀서 우선순위를 지정하는 방식
(FixDiscountPolicy.java) - 고정 할인
(RateDiscountPolicy.java) - 비율 할인
FixDiscountPolicy
에@Primary
를 붙혀@Autowired
시 우선적으로 빈을 찾게 하면, 여러개의 빈을 찾을 때 원하는 대로 해결 가능!- 실무에서 많이 사용하는 방법
- 스프링 컨테이너가 여러개의 빈을 찾았을 때, 추가적으로 판단할 수 있는 정보를 주는 원리
- 선택되는 구현체들 / 사용 하는 코드 에
@Qualifier("찾는이름")
을 작성해야 한다.
(FixDiscountPolicy.java) - 고정 할인
@Qualifier("mainDiscountpolicy")
로 등록(RateDiscountPolicy.java) - 비율 할인
@Qualifier("subDiscountpolicy")
로 등록[ 사용하는 코드 ]
@Qualifier("mainDiscountpolicy")
로 추가정보를 지정!
- 기본적인
@Qualifier
사용을 할 때 우리는등록한 이름
을 삽입해줘야 함
--> 오타 발생해도 컴파일딴에서 걸러주지 않는다
-->컴파일 오류(Compile Error)
에서 걸러주는 방식으로 응용 가능!
1) @Qualifier를 포함한 어노테이션 추가
2) 생성한 어노테이션을 구현체에 추가
3) 생성한 어노테이션으로 사용!
@Primray
와@Qualifier
를 적절히 사용하는 것이 가장 이상적
@Primray
는 하나의 구현체만을 사용하게 하는 것@Qualifier
는@Primary
보다 귀찮지만, 디테일하게 접근하고 사용할 수 있음
-->@Primary
보다 우선순위가 높다!
- 예시
: 코드에서 자주 사용하는메인 데이터베이스 커넥션
을 사용하는 빈이 있고, 코드에서 특별한 기능으로 가끔 사용하는서브 데이터에비스의 커넥션
이 있을 때
메인 데이터베이스 커넥션
을 사용하는 빈
-->@Primary
로 기본설정서브 데이터에비스의 커넥션
을 사용하는 빈
-->@Qualifier
지정해서 명시적으로 획득!- 이렇게 하면 깔끔하게 할 수 있다
- 의도적으로 여러개의 빈을 가져와서 동적으로 처리하는 경우가 있기도 하다
- 이 때
Map
/List
를 사용해서 해결할 수 있다.
- 1) 생성자를 통해
DiscountPolicy
타입을 가지는 모든 빈을 Map에 저장- 2) 사용자가
discountCode
로 사용할 구현체를 명시해서 넘겨준다- 3) Map에서
discountCode
에 맞는 구현체를 꺼내서 결과를 return!