이 글은 김영한 님의 스프링 핵심 원리 - 기본편(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]
- 스프링 컨테이너에 DiscountService만 넣으면 Map과 List은 비어 있다.
- AutoAppConfig를 넣어 주어야 컴포넌트 스캔이 되면서 주입이 된다. (fixDiscountPolicy, rateDiscountPolicy)
- discount 메서드에서 매개변수 discountCode로 넘어 온 값을 Key로 하는 Value(스프링 빈)을 Map에서 꺼낸다.
- Map: 키에 스프링 빈의 이름을 넣어 주고, 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아 준다.
- List: 타입으로 조회한 모든 스프링 빈을 담는다. 해당하는 타입의 스프링 빈이 없으면, 빈 컬렉션이나 Map을 주입한다.
🌳 스프링 컨테이너를 생성하면서 스프링 빈 등록하기
new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);
- new AnnotationConfigApplicationContext()를 통해 스프링 컨테이너를 생성한다.
- 클래스를 파라미터로 넘기면서 해당 클래스를 자동으로 스프링 빈으로 등록한다.
스프링 컨테이너를 생성하면서, 동시에 클래스를 스프링 빈으로 자동으로 등록한다.
'Back-End > Spring' 카테고리의 다른 글
[Spring] 빈 스코프 - 프로토타입 스코프, 싱글톤 빈과 함께 사용 시 Provider 이용하기 (0) | 2022.03.26 |
---|---|
[Spring] 빈 생명주기 콜백 (0) | 2022.03.26 |
[Spring] 의존관계 자동 주입 - 애노테이션 직접 만들기 (0) | 2022.03.21 |
[Spring] 의존관계 자동 주입 - 조회 빈이 2개 이상일 때: @Autowired 필드 명, @Qualifier, @Primary (0) | 2022.03.21 |
[Spring] 의존관계 자동 주입 방법 (0) | 2022.03.20 |
댓글