디자인 패턴

[Design Pattern] 템플릿 콜백 패턴

감자b 2024. 12. 25. 00:31

템플릿 콜백 패턴이란 템플릿과 콜백을 활용한 패턴으로 스프링 프레임워크에서 주로 사용하는 특별한 전략 패턴을 의미한다. (GOF 패턴이 아님)

 

템플릿 콜백 패턴은 주로 함수를 인자로 전달하여 변해야 할 부분을 외부로 위임하는 방식으로 구현한다.

즉 런타임 시점에 익명 클래스 형태의 전략 알고리즘을 동적으로 주입한다.

스프링의 자주 볼 수 있는 XxxTemplate 객체는 해당 패턴을 사용하여 구현하였다.

 

참고로 콜백이란 다른 함수의 인수로 전달되는 실행 가능한 코드로, 코드가 호출( call )은 되는데 코드를 넘겨준 곳의 뒤( back )에서 실행된다는 의미다.

자바의 경우 콜백을 전달하려면 객체가 필요하다.

따라서 자바8 이전에는 하나의 메소드를 가진 인터페이스(함수형 인터페이스)를 구현하고, 익명 내부 클래스를 사용해서 전달하였다. 자바8 이후에는 람다를 사용한다.

 

전략 패턴에서 아래와 같이 바꾸어서 사용한다.

Strategy → Callback

public interface Callback {
     void execute();
}

 

Context → Template

public class Template {
    public void execute(Callback callback) {
        start();
        callback.execute(); // 위임
        end();
    }

    private void start() {
        System.out.println("start");
    }

    private void end() {
        System.out.println("end");
    }
}

 

Client

public class Client {
    public static void main(String[] args) {
        Template template = new Template();
        template.execute(new Callback() {
            @Override
            public void execute() {
                System.out.println("A execute"); // 익명 클래스 사용
            }
        });
        template.execute(
            () -> System.out.println("B execute"); // 람다 사용
        );
    }
}

클라이언트는 템플릿 내부에서 실행 가능한 콜백 객체를 생성, 파라미터로 전달한다.

즉 클라이언트가 Callback을 직접 실행하는 것이 아니라 template.execute()를 실행할 때 콜백을 넘겨주고 Template 뒤에서 콜백이 실행된다.(callback.execute())

 

템플릿 콜백 패턴의 장점

장점

  • 별도의 구체 전략 클래스가 없으므로 복잡도가 낮다.
  • 외부에서 어떤 전략을 사용하는지 숨길 수 있다.
  • 템플릿을 실행하는 시점에 콜백(달라지는 실행 코드)을 전달하므로 유연하다.