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 주입