핵심 인사이트 (3줄 요약)

  1. 본질: 템플릿 메서드 패턴 (Template Method Pattern)은 GoF 행위 패턴으로, 알고리즘의 골격(Skeleton)을 상위 클래스의 템플릿 메서드에 정의하고, 알고리즘의 특정 단계를 서브클래스가 오버라이드하여 구체 구현을 제공하는 패턴이다.
  2. 가치: 알고리즘의 공통 흐름은 상위 클래스에 두고 변하는 부분만 서브클래스에 위임하여 코드 중복을 제거한다. '할리우드 원칙(Hollywood Principle: Don't call us, we'll call you)'을 구현하여 상위 클래스가 하위 클래스를 제어한다.
  3. 판단 포인트: 템플릿 메서드는 상속(Inheritance) 기반이므로 컴파일 타임에 알고리즘이 고정된다. 런타임에 알고리즘을 교체해야 한다면 전략 패턴(Strategy, 구성 기반)이 더 적합하다. 스프링의 JdbcTemplate, RestTemplate이 대표적인 템플릿 메서드 패턴 구현이다.

Ⅰ. 개요 및 필요성

여러 서브클래스가 동일한 알고리즘 골격을 갖지만 일부 단계만 다를 때, 각 서브클래스가 전체 알고리즘을 중복 구현하면 코드 중복과 유지보수 어려움이 발생한다.

템플릿 메서드 패턴은 알고리즘의 불변 부분(공통 흐름)을 final 메서드로 상위 클래스에 정의하고, 가변 부분을 추상 메서드(또는 훅 메서드)로 서브클래스에 위임한다.

┌─────────────────────────────────────────────────────────────┐
│          템플릿 메서드 패턴 구조                             │
├─────────────────────────────────────────────────────────────┤
│  AbstractClass (상위 클래스)                                │
│  + templateMethod(): void {  // final - 서브클래스 오버라이드 금지│
│      step1();  // 공통 구현                                 │
│      step2();  // abstract - 서브클래스 구현 필수           │
│      step3();  // hook - 서브클래스 선택적 오버라이드       │
│  }                                                          │
│  + step1(): void { 공통 구현 }                              │
│  # abstract step2(): void                                   │
│  + step3(): void { 기본 구현 (훅) }                         │
│       ▲                                                     │
│  ConcreteClassA              ConcreteClassB                 │
│  # step2(): void { A 구현 }  # step2(): void { B 구현 }    │
└─────────────────────────────────────────────────────────────┘
  • 📢 섹션 요약 비유: 레시피(템플릿 메서드)의 기본 단계(재료 준비, 가열, 담기)는 고정이지만, 각 요리사(서브클래스)가 자신만의 방식으로 특정 단계(가열 방법)를 구현한다.

Ⅱ. 아키텍처 및 핵심 원리

스프링의 JdbcTemplate은 템플릿 메서드 패턴의 대표 구현이다. JdbcTemplate.query() 메서드가 DB 연결·SQL 실행·결과 처리·연결 반환의 골격을 정의하고, 개발자가 RowMapper 인터페이스로 결과 매핑 단계만 구현한다.

항목설명포인트
템플릿 메서드알고리즘 골격 정의JdbcTemplate.query()
추상 메서드서브클래스 필수 구현RowMapper.mapRow()
훅 메서드서브클래스 선택적 오버라이드기본 구현 있는 protected 메서드
┌─────────────────────────────────────────────────────────────┐
│       JdbcTemplate 템플릿 메서드 동작                       │
├─────────────────────────────────────────────────────────────┤
│  JdbcTemplate.query(sql, rowMapper) {                       │
│    Connection conn = dataSource.getConnection(); // 공통    │
│    PreparedStatement ps = conn.prepareStatement(sql);       │
│    ResultSet rs = ps.executeQuery();                        │
│    while (rs.next()) {                                      │
│      rowMapper.mapRow(rs, rowNum); // 개발자 구현 부분      │
│    }                                                        │
│    conn.close(); // 공통 (예외 처리 포함)                   │
│  }                                                          │
└─────────────────────────────────────────────────────────────┘
  • 📢 섹션 요약 비유: 햄버거 조리 매뉴얼(템플릿 메서드)이 굽기·조립·포장 단계를 정의하고, 패티 굽기 방식(추상 메서드)만 각 지점(서브클래스)이 결정한다.

