-
Spring 기본 27 - 조회한 빈이 모두 필요할 때, List,MapFrameWork/Spring&Spring-boot 2023. 11. 28. 14:50
조회한 빈이 모두 필요할 때, List,Map
의도적으로 정말 해당 타입의 스프링 빈이 다 필요한 경우도 있다.
예를 들어서 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate,fix)를 선택할 수 있다고 가정해 보자. 스프링을 사용하면 소위 말하는 전략 패턴을 매우 간단하게 구현할 수 있다.
AllBeanTest
package com.hello.core.autowired; import com.hello.core.AutoAppConfig; import com.hello.core.discount.DiscountPolicy; import com.hello.core.member.Grade; import com.hello.core.member.Member; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; import java.util.Map; public class 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 fixDiscountPrice = discountService.discount(member,10000,"fixDiscountPolicy"); int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy"); Assertions.assertInstanceOf(DiscountService.class,discountService); Assertions.assertEquals(fixDiscountPrice,1000); Assertions.assertEquals(rateDiscountPrice,2000); } static class DiscountService{ private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; System.out.println("policyMap = " + policyMap); this.policies = policies; System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy policy =policyMap.get(discountCode); return policy.discount(member,price); } } }
로직 분석
- DiscountService는 Map으로 모든 `DiscountPolicy`를 주입받는다. 위 코드에서는 `fixDiscountPolicy`, `rateDiscountPolicy`가 주입된다.
- 위 Test 클래스 안에 만든 DiscountService의 `discount()`메서드는 discountCode String타입의 파라미터로 "fixDiscountPolicy"가 넘어오면 `fixDiscountPolicy` 스프링 빈(객체 인스턴스)를 찾아서 실행한다. 물론 "rateDiscountPolicy"가 넘어오면 `rateDiscountPolicy` 스프링 빈을 찾아 서 실행한다.
주입분석
- `Map<String, DiscountPolicy>` : map의 키에 스프링 빈이름을 넣어주고, 그 값으로 `DiscountPolicy`타입으로 조회한 모든 스프링 빈을 담아준다.
- `List<DiscountPolicy>` : `DiscountPolicy` 타입으로 조회한 모든 스프링 빈을 담아준다.
- 만약 해당하는 타입의 스프링 빈이 없으면, 빈 컬렉션이나 Map을 주입한다.
[출처 - 스프링 핵심 원리 - 기본편]
'FrameWork > Spring&Spring-boot' 카테고리의 다른 글
Spring 기본 29 - 빈 생명주기 콜 (1) 2023.11.29 Spring 기본 28 - 자동, 수동 올바른 실무 운영 기준 (1) 2023.11.28 Spring 기본 26 - 애노테이션 직접 만들기 (0) 2023.11.22 Spring 기본 25 - 조회 빈 2개 이상(@Autowired필드 명,@Quilifier,@Primary) (1) 2023.11.22 Spring 기본 24 - 롬복과 최신 트렌드 (0) 2023.11.21