본문 바로가기

SPRING/Spring

[스프링| 스프링 핵심 원리 | 기본편 | 의존관계 자동 주입] 조회한 빈이 모두 필요할 때 List, Map / 수동 빈

public class AllBeanTest {

    @Test
    void findAllBean() {
        // ApplicationContext를 생성하고, AutoAppConfig와 DiscountService 클래스를 기반으로 Spring 컨테이너를 설정합니다.
        ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
        // 컨테이너에서 DiscountService 타입의 빈을 가져옵니다.
        DiscountService discountService = ac.getBean(DiscountService.class);
        // 새로운 Member 인스턴스를 생성합니다. ID는 1L, 이름은 "userA", 등급은 VIP입니다.
        Member member = new Member(1L, "userA", Grade.VIP);
        // discountService를 사용하여 할인 가격을 계산합니다. 원래 가격은 10000원, 할인 정책은 "fixDiscountPolicy"입니다.
        int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
        // discountService 객체가 DiscountService 클래스의 인스턴스인지 확인합니다.
        assertThat(discountService).isInstanceOf(DiscountService.class);
        // 계산된 할인 가격이 1000원과 일치하는지 확인합니다.
        assertThat(discountPrice).isEqualTo(1000);
    }
    
    static class DiscountService {
        // DiscountPolicy 타입의 객체를 문자열 키와 연결하여 저장하는 Map을 선언합니다.
        private final Map<String, DiscountPolicy> policyMap;
        // DiscountPolicy 객체의 리스트를 저장합니다.
        private final List<DiscountPolicy> policies;
        
        public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
            // 생성자에서 policyMap과 policies를 초기화합니다.
            this.policyMap = policyMap;
            this.policies = policies;
            // policyMap의 내용을 콘솔에 출력합니다.
            System.out.println("policyMap = " + policyMap);
            // policies 리스트의 내용을 콘솔에 출력합니다.
            System.out.println("policies = " + policies);
        }
        
        public int discount(Member member, int price, String discountCode) {
            // discountCode에 해당하는 DiscountPolicy 객체를 policyMap에서 찾습니다.
            DiscountPolicy discountPolicy = policyMap.get(discountCode);
            // 사용된 discountCode를 콘솔에 출력합니다.
            System.out.println("discountCode = " + discountCode);
            // 찾아진 discountPolicy 객체를 콘솔에 출력합니다.
            System.out.println("discountPolicy = " + discountPolicy);
            // discountPolicy를 사용하여 할인된 가격을 계산하고 반환합니다.
            return discountPolicy.discount(member, price);
        }
    }
}

자동, 수동의 올바른 실무 운영 기준