Ⅲ. 비교 및 연결

템플릿 메서드(상속 기반)와 전략 패턴(구성 기반)의 차이가 핵심이다.

비교 축AB
메커니즘상속 (서브클래스 오버라이드)구성 (인터페이스 구현 주입)
알고리즘 교체컴파일 타임 고정런타임 교체 가능
결합도높음 (상속)낮음 (인터페이스)
유연성낮음높음
  • 📢 섹션 요약 비유: 템플릿 메서드는 부모님(상위 클래스)이 규칙을 정하고 자녀(서브클래스)가 세부를 결정하는 것이고, 전략 패턴은 팀장(Context)이 팀원(Strategy)을 자유롭게 교체하는 것이다.

Ⅳ. 실무 적용 및 기술사 판단

JUnit의 TestCase 클래스도 템플릿 메서드 패턴 구현이다. setUp()testXxx()tearDown() 순서로 테스트 생명주기가 고정되고, 개발자는 testXxx()만 구현한다. 스프링의 AbstractController, AbstractFetchableItemsReader 등 다양한 Template 클래스가 같은 방식으로 구현된다.

판단 체크리스트

  1. 여러 서브클래스가 동일한 알고리즘 골격을 갖고 일부 단계만 다른가?
  2. 템플릿 메서드가 final로 선언되어 서브클래스가 오버라이드할 수 없는가?
  3. 런타임 알고리즘 교체가 필요한 경우 전략 패턴을 대신 고려했는가?
  4. 훅 메서드에 기본 구현이 제공되어 서브클래스가 선택적으로 오버라이드할 수 있는가?
  5. 상위 클래스가 서브클래스에 역방향(Callback)으로 의존하지 않는가?
  • 📢 섹션 요약 비유: JdbcTemplate은 DB 연결·해제(공통)와 결과 매핑(개발자 구현)을 분리하여 개발자가 공통 처리를 반복 구현하지 않게 한다.

Ⅴ. 기대효과 및 결론

템플릿 메서드 패턴을 적용하면 공통 알고리즘 골격이 상위 클래스에 집중되어 코드 중복이 제거되고, 새 변형 추가 시 새 서브클래스만 추가하면 된다. 스프링의 다양한 Template 클래스가 이 패턴으로 복잡한 공통 처리(트랜잭션, 예외 처리, 자원 해제)를 추상화한다.

한계는 상속 기반으로 런타임 교체가 불가능하고, 서브클래스 수가 많아지면 클래스 계층이 복잡해진다. 현대 언어에서는 함수형 인터페이스(람다)로 콜백을 주입하는 방식이 상속 없이 같은 효과를 달성한다.

  • 📢 섹션 요약 비유: 스프링 JdbcTemplate은 DB 작업의 번거로운 공통 처리(연결·예외·반환)를 템플릿이 처리하고, 개발자는 핵심 로직(쿼리·결과 매핑)만 작성하면 된다.

📌 관련 개념 맵

[코드 중복 문제] → [템플릿 메서드 패턴] → [할리우드 원칙] → [스프링 Template 클래스] → [함수형 콜백 대체]

개념연결 포인트
할리우드 원칙상위 클래스가 서브클래스를 호출하는 역전 관계
전략 패턴런타임 교체가 필요할 때 템플릿 메서드의 대안
JdbcTemplate스프링 템플릿 메서드 패턴의 대표 구현
훅 메서드서브클래스가 선택적으로 오버라이드하는 기본 구현 메서드

📈 관련 키워드 및 발전 흐름도

[GoF Template Method(1994)] → [할리우드 원칙] → [스프링 JdbcTemplate] → [함수형 콜백 대체] → [AOP 기반 공통 처리]

👶 어린이를 위한 3줄 비유 설명

  1. 템플릿 메서드는 레시피처럼, 기본 단계(재료 준비→조리→담기)는 고정이지만 조리 방법만 바꿀 수 있어요.
  2. 스프링의 JdbcTemplate이 바로 이 패턴을 사용해요 - DB 연결·해제는 공통, 쿼리 결과 처리만 개발자가 구현해요.
  3. 공통 알고리즘을 한 곳에 모아서 코드 중복을 없애요!