Spring/스프링 핵심 원리 - 기본편
[의존 관계 자동 주입] 해당 타입의 스프링 빈 모두 조회 - List & Map
alsruds
2023. 12. 26. 03:18
🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard
- 클라이언트가 할인의 종류 (rate, fix) 를 선택하는 경우
TEST
✅ Map<String, DiscountPolicy> : 모든 DiscountPolicy 주입 (스프링 빈 이름 : DiscountPolicy 타입으로 조회된 스프링 빈)
✅ List<DiscountPolicy> : 해당 DiscountPolicy 타입의 모든 스프링 빈 조회
1. Map & List 로 스프링 빈 조회하는 로직 개발
· test/java/hello.core/autowired/AllBeanTest
public class AllBeanTest {
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;
this.policies = policies;
System.out.println("policyMap = " + policyMap);
System.out.println("policies = " + policies);
}
// 넘어온 String 에 따라 Map 에서 해당 타입의 스프링 빈을 찾아 실행
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
}
2. 테스트 코드 작성
public class AllBeanTest {
@Test
void findAllBean() {
// 1. 스프링 컨테이너 생성 + 스프링 빈 자동 등록
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
// 2. 회원, 할인 정책 변수 생성 (스프링 빈 조회)
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
// 3. 검증
assertThat(discountService).isInstanceOf(DiscountService.class);
assertThat(discountPrice).isEqualTo(1000);
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
assertThat(rateDiscountPrice).isEqualTo(2000);
}
...
}
✔️ DiscountService.discount()
- discountCode 로 "fixDicsountPolicy" 넘어옴 (or "rateDiscountPolicy")
- map 에서 fixDiscountPolicy 스프링 빈 실행
(+) 해당 타입의 스프링 빈이 없을 시, 빈 컬렉션이나 Map 주입