본문 바로가기

스프링

[Spring] 디자인 패턴 - 템플릿 콜백 패턴

참고 1. 스프링-핵심-원리-고급편, 김영한
참고 2. 위키백과

콜백

콜백(함수)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행 혹은 나중에 실행할 수 있다.

이전 글의 전략 패턴에서 Context의 execute를 실행하면, strategy의 call이 실행됐다. 여기서, strategy는 Context 뒤에서 동작하므로, strategy는 콜백에 해당한다.

*스프링 내부에서 자주 보이는 패턴으로, GOF 패턴은 아님.

*스프링에서 "~Template" 형식의 템플릿들은 템플릿 콜백 패턴으로 만들어져 있음.

예시

1. callback 인터페이스 정의

public interface CallBack {
    void call();
}

2. template 정의

public class TimeLogTemplate {

    public void execute(CallBack callBack) {
        long startTime = System.currentTimeMillis();
        callBack.call();
        long endTime = System.currentTimeMillis();
        log.info("result time = {}", endTime - startTime);

    }
}

 

3. template의 execute 실행

public class TemplateCallBackTest {

    @Test
    void callbackV1() {
        TimeLogTemplate template = new TimeLogTemplate();
        template.execute(() -> {
            log.info("로직 1 실행");
        });
        template.execute(() -> {
            log.info("로직 2 실행");
        });

    }
}

템플릿 콜백 패턴 vs 전략 패턴

템플릿 콜백 패턴은 전략 패턴과 명칭만 다르고, 거의 똑같다. 이 두 패턴의 차이는 의도에 있다고 본다.

  • 먼저, 전략 패턴의 경우 각 전략(strategy)들을 미리 정의해두고, 각각의 전략들을 상황에 맞게 context와 조립하는 패턴이다.
  • 템플릿 콜백 패턴은 템플릿에 상황에 적합한 콜백 함수를 전달하는 좀 더 유연한 패턴이다.