전략패턴을 이용한 의존관계 주입(DI)

sarah·2022년 8월 29일
0

spring

목록 보기
1/6
post-thumbnail

[전략 패턴(Strategy Pattern)]
같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴

예를 들어서 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정해보자. => Map, List 타입의 빈주입

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 discountPrice1 = discountService.discount(member, 10000, "fixDiscountPolicy");
        Assertions.assertThat(discountPrice1).isEqualTo(1000);

        int discountPrice2 = discountService.discount(member, 20000, "rateDiscountPolicy");
        Assertions.assertThat(discountPrice2).isEqualTo(2000);


    }

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

        public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
            this.policyMap = policyMap;
            this.policies = policies;
        }

        public int discount(Member member, int price, String discountCode) {
            DiscountPolicy discountPolicy = policyMap.get(discountCode);

            System.out.println("discountCode = " + discountCode);
            System.out.println("discountPolicy = " + discountPolicy);

            return discountPolicy.discount(member, price);
        }
    }
}
  • 스프링 컨테이너를 생성하면서 스프링 빈 등록하기

    • 스프링 컨테이너는 생성자에 클래스 정보를 받는다. 여기에 클래스 정보를 넘기면 해당 클래스가 스프링 빈으로 자동 등록된다.
    • 위의 코드에서 컨테이너가 동시에 AutoAppCongif, DiscountService 를 스프링 빈으로 자동 등록한다.
  • 주입분석

    • Map<String, DiscountPolicy> : map의 키에 스프링 빈의 이름을 넣고, 그 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아준다.
    • List<DiscountPolicy> : DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아준다.
    • 만약 해당하는 타입의 스프링 빈이 없으면, 빈 컬렉션이나 Map을 주입한다.
  • 로직분석

    • DiscountService 는 Map으로 DiscounstPlicy를 주입받는다. 이때, fixDiscountPolicy, rateDiscountPolicy가 주입된다.
    • discount() 메서드는 discountCode로 받은 스프링 빈의 이름으로 map에서 해당 빈을 찾는다. 그리고 그 빈의 discount() 메서드를 실행한다.

0개의 댓글