Free Lines Arrow
본문 바로가기
Spring/spring 기초 스터디

[Spring] 조회한 빈을 선택해서 사용할때

by skahn1215 2021. 5. 24.
728x90
반응형

빈을 선택해서 사용하기

앞서 조회된 Bean이 2개 일때 둘중 하나만 쓰도록 변경하였다.

만약 사용자가 선택해서 쓰고 싶다면 어떻게 구현을 해야 될까?

 

 

Map과 List를 활용해보자

package hello.core.autowired;

import hello.core.AutoAppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Grade;
import hello.core.member.Member;

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;

import static org.assertj.core.api.Assertions.assertThat;

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 discountPrice =  discountService.discount(member, 10000, "fixDiscountPolicy");

        assertThat(discountService).isInstanceOf(DiscountService.class);
        assertThat(discountPrice).isEqualTo(1000);


        int rateDiscountPrice =  discountService.discount(member, 20000, "rateDiscountPolicy");
        assertThat(rateDiscountPrice).isEqualTo(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;
            this.policies = policies;
            System.out.println("policyMap = " + policyMap);
            System.out.println("policies = " + policies);

        }

        public int discount(Member member, int price, String discountCode) {
            System.out.println(discountCode);
            DiscountPolicy discountPolicy = policyMap.get(discountCode);
            return discountPolicy.discount(member, price);
        }
    }

}

 

 

 

 

 

하나씩 뜯어가면서 살펴보자

findAllBean

    @Test
    void findAllBean() {
        // 둘다 AutoAppConfig.class와 직접 DiscountService를 빈으로 등록한다.
        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);

        // 등록된 bean을 가져온다.
        DiscountService discountService = ac.getBean(DiscountService.class);
        
        // member를 입력해준다.
        Member member = new Member(1L,"UserA", Grade.VIP);
        
        // fix는 무조건 10퍼센트 할인율 이므로
        // 등급에 관계없이 1000이 나와야한다.
        int discountPrice =  discountService.discount(member, 10000, "fixDiscountPolicy");

        assertThat(discountService).isInstanceOf(DiscountService.class);
        assertThat(discountPrice).isEqualTo(1000);
        
        // rate는 고객등급이 VIP 일 경우 10퍼센트 할인 이므로 
        // 역시 2000d원이 나와야 한다.
        int rateDiscountPrice =  discountService.discount(member, 20000, "rateDiscountPolicy");
        assertThat(rateDiscountPrice).isEqualTo(2000);

    }

 

DiscountService

    static class DiscountService {
        private final Map<String, DiscountPolicy> policyMap;
        private final List<DiscountPolicy> policies;

        @Autowired
        // 여기가 중요하다. 주입을 해줄때 다음과 같은 형식으로 동작한다.
        // policyMap 으로 모든 빈을 map에 담는다.
        // policies 로 모든 빈을 리스트에 담는다.
        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);

        }


        // map에서 bean이름을 꺼내와 discountPolicy를 사용자가 선택하게 해주었다.
        public int discount(Member member, int price, String discountCode) {
            System.out.println(discountCode);
            DiscountPolicy discountPolicy = policyMap.get(discountCode);
            return discountPolicy.discount(member, price);
        }
    }
728x90
반응형

'Spring > spring 기초 스터디' 카테고리의 다른 글

[Spring] Bean Callback  (0) 2021.05.29
[Spring] Bean 생명주기  (0) 2021.05.26
[Spring] 조회된 빈이 2개일때 No qualifying bean  (0) 2021.05.23
[Spring] Lombok  (0) 2021.05.23
[Spring] 의존성 주입방법 2  (0) 2021.05.17

댓글