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
- kotlin
- QueryDSL
- transaction
- 스프링 핵심 기능
- db
- SpringBoot
- Spring Boot
- 김영한
- http
- java
- 백준
- jpa
- Android
- JDBC
- Greedy
- pointcut
- 그리디
- spring
- 인프런
- 스프링
- 스프링 핵심 원리
- JPQL
- Proxy
- Thymeleaf
- Exception
- Servlet
- springdatajpa
- 자바
- 알고리즘
- AOP
Archives
- Today
- Total
개발자되기 프로젝트
Strategy Pattern - 2, 익명 내부 클래스 본문
1. 익명 내부 클래스 사용 Test
/**
* 익명 내부 클래스
*/
@Test
void strategyV2(){
Strategy strategyLogic1 = new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직1 실행");
}
};
ContextV1 context = new ContextV1(strategyLogic1);
context.execute();
Strategy strategyLogic2 = new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직2 실행");
}
};
ContextV1 context2 = new ContextV1(strategyLogic2);
context2.execute();
}
20:35:01.104 [main] INFO hello.advanced.trace.strategy.ContextV1Tet - 비즈니스 로직1 실행
20:35:01.107 [main] INFO hello.advanced.trace.strategy.code.strategy.ContextV1 - resultTime = 8
20:35:01.118 [main] INFO hello.advanced.trace.strategy.ContextV1Tet - 비즈니스 로직2 실행
20:35:01.118 [main] INFO hello.advanced.trace.strategy.code.strategy.ContextV1 - resultTime = 0
2. 생성자에 바로 넣기.
@Test
void strategyV3(){
ContextV1 context = new ContextV1(new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직1 실행");
}
});
context.execute();
ContextV1 context2 = new ContextV1(new Strategy() {
@Override
public void call() {
log.info("비즈니스 로직2 실행");
}
});
context2.execute();
}
3. 람다식 사용하기
- 람다식은 익명 내부클래스로 구성됨.
@Test
void strategyV4(){
ContextV1 context = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
context.execute();
ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행"));
context2.execute();
}
- 익명 내부 클래스를 자바8부터 제공하는 람다로 변경할 수 있다.
- 람다로 변경하려면 인터페이스에 메서드가 1개만 있으면 되는데,
- 여기에서 제공하는 Strategy 인터페이스는 메서드가 1개만 있으므로 람다로 사용할 수 있다.
4. 정리
- 지금까지 일반적으로 이야기하는 전략 패턴에 대해서 알아보았다.
- 변하지 않는 부분을 Context 에 두고 변하는 부분을 Strategy 를 구현해서 만든다.
- 그리고 Context 의 내부 필드에 Strategy 를 주입해서 사용했다.
5. 선 조립 후 실행
- 여기서 이야기하고 싶은 부분은 Context 의 내부 필드에 Strategy 를 두고 사용하는 부분이다.
- 이 방식은 Context 와 Strategy 를 실행 전에 원하는 모양으로 조립해두고,
그 다음에 Context 를 실행하는 선 조립, 후 실행 방식에서 매우 유용하다. - Context 와 Strategy 를 한번 조립하고 나면 이후로는 Context 를 실행하기만 하면 된다.
- 우리가 스프링으로 애플리케이션을 개발할 때 애플리케이션 로딩 시점에
의존관계 주입을 통해 필요한 의존관계를 모두 맺어두고 난 다음에 실제 요청을 처리하는 것 과 같은 원리이다. - 이 방식의 단점은 Context 와 Strategy 를 조립한 이후에는 전략을 변경하기가 번거롭다는 점이다.
- 물론 Context 에 setter 를 제공해서 Strategy 를 넘겨 받아 변경하면 되지만,
- Context 를 싱글톤으로 사용할 때는 동시성 이슈 등 고려할 점이 많다.
- 그래서 전략을 실시간으로 변경해야 하면 차라리 이전에 개발한 테스트 코드 처럼
Context 를 하나더 생성하고 그곳에 다른 Strategy 를 주입하는 것이 더 나은 선택일 수 있다. - 이렇게 먼저 조립하고 사용하는 방식보다 더 유연하게 전략 패턴을 사용하는 방법을 없을까?
6. GitHub : 211122 Strategy Pattern - 2
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
Template CallBack - 시작 (0) | 2021.11.22 |
---|---|
Strategy Pattern - 3 (0) | 2021.11.22 |
Strategy Pattern - 1 (0) | 2021.11.22 |
Template Method - 정의 (0) | 2021.11.22 |
Template Method - 적용2 (0) | 2021.11.22 |
Comments