GOF의 디자인패턴에 속한 것은 아니다. 전략 패턴의 일종으로 스프링 내부에서 자주 사용된다.
JDBC템플릿, Rest템플릿, 트랜잭션템플릿, 레디스템플릿등 뒤에 템플릿붙어있으면 템플릿콜백패턴이 사용된거다.
콜백이란 다른 코드의 인수로서 넘겨주는 실행 가능한 코드다.
이전 전략패턴에서 콘텍스트가 템플릿 역할을 하고 전략부분이 콜백으로 넘어온다.
복잡하지만 바뀌지 않는 일정한 패턴을 갖는 작업 흐름이 존재하고 그 중 일부분만 자주 바꿔서 사용해야 하는 경우에 적합
전략 패턴의 기존 구조에 익명 내부 클래스 활용
전략 패턴의 컨텍스트를 템플릿 익명 내부 클래스로 만들어지는 오브젝트를 콜백이라고 부름
템플릿은 어떤 목적을 위해 미리 만들어둔 모양이 있는 틀을 가리킴
프로그래밍에서는 고정된 틀 안에 바꿀수있는 부분을 넣어서 사용하는 경우 템플릿이라고함
템플릿 메소드는 고정된 틀의 로직을 가진 템플릿 메소드를 슈퍼클래스의 두고 바뀌는 부분을 서브클래스의 메소드에 둠
콜백은 실행되는 것을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트를 말함
파라미터로 전달되지만 값을 참조하기 위한 것이 아니라 특정 로직을 담은 메소드를 실행시키기 위해 사용
자바에서는 메소드 자체를 파라미터로 전달할 방법은 없어서 메소드가 담긴 오브젝트를 전달해야함
public interface Callback {
void call();
}
@Slf4j
public class TimeLogTemplate {
public void execute(Callback callback) {
long startTime = System.currentTimeMillis();
//비즈니스 로직 실행
callback.call();
//비즈니스 로직 종료
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("resultTime={}", resultTime);
}
}
@Test
void CallbackV2() {
TimeLogTemplate template = new TimeLogTemplate();
template.execute(() -> log.info("비즈니스 로직1 실행"));
template.execute(() -> log.info("비즈니스 로직2 실행"));
}
별도의 클래스를 만들어도 되지만 콜백을 사용하면 익명 내부 클래스나 람다를 사용하는 것이 편리하다.