[Spring] 7-6. 조회 빈이 전부 필요할 때

송광호·2024년 1월 9일

[Spring]

목록 보기
33/41
post-thumbnail

Spring 시리즈는 혼자 공부하며 기록으로 남기고, 만약 잘못 학습 한 지식이 있다면 공유하며 피드백을 받고자 작성합니다.
스프링에 대해 깊게 공부해보고자 인프런의 김영한 강사님께서 강의를 진행하시는 (스프링 핵심 원리 - 기본편) 강의를 수강하며 정리하는 글입니다.
혹여나 글을 읽으시며 잘못 설명된 부분이 있다면 지적 부탁드리겠습니다.


조회한 빈이 전부 필요할 때

  • 의도적으로 해당 타입의 스프링 빈이 다 필요한 경우도 있다.
  • 예를들면 할인 서비스를 제공할 때 할인의 종류(rate, fix)를 선택할 수 있도록 한다고 가정해보자.
  • 스프링을 사용하면 간단하게 전략 패턴을 구현할 수 있다.//(디자인패턴을 알긴하지만 대부분 까먹었기에 예시를 들어주시면서 디자인 패턴의 이름도 말씀해주시는 점이 너무 마음에 든다)

코드

임시로 사용할 DiscountService

public class AllBeanTest {

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

        public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policyList) {
            this.policyMap = policyMap;
            this.policyList = policyList;
            System.out.println("policyMap = " + policyMap);
            System.out.println("policyList = " + policyList);
        }

        public int discount(Member member, int price, String discountCode) {
            DiscountPolicy discountPolicy = policyMap.get(discountCode);
            return discountPolicy.discount(member, price);
        }
    }
}
  • 먼저 테스트에서 사용할 DiscountService 를 만들자.
  • 생성자가 하나라서 @Autowired를 생략해도 되고 @RequiredArgsConstructor를 사용해도 된다.
  • 그치만 우린 생성될때 불러온 빈을 찍어볼 예정이기때문에 생성자를 사용하여 출력하는 코드를 추가해보자

테스트 코드

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

        Assertions.assertThat(discountService).isInstanceOf(DiscountService.class);
        Assertions.assertThat(discount).isEqualTo(1000);

        int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
        Assertions.assertThat(rateDiscountPrice).isEqualTo(2000);
    }
}
  • 강의가 뭔가 후딱 지나가서 이해가 잘 안갔지만 천천히 리뷰를 해보면서 파고들어가보자.
  • 일단 스프링 컨테이너에 AutoAppConfig, DiscountService를 등록한다.
  • 컨테이너에서 DiscountService를 찾아오고, 새로운 멤버를 하나 만들어준다.
  • 자 여기서 discountService.discount(member, 10000, ,"fixDiscountPolicy") 이부분이 핵심이다.
    일단 한번 테스트코드를 돌려보고 실행결과에서 출력값을 찾아보자.

출력

policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@7e11ab3d, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@5fa47fea}

policyList = [hello.core.discount.FixDiscountPolicy@7e11ab3d, hello.core.discount.RateDiscountPolicy@5fa47fea]
  • DiscountPolicy의 하위타입들이 스프링빈에 등록되어져있다.
  • "fixDiscountPolicy"가 키값으로 설정되어있어 policyMap.get("fixDiscountPolicy")으로 해당 구현체를 받아올 수 있다.
  • "rateDiscountPolicy"도 마찬가지로 discountCode의 파라미터로 넘기면 해당하는 구현체를 받아온다.
  • 이런식으로 전략 패턴을 간단하게 구현할 수 있다.

0개의 댓글