노트

템플릿 메서드 패턴

Template Method

설계#pattern · 연결된 개념 6개

쉽게 말하면

템플릿 메서드 패턴은 졸업식처럼 '입장, 축사, 수여, 퇴장'의 순서는 정해 두고 축사 내용만 학교마다 바꾸게 하는 거예요. 순서를 매번 새로 짤 필요 없이 다른 부분만 채우면 돼요.

비유가 깨지는 곳 순서가 고정된 만큼 자식은 부모의 흐름에 묶여서, 부모를 고치면 자식이 깨지기 쉬워요. 더 유연해야 하면 단계를 함수로 받는 전략 패턴이나 고차 함수를 비교해요.

알고리즘의 뼈대(단계의 순서)는 상위 클래스의 메서드에 고정하고, 일부 단계만 하위 클래스가 바꾸게 하는 패턴.

abstract class DataImporter {
  run() { // 뼈대는 고정
    const raw = this.read()
    const rows = this.parse(raw)
    this.validate(rows)
    this.save(rows)
  }
  protected abstract read(): string
  protected abstract parse(raw: string): Row[]
  protected validate(rows: Row[]) { /* 기본 구현, 필요하면 덮어씀(훅) */ }
  private save(rows: Row[]) { db.insert(rows) }
}
class CsvImporter extends DataImporter { ... }
  • 흐름은 같은데 세부 단계만 다른 클래스들의 중복을 없앤다. 『리팩터링』 1판의 템플릿 메서드 만들기(Form Template Method)가 이 구조로 가는 길이다(2판 카탈로그에서는 빠졌고 Refactoring.Guru에 남아 있다)
  • 기본 구현이 있는 단계(훅, Hook)는 필요한 하위 클래스만 덮어쓴다
  • 프레임워크가 흐름을 쥐고 내 코드를 부르는 "할리우드 원칙(Hollywood Principle, 우리가 연락할게)"의 대표 예다. 테스트 프레임워크의 setUp·tearDown이 그렇다

대가

상속 결합이 생긴다. 하위 클래스는 부모의 흐름에 묶이고, 부모를 고치면 자식이 깨지기 쉽다(상속보다 위임). 조합이 더 유연해야 하면 단계를 함수로 받는 전략 패턴이나 콜백을 비교한다. JavaScript에서는 상속 대신 단계 함수를 인자로 받는 고차 함수로 같은 효과를 내는 경우가 많다. 행동 패턴 전체는 행동 패턴.

출처: Template Method — Refactoring.Guru · Form Template Method — Refactoring.Guru

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 팩토리 메서드 패턴

    객체 생성을 생성자 호출 대신 전용 메서드(또는 함수)에 맡기는 패턴. GoF(Gang of Four)의 원래 형태는 상위 클래스가 생성 메서드를 선언하고 하위 클래스가 어떤 제품을 만들지 정하는 구조지만, 실무에서는 "생성을 감싸는 함수" 전반을 넓게 가리키기도 한다.

  • 파이썬 MRO와 super()

    MRO(Method Resolution Order, 메서드 탐색 순서)는 다중 상속에서 속성이나 메서드를 찾을 때 파이썬이 어떤 클래스부터 차례로 뒤질지 정한 순서다. 파이썬 3는 C3 선형화(C3 linearization) 알고리즘으로 이 순서를 계산한다.

  • JDBC와 JdbcTemplate

    JDBC(Java Database Connectivity)는 자바가 여러 DB와 통신하기 위한 표준 API이고, Hibernate·MyBatis·스프링 JDBC 모두 그 위에 있다. JdbcTemplate은 스프링이 JDBC의 반복 작업(연결 열고 닫기, 예외 변환, 결과 순회)을 대신해 주는 클래스다.

  • 데코레이터 패턴

    같은 인터페이스를 구현한 래퍼로 객체를 감싸, 원래 객체를 고치지 않고 앞뒤에 기능을 덧붙이는 패턴. 래퍼를 여러 겹 쌓아 기능을 조합할 수 있다.

  • 기본형 집착

    전화번호·금액·우선순위 같은 도메인 개념을 끝까지 문자열이나 숫자로만 다루는 냄새. 같은 검증과 포맷 코드가 여기저기 반복되고, 문자열로 모든 걸 표현하는 "stringly typed" 코드가 된다.

보기 옵션