[본 포스팅은 인프런 스프링 핵심 원리 - 기본 편을 기반으로 작성하였습니다.]
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢
www.inflearn.com
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
위의 두 (하위) 타입의 클래스를 스프링 빈으로 등록하고
@Autowired
private DiscountPolicy discountPolicy
부모 타입을 의존 관계 자동 주입을 실행하면 중복 오류가 발생한다.
NoUniqueBeanDefinitionException: No qualifying bean of type
'hello.core.discount.DiscountPolicy' available: expected single matching bean
but found 2: fixDiscountPolicy,rateDiscountPolicy
1. @Autowired 필드 명 매칭
※ 필드 명을 빈 이름으로 변경
@Autowired
private DiscountPolicy rateDiscountPolicy
@Autowired 매칭 정리
- 타입 매칭
- 타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름 매칭
@Qualifier 사용
※ 빈 등록시 @Qualifier를 붙인다.
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
※ 생성자 자동 주입 예시
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Qualifier 정리
- @Qualifier끼리 매칭
- 빈 이름 매칭
- NoSuchBeanDefinitionException 예외 발생
@Primary 사용
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Primary, @Qualifier 활용
메인 데이터베이스의 커넥션을 획득하는 스프링 빈은 @Primary 를 적용해서 조회하는 곳에서 @Qualifier 지정 없이 편리하게 조회하고, 서브 데이터베이스 커넥션 빈을 획득할 때는 @Qualifier 를 지정해서 명시적으로 획득 하는 방식으로 사용하면 코드를 깔끔하게 유지할 수 있다.
※ 우선순위: 수동 + 좁은 범위의 선택권이 우선순위가 높다! (@Qualifier)
@Qualifier의 문제점과 해결법
@Qualifier 문제점: 컴파일시 타입 체크가 안된다.
※ @MainDiscountPolicy 만들기
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,
ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
※ @MainDiscountPolicy 적용
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
'Spring > Basic' 카테고리의 다른 글
빈 스코프 (0) | 2023.08.03 |
---|---|
빈 생명주기 콜백 (0) | 2023.08.02 |
롬복과 최신 트랜드 (0) | 2023.08.02 |
의존관계 자동 주입 (0) | 2023.08.02 |
왜 싱글톤 패턴을 이용하는가? (0) | 2023.08.02 |