[스프링 핵심원리 기본편] 7.7 조회한 빈이 모두 필요할 때 : List, Map

코린이서현이·2023년 11월 14일
0

😢들어가면서😢

원하는 타입의 스프링을 모두 가져오는 메소드를 기억하시나요? 기억이 날랑말랑합니다
⬇️ 아래를 보시오.
조회한 빈이 모두 필요할 때 List나 Map으로 조회하는 방법에 대해서 알아보도록 하자.
  @Test
  @DisplayName("부모 타입으로 모두 조회하기")
  void findAllBeanByParentType() {
    Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
    assertThat(beansOfType.size()).isEqualTo(2);

    for (String key : beansOfType.keySet()) {
      System.out.println("key = " + key + "value = " + beansOfType.get(key));
    }
  }

📌 조회한 빈이 모두 필요할 때 : List, Map

```java
public class AllBeanTest {
  @Test
  void findAllBean() {
    ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);

    //TDD?
    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;
    
    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) {
      DiscountPolicy discountPolicy = policyMap.get(discountCode);
      return discountPolicy.discount(member, price);
    }
  }


}

💻 실행화면
➡️ 둘 다 등록되는 것을 관찰 할 수 있다.

policyMap = {
	fixDiscountPolicy=hellospring.demo.discount.FixDiscountPolicy@64712be,
    rateDiscountPolicy=hellospring.demo.discount.RateDiscountPolicy@53499d85}

policies = [
	hellospring.demo.discount.FixDiscountPolicy@64712be,
	hellospring.demo.discount.RateDiscountPolicy@53499d85]

로직 분석

    ApplicationContext ac = new
    	AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
  1. DiscountService는 Map으로 모든 DiscountPolicy 를 주입받는다.
    이때 fixDiscountPolicy , rateDiscountPolicy 가 주입된다.

  2. discount() 메서드는 discountCode로 "fixDiscountPolicy"가 넘어오면 map에서"fixDiscountPolicy" 스프링 빈을 찾아서 실행한다. 물론 “rateDiscountPolicy”가 넘어오면 rateDiscountPolicy 스프링 빈을 찾아서 실행한다.

주입 분석

  • Map<String, DiscountPolicy> : map의 키에 스프링 빈의 이름을 넣어주고, 그 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아준다.
  • List<DiscountPolicy> : DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아준다.

만약 해당하는 타입의 스프링 빈이 없으면, 빈 컬렉션이나 Map을 주입한다.

😩마무리하면서😩

번아웃이 너무 금방 오는거 아닐까?
profile
24년도까지 프로젝트 두개를 마치고 25년에는 개발 팀장을 할 수 있는 실력이 되자!

0개의 댓글