티스토리 뷰

Map, List를 이용하면 스프링 빈에 등록되어 있는 구현체들을 조회할 수 있다.

이를 통해 다형성 있는 프로그램을 작성해보자.

 

먼저, Map과 List에 스프링 빈에 담긴 구현체를 모두 가져오는 방법은 다음과 같다.

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);
}

출력해보면,

Type이 일치하는 구현체들(DiscountPolicy라는 interface를 구현하고, 스프링 빈에 등록되어 있는 애들)이 모두 담겨져 나온다.

 

 

이것을 활용하면 다형성 있는 코드를 작성할 수 있다.

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);
        }


        public int discount(Member member, int amount, String discountCode) {
            DiscountPolicy discountPolicy = policyMap.get(discountCode);
            return discountPolicy.discount(member, amount);
        }
}
    @Test
    public void findAllBean(){

        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);

        DiscountService discountService = ac.getBean(DiscountService.class);
        Member member = new Member(1L, "userA", Grade.VIP);
        int discount = discountService.discount(member, 20000, "rateDiscountPolicy");
        Assertions.assertThat(discount).isEqualTo(2000);
    }

Test 코드를 보면 클라이언트가 discountPolicy를 원하는 대로 선택할 수 있다. (rate discount 혹은 fixed discount)

그리고 위에 있는 discount( ) 코드는 discountPolicy가 rate discount 인지 아니면 fixed discount 인지 몰라도 된다. 다시 말해 interface 인 discountPolicy만 알고 있는 채로 작업을 수행한다. 다형성이 지켜진 코드다. 이는 Map에 등록되어 있는 bean 정보를 불러오고, bean 이름과 클라이언트의 argument 이름을 일치시켰기에 가능했다.

 

이처럼 List, Map과 스프링 bean을 활용하면 다형성 있는 코드를 작성할 수 있다~!

 

사진, 내용 출처 : 인프런, 김영한 강사님의 '스프링 핵심 원리 - 기본편' 강좌, 강의자료

https://inf.run/TErf

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함