Back-End/Spring
[Spring] 의존관계 자동 주입 - 조회한 빈이 모두 필요할 때, List, Map
달의 조각
2022. 3. 21. 21:35
이 글은 김영한 님의 스프링 핵심 원리 - 기본편(https://inf.run/ZtdV)을 수강하며 정리한 글입니다.
할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정한다.
💡 AllBeanTest
@Test
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
//할인이 얼마나 되는지 확인하는 서비스
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
assertThat(discountPrice).isEqualTo(1000); //할인 금액이 1000원이어야 한다
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
assertThat(rateDiscountPrice).isEqualTo(2000);
}
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies; //List는 단순 테스트를 위해 만들어 보았다.
@Autowired
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
//Map, List의 출력 형태
policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@4044fb95, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@aa549e5}
policies = [hello.core.discount.FixDiscountPolicy@4044fb95, hello.core.discount.RateDiscountPolicy@aa549e5]
- 스프링 컨테이너에 DiscountService만 넣으면 Map과 List은 비어 있다.
- AutoAppConfig를 넣어 주어야 컴포넌트 스캔이 되면서 주입이 된다. (fixDiscountPolicy, rateDiscountPolicy)
- discount 메서드에서 매개변수 discountCode로 넘어 온 값을 Key로 하는 Value(스프링 빈)을 Map에서 꺼낸다.
- Map: 키에 스프링 빈의 이름을 넣어 주고, 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아 준다.
- List: 타입으로 조회한 모든 스프링 빈을 담는다. 해당하는 타입의 스프링 빈이 없으면, 빈 컬렉션이나 Map을 주입한다.
🌳 스프링 컨테이너를 생성하면서 스프링 빈 등록하기
new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);
- new AnnotationConfigApplicationContext()를 통해 스프링 컨테이너를 생성한다.
- 클래스를 파라미터로 넘기면서 해당 클래스를 자동으로 스프링 빈으로 등록한다.
스프링 컨테이너를 생성하면서, 동시에 클래스를 스프링 빈으로 자동으로 등록한다.