🧐강의🧐
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 주입
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[빈 스코프] 스코프 종류(싱글톤, 프로토타입, 웹) & 지정 방법 (0) | 2024.01.01 |
---|---|
[빈 생명주기 콜백] 스프링 빈 생명주기 콜백 지원하는 방법 3가지 - 인터페이스, 설정 정보, 애노테이션 (0) | 2023.12.29 |
[의존 관계 자동 주입] @Qualifer 타입 체크 문제 해결하기 - 애노테이션 직접 생성 (0) | 2023.12.25 |
[의존 관계 자동 주입] 조회할 빈이 2개 이상일 때 (4) | 2023.12.22 |
[의존 관계 자동 주입] Lombok 적용하는 방법 (0) | 2023.12.20 |