본문으로 건너뛰기

1. 템플릿 콜백 패턴 개요

  • 템플릿 콜백 패턴은 전략 패턴을 발전시킨 스프링 프레임워크의 핵심 디자인 패턴입니다.
  • 이 패턴의 핵심은 변하지 않는 템플릿 부분과 변하는 콜백 부분을 분리하는 것입니다.

1.1 핵심 개념

  • 전략 패턴의 발전된 형태
  • 실행 시점에 여러 전략을 파라미터로 전달 가능
  • Context가 템플릿 역할을 수행
  • 변하는 부분은 파라미터로 전달된 콜백이 처리
정보

템플릿 콜백 패턴은 GOF의 디자인 패턴은 아니지만, 스프링 프레임워크에서 널리 사용되는 패턴입니다. JdbcTemplate, RestTemplate, TransactionTemplate 등 스프링의 많은 기능들이 이 패턴을 기반으로 구현되어 있습니다.

2. 콜백의 이해

2.1 콜백이란?

  • 콜백(Callback)은 다른 코드의 인수로 넘겨주는 실행 가능한 코드를 의미합니다.
  • 콜백을 받는 코드는 필요에 따라 즉시 실행하거나 나중에 실행할 수 있습니다.

2.2 자바에서의 콜백 구현 방법

  • 자바에서 콜백을 구현하는 방법은 시간에 따라 발전해왔습니다
  • Java 8 이전
    • 단일 메소드 인터페이스 구현
    • 익명 내부 클래스 사용
  • Java 8 이후
    • 람다식을 통한 간결한 구현
    • 함수형 인터페이스 활용

3. 패턴 구현하기

3.1 콜백 인터페이스 정의

public interface Callback {
void call();
}
  • 콜백 인터페이스는 call() 메서드 하나만 정의합니다.

3.2 템플릿 클래스 구현

@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);
}
}
  • execute() 메서드는 콜백을 파라미터로 받아 실행합니다.
  • 비즈니스 로직 실행 전후에 시간을 측정하여 로그로 출력합니다.
  • 콜백을 호출하는 부분이 템플릿의 핵심 로직입니다.
  • 이렇게 하면 템플릿 클래스는 변하지 않는 부분을 담당하게 됩니다.
    • 시간 측정, 로깅 등

3.3 실전 활용 예제

@Test
void callbackExample() {
TimeLogTemplate template = new TimeLogTemplate();

// 람다식을 사용한 콜백 전달
template.execute(() -> log.info("비즈니스 로직1 실행"));
template.execute(() -> log.info("비즈니스 로직2 실행"));
}
  • execute() 메서드에 람다식을 사용하여 콜백을 전달합니다.
  • 람다식을 통해 간결하게 콜백을 구현할 수 있습니다.
  • 전략 패턴과 비교하여 템플릿 콜백 패턴은 더 유연하고 간결한 구현이 가능합니다.

4. 스프링에서의 활용

  • 스프링 프레임워크는 템플릿 콜백 패턴을 적극적으로 활용합니다:
    • JdbcTemplate: 데이터베이스 연동
    • RestTemplate: HTTP 통신
    • TransactionTemplate: 트랜잭션 처리
    • RedisTemplate: Redis 데이터 접근

스프링에서 클래스 이름이 'XxxTemplate'인 경우, 대부분 템플릿 콜백 패턴이 적용되어 있습니다.

5. 장점과 활용 전략

5.1 패턴의 장점

  • 코드 재사용성 향상
  • 변경에 유연한 설계
  • 비즈니스 로직 집중도 향상
  • 중복 코드 제거

5.2 실무 활용 전략

  • 공통 로직 템플릿화
  • 트랜잭션 처리
  • 리소스 해제
  • 성능 측정

6. 마치며

  • 템플릿 콜백 패턴은 스프링 프레임워크의 근간을 이루는 핵심 디자인 패턴입니다.
  • 이 패턴을 잘 이해하고 활용하면 더 유연하고 견고한 애플리케이션을 구현할 수 있습니다.

참고 자료: