본문 바로가기
Back-End/Spring Boot

의존관계 자동 주입 - 조회한 빈이 모두 필요할 때, List, Map

by 달의 조각 2022. 3. 21.
이 글은 김영한 님의 스프링 핵심 원리 - 기본편(https://inf.run/ZtdV)을 수강하며 정리한 글입니다.

 

할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정한다.

 

💡 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(discountPrice).isEqualTo(1000); //할인 금액이 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; //List는 단순 테스트를 위해 만들어 보았다.
    
    @Autowired
    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);
        return discountPolicy.discount(member, price);
    }
}
//Map, List의 출력 형태
policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@4044fb95, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@aa549e5}
policies = [hello.core.discount.FixDiscountPolicy@4044fb95, hello.core.discount.RateDiscountPolicy@aa549e5]
  1. 스프링 컨테이너에 DiscountService만 넣으면 Map과 List은 비어 있다.
  2. AutoAppConfig를 넣어 주어야 컴포넌트 스캔이 되면서 주입이 된다. (fixDiscountPolicy, rateDiscountPolicy)
  3. discount 메서드에서 매개변수 discountCode로 넘어 온 값을 Key로 하는 Value(스프링 빈)을 Map에서 꺼낸다.
  • Map: 키에 스프링 빈의 이름을 넣어 주고, 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아 준다.
  • List: 타입으로 조회한 모든 스프링 빈을 담는다. 해당하는 타입의 스프링 빈이 없으면, 빈 컬렉션이나 Map을 주입한다.

 

🌳 스프링 컨테이너를 생성하면서 스프링 빈 등록하기

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

 

  1. new AnnotationConfigApplicationContext()를 통해 스프링 컨테이너를 생성한다.
  2. 클래스를 파라미터로 넘기면서 해당 클래스를 자동으로 스프링 빈으로 등록한다.

스프링 컨테이너를 생성하면서, 동시에 클래스를 스프링 빈으로 자동으로 등록한다.

댓글