Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SQLSTATE=42705
- 재귀멤버
- 요청매핑
- git
- 요약
- getChannel()
- MSSQL
- SQL
- 진경혜
- 스프링
- transferTo
- renameTo
- HWPF
- 배치
- spring
- XACT_STATE
- java
- 앵커멤버
- 자바
- 홈스쿨링
- XWPF
- 튜닝
- TRANCOUNT
- 디스패처서블릿
- 함수
- 아이
- ERROR_MESSAGE
- 프론트컨트롤러
- dm_exec_requests
- 교육법
Archives
- Today
- Total
필기노트
Spring 조회한 빈이 모두 필요할 때, Map으로 담는다. 본문
반응형
예를 들어서 할인 서비스를 제공하는데, 클라이언트가 할인의 종류(rate, fix)를 선택할 수 있다고 가정해보자.
스프링을 사용하면 소위 말하는 전략 패턴을 매우 간단하게 구현할 수 있다.
주입 분석
public class AllBeanTest {
@Test
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(FixDiscountPolicy.class, RateDiscountPolicy.class, DiscountService.class);
}
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
@Autowired
public DiscountService(Map<String, DiscountPolicy> policyMap) {
this.policyMap = policyMap;
System.out.println("policyMap = " + policyMap);
}
}
}
결과
policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@2fd953a6
, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@a4add54}
• new AnnotationConfigApplicationContext() 를 통해 스프링 컨테이너를 생성한다.
• FixDiscountPolicy, RateDiscountPolicy, DiscountService.class 를 파라미터로 넘기면서 해당 클래스를 스프링 빈으로 등록한다.
• Map<String, DiscountPolicy> : map의 키에 스프링 빈의 이름을 넣어주고, 그 값으로 DiscountPolicy 타입으로 조회한 모든 스프링 빈을 담아준다.
로직분석
public class AllBeanTest {
@Test
void findAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(FixDiscountPolicy.class, RateDiscountPolicy.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "Jun", Grade.VIP);
int FixDiscountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
Assertions.assertThat(FixDiscountPrice).isEqualTo(1000);
int RateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
Assertions.assertThat(RateDiscountPrice).isEqualTo(2000);
}
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
public DiscountService(Map<String, DiscountPolicy> policyMap) {
this.policyMap = policyMap;
System.out.println("policyMap = " + policyMap);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
System.out.println("discountCode = " + discountCode);
System.out.println("discountPolicy = " + discountPolicy);
return discountPolicy.discount(member, price);
}
}
}
• DiscountService는 Map으로 모든 DiscountPolicy 를 주입받는다. 이때 fixDiscountPolicy , rateDiscountPolicy 가 주입된다.
• discount () 메서드는 discountCode로 "fixDiscountPolicy"가 넘어오면 map에서 fixDiscountPolicy 스프링 빈을 찾아서 실행한다. 물론 “rateDiscountPolicy”가 넘어오면 rateDiscountPolicy 스프링 빈을 찾아서 실행한다.
REFERENCE
반응형
'김영한 강의 요약' 카테고리의 다른 글
Spring DispatcherServlet(FrontController 패턴) 코드로 이해하기 (0) | 2023.08.09 |
---|---|
MVC패턴에서 JSP 실무 간단 요약 (0) | 2023.08.04 |
Spring 롬복 (0) | 2023.01.15 |
Spring 스프링 빈을 등록하는 2가지 방법과 의존관계 (0) | 2023.01.14 |
Spring 싱글톤 방식의 주의점 (0) | 2023.01.14 |
Comments