템플릿 콜백 패턴 - 시작

앞서 본 ContextV2 는 전략 패턴에서 변하지 않는 템플릿 부분 이었음.

여기서 Strategy를 콜백이라는 용어로 지칭할 수도 있다. 다른 함수에 인자로 넘겨주는 보통 실행가능한 코드를 콜백이라고 함.

콜백의 호출 시점은 콜백을 받아간 함수가 결정함. 콜백을 넘겨준 클라이언트가 결정하지 않는다.

김영한님은 콜백을, 함수가 클라이언트 뒤(back)에서 호출(콜) 되기 때문에 콜백이라고 표현하심. 이것도 맞는 말 같은데?

자바 8이전에서는 익명 내부클래스로 콜백을 넘겨주곤 했다고 함. 전략패턴에서 살펴본 예제가 바로 그것임. 람다가 나오면서 콜백을 보내기 더 쉬워졌다.

사실 “템플릿 콜백 패턴” 은 스프링에서 만든 단어임. 앞서 살펴본 파라미터로 Strategy 를 넘겨주는 전략 패턴을 특별히 “템플릿 콜백” 패턴이라고 따로 부른다.

스프링에서 xxxTemplate 같은 클래스가 있으면 대부분 다 템플릿 콜백 패턴을 사용한 것임.

그래서 이전에 만든 패턴에서 이름만 바꾸면 됨. Context대신에 Template, Strategy대신에 Callback이라고만 하면 일반적으로 스프링에서 사용하는 템플릿 콜백 패턴이 됨.

템플릿 콜백 패턴 - 적용

package hello.advance.trace.callback;

import hello.advance.trace.TraceStatus;
import hello.advance.trace.logtrace.LogTrace;

public class TraceTemplate {

    private final LogTrace trace;

    public TraceTemplate(LogTrace trace) {
        this.trace = trace;
    }

    public <T> T execute(String message, TraceCallback<T> callback) {
            TraceStatus status = null;
            try{
                status = trace.begin(message);
                // 로직 호출
                T result = callback.call();
                trace.end(status);
                return result;
            } catch (Exception e) {
                trace.exception(status, e);
                throw e;
            }
    }
}

내가 이전에 혼자 만든 전략 패턴과 제네릭 사용까지 완전히 동일하다. 어쩌면 패턴화 되어있을지도…