반응형
스프링 빈을 조회할 때 메서드 이름 없이 타입으로만 조회하게 되면 스프링 빈이 2개 이상 조회될 수 있는 문제가 있습니다.
@Autowired는 객체의 타입(Type)으로 조회합니다.
@Autowired
private DiscountPolicy discountPolicy
// 위의 코드는
// ac.getBean(DiscountPolicy)와 유사하게 동작합니다
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
// 두 스프링 빈 모두 타입이 DiscountPolicy
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
✔ 타입으로만 조회하게 되면 스프링 빈이 2개 이상 조회될 수 있는 문제가 있습니다.
"NoUniqueBeanDefinitionException" 오류 발생!!
@Autowired
private RateDiscountPolicy discountPolicy
// or
@Autowired
private FixDiscountPolicy discountPolicy
위와 같이 하위 타입으로 지정할 수도 있지만, 하위 타입으로 지정하는 것은 DIP를 위배하고 유연성이 떨어지게 됩니다.
또한, 이름만 다르고, 완전히 똑같은 타입의 스프링 빈이 2개 있을 때 문제가 있습니다.
1. @Autowired 필드 명 매칭
@Autowired는 타입 매칭을 시도하고, 이때 여러 빈이 있으면 필드 이름, 파라미터 이름으로 빈 이름을 추가 매칭해 줍니다.
@Autowired
private DiscountPolicy rateDiscountPolicy
// or
@Autowired
private DiscountPolicy fixDiscountPolicy
✔ 필드 명 매칭은 먼저 타입 매칭을 시도하고, 그 결과에 여러 빈이 있을 때 추가로 동작하는 기능입니다.
@Autowired
1. 타입 매칭
2. 타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름 매칭
2. @Qualifier 사용
@Qualifier는 추가 구분자를 붙여주는 방법입니다. (추가적인 방법을 제공 / 빈 이름을 변경하는 것이 아님)
✔ 빈 등록 시 @Qualifier를 붙이기.
@Component
@Qualifier("mainDiscountPolicy") // 여기!! 추가 구분자 생성
public class RateDiscountPolicy implements DiscountPolicy {}
의존 관계 주입하는 코드 ( 생성자 자동 주입 예시)
@Autowired
public OrderServiceImpl(MemberRepository memberRepository,
@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
※ 주의할 점 ※
@Qualifier로 주입할 때 @QUalifier("mainDiscountPolicy")를 못 찾게 되면 "mainDiscountPolicy"라는 이름의 스프링 빈을 추가로 찾게 됩니다. ( @Qualifier를 찾는 용도로만 사용하는 게 좋습니다.)
3. @Primary 에노테이션 사용하기
✔ @Primary는 우선순위를 정하는 방법입니다. 간단하게 @Autowired 시에 여러 빈이 매칭되면 @Primary가 우선권을 가져 해당 빈이 조회됩니다.
@Component
@Primary // 우선순위 △
public class RateDiscountPolicy implements DiscountPolicy {}
@Component // 우선순위 ▽
public class FixDiscountPolicy implements DiscountPolicy {}
반응형
'Spring Framework > Spring' 카테고리의 다른 글
[Spring Cloud] Eureka Server, Discovery Service 이해하기 (0) | 2024.03.31 |
---|---|
[Spring] Spring CORS 설정 & 이슈 해결 및 웹 애플리케이션 통신 이해하기 (0) | 2024.02.24 |
[SPRING] Spring 객체지향 설계 solid 원칙 이해하기 - Spring Container, IoC, DI (1) | 2024.02.07 |
[Spring] 스프링 파일, 이미지 업로드 / 인스타 이미지 업로드 및 해시태그 파싱하기 - MultipartFile, File (0) | 2023.12.21 |
[Spring] 스프링 싱글톤 컨테이너, 스프링 컨테이너 (0) | 2023.03.28 |