일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- java
- 스프링 핵심 기능
- Exception
- jpa
- SpringBoot
- Greedy
- 인프런
- http
- 자바
- db
- JDBC
- 백준
- Servlet
- 스프링
- 스프링 핵심 원리
- 김영한
- spring
- kotlin
- JPQL
- Android
- pointcut
- AOP
- Proxy
- QueryDSL
- 그리디
- 알고리즘
- springdatajpa
- transaction
- Spring Boot
- Thymeleaf
- Today
- Total
목록인프런 (528)
개발자되기 프로젝트
1. 정리 지금까지 우리는 변하는 코드와 변하지 않는 코드를 분리했다. 템플릿 메서드 패턴, 전략 패턴, 그리고 템플릿 콜백 패턴까지 진행하면서 변하는 코드와 변하지 않는 코드를 분리했다. 그리고 최종적으로 템플릿 콜백 패턴을 적용하고 콜백으로 람다를 사용해서 코드 사용도 최소화 할 수 있었다. 2. 한계 지금까지 설명한 방식의 한계는 아무리 최적화를 해도 결국 로그 추적기를 적용하기 위해서 원본 코드를 수정해야 한다는 점이다. 클래스가 수백개이면 수백개를 더 힘들게 수정하는가 조금 덜 힘들게 수정하는가의 차이가 있을 뿐, 본질적으로 코드를 다 수정해야 하는 것은 마찬가지이다. 지금부터 원본 코드를 손대지 않고 로그 추적기를 적용할 수 있는 방법을 알아보자. 그러기 위해서 프록시 개념을 먼저 이해해야 한..
1. Callback public interface TraceCallback { T call(); } 2. TraceTemplate TraceTemplate 는 템플릿 역할을 한다. execute(..) 를 보면 message 데이터와 콜백인 TraceCallback callback 을 전달 받는다. 제네릭을 사용했다. 반환 타입을 정의한다. public class TraceTemplate { private final LogTrace trace; public TraceTemplate(LogTrace trace) { this.trace = trace; } public T execute(String message, TraceCallback callback){ TraceStatus status = null; ..
Context --> Template Strategy --> Callback 1. Callback 인터페이스 public interface Callback { void call(); } 2. TimeLogTemplate template는 호출할 callback을 전달 받는다. 전달된 callback은 클라이언트 코드 쪽에서 실행되는 것이 아니라 template 안에서 실행됨. 템플릿 콜백 패턴은 전략 패턴과 모든 것이 동일한데 전략을 익명 내부 클래스로 정의해서 사용한다. @Slf4j public class TimeLogTemplate { public void execute(Callback callback){ long startTime = System.currentTimeMillis(); //비즈니스 로..
ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부분은 파라미터로 넘어온 Strategy의 코드를 실행해서 처리한다. 이렇게 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 Callback이라 한다. 템플릿 콜백 패턴은 전략 패턴의 변형으로, 스프링의 3대 프로그래밍 모델 중 하나인 DI(의존성 주입)에서 사용하는 특별한 형태의 전략 패턴이다. 템플릿 콜백 패턴은 전략 패턴과 모든 것이 동일한데 전략을 익명 내부 클래스로 정의해서 사용한다는 특징이 있다. 1. Callback 정의 프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉..
이전에는 Context 필드에 Strategy를 주입해서 사용했다. 이번에는 전략을 실행할 때 직접 파라미터로 전달해서 사용해보자. 1. ContextV2 ContextV2 는 전략을 필드로 가지지 않는다. 대신에 전략을 execute(..) 가 호출될 때 마다 항상 파라미터로 전달 받는다. /** * 전략을 마라미터로 전달 받는 방식 */ @Slf4j public class ContextV2 { public void execute(Strategy strategy){ long startTime = System.currentTimeMillis(); //비즈니스 로직 시행 strategy.call(); //비즈니스 로직 종료 long endTime = System.currentTimeMillis(); lon..
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); con..
1. 전략 패턴 동일한 문제를 전략 패턴을 통해 해결해 보자. 탬플릿 메서드 패턴은 부로 클래스에 변하지 않는 템플릿을 두고, 변하는 부분으 자식 클래스에 두어서 상속을 사용하여 문제르 해결함. 전략 패턴은 변하지 않는 부분을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 구현하도록 하여 문제를 해결함. 상속아 아니라 위임으로 문제를 해결하는 것. 전략 패턴에서 Context는 변하지 않는 Template 역할을 하고, Strategy는 변하는 알고리즘 역할을 한다. 2. GOF 디자인 패턴에서 정의한 전략 패턴의 의도 알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할..
GOF 디자인 패턴에서는 템플릿 메서드 패턴을 다음과 같이 정의했다. 템플릿 메서드 디자인 패턴의 목적은 다음과 같습니다. "작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다." [GOF] 부모 클래스에 알고리즘의 골격인 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에 정의하는 것이다. 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있다. 결국 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것이다. 하지만 템플릿 메서드 패턴은 상속을 사용한다. 따라서 상속에서 오는 단점들을 그대로 안고간다. 특히 자식 클래..