728x90
반응형
2023.05.19 - [SpringBoot] - Spring Basic- DI(의존 관계) 자동 주입
2023.05.22 - [SpringBoot] - Spring Basic- DI(의존 관계) 자동 주입 2
주제: 조회하는 빈이 모두 필요할 때 어떻게 할까? + 총 정리
조회하는 빈이 모두 필요한 경우
@Autowired는 타입(Type)으로 조회를 한다.
그렇기 때문에, 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 생긴다.
이를 해결하기 위한 방법들을 전 시간에 알아보았다.
이번 시간에는 선택된 모든 빈들이 필요한 경우에는 어떻게 해야할까?
List와 Map 문법을 사용하자!
앞선 게시글에서 사용했던 예시와 마찬가지로 DiscountPolicy(할인 정책) 인터페이스의 하위 타입인 FixDiscountPolicy와 RateDiscountPolicy 를 예시로 사용하겠다.
예를 들어, 소비자가 두 개의 할인 정책 중에서 선택을 할 수 있다고 가정해보자.
//예시를 위해 임의로 만든 함수
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
// 스프링 컨테이너 생성, 해당 클래스들을 스프링 빈으로 등록
DiscountService discountService = ac.getBean(DiscountService.class);
// DiscountService의 빈들을 discountService 객체에 할당
Member member = new Member(1L, "userA", Grade.VIP);
// Member 클래스 객체 생성에 필요한 파라미터 값들은 (id, username, 등급)으로 설정함
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
// 두개의 할인 정책 중에서 fixDiscountPolicy로 결정
// fix 대신에 rateDiscountPolicy로 바꿔도 무방
// AutoAppConfig.class, DiscountService.class 를 파라미터로 넘기면서 해당 클래스들을 자동으로 스프링 빈으로 등록
// AutoAppConfig 는 @Configuration, @Componentscan을 사용하여 클래스들 간 의존관계를 형성하는 클래스이다.
static class DiscountService {
// DiscountPolicy에 있는 두개의 빈들을 Map,List에 할당
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
}
//Map에서 discountCode로 받아온 fixDiscountPolicy 빈을 찾아서 return해주는 로직
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
다형성을 활용한 이러한 로직들을 통해서 동적으로 빈을 골라 사용 가능하게 되었다.
총 정리
- 편리한 자동 기능을 기본으로 사용하자!
- 수동 빈 등록은 AOP를 처리할 때나 DB Connect, 공통 로그 처리와 같은 업무에 사용하자!
- 위와 같이 다형성을 적극 활용할 때는 한 눈에 파악하기 쉽도록 수동 빈을 사용하거나 관련된 특정 패키지를 묶자!
- 생성자 주입을 사용하자!
- 롬복 라이브러리를 잘 활용하자!
- 상황에 맞는 애노테이션을 잘 찾아서 사용하자!
다음 게시글
Bean LifeCycle CallBack
728x90
반응형
'Spring' 카테고리의 다른 글
Spring Basic- Bean Scope(웹 스코프) (0) | 2023.06.10 |
---|---|
Spring Basic- Bean Scope(프로토타입 스코프) (0) | 2023.06.09 |
Spring Basic- Bean LifeCycle CallBack (0) | 2023.05.24 |
Spring Basic- DI(의존 관계) 자동 주입 2 (0) | 2023.05.22 |
Spring Basic- DI(의존 관계) 자동 주입 (0) | 2023.05.19 |