# [[Template Method Pattern (템플릿 메서드 패턴)]]

## 📌 Brief Summary
Template Method Pattern(템플릿 메서드 패턴)은 하위 클래스에 있는 두 메서드가 동일한 순서로 비슷한 단계를 수행하지만, 각 단계의 세부 구현이 다를 때 사용하는 객체지향 디자인 패턴이자 리팩토링 기법(Form Template Method)이다 [1]. 이 패턴은 메서드의 공통된 실행 순서(시퀀스)를 상위 클래스로 이동시키고, 달라지는 세부 단계는 다형성(Polymorphism)을 활용해 하위 클래스에서 처리하도록 한다 [2]. 이를 통해 필수적인 차이점은 유지하면서 코드의 중복을 효과적으로 제거할 수 있다 [1].

## 📖 Core 기법
- **도입 목적 및 배경:**
  상속(Inheritance)은 중복된 동작을 제거하는 강력한 도구이다 [1]. 하위 클래스들에 전체적인 흐름은 유사하지만 세부 단계가 다른 두 메서드가 존재할 경우, 중복된 코드가 발생하게 된다 [1, 3]. 이 때, 'Form Template Method(템플릿 메서드 형성)' 리팩토링을 통해 전체적인 시퀀스를 상위 클래스로 올리고, 서로 다른 단계들은 하위 클래스가 다형성을 통해 다르게 수행하도록 위임함으로써 중복을 제거할 수 있다 [1, 2].
- **리팩토링 실행 절차 (Mechanics):**
  1. 기존 메서드들을 완전히 동일한 부분과 완전히 다른 부분으로 분해(Decompose)한다 [2].
  2. 완전히 동일한 메서드들은 `Pull Up Method`를 사용하여 상위 클래스로 끌어올린다 [2].
  3. 내용이 다른 메서드들은 `Rename Method`를 사용하여 모든 단계에서 동일한 시그니처(Signature)를 갖도록 변경한다 [2, 4].
  4. 컴파일과 테스트를 수행한 후, 원래의 메서드(이제 동일한 시그니처의 메서드 호출들로 구성됨) 중 하나에 `Pull Up Method`를 적용하여 상위 클래스로 올린다 [4].
  5. 상위 클래스로 올라간 템플릿 메서드 내에서 호출되는 서로 다른 세부 메서드들은 상위 클래스에 추상 메서드(Abstract method)로 정의한다 [4].
  6. 하위 클래스에 남아 있는 중복된 원래 메서드들을 삭제하고 컴파일 및 테스트를 진행한다 [4].
- **적용 사례:**
  예를 들어, 고객의 대여 내역을 출력하는 시스템에서 일반 ASCII 텍스트로 출력하는 메서드와 HTML로 출력하는 메서드가 있을 때 적용할 수 있다 [4, 5]. 두 메서드는 헤더 출력, 대여 내역 반복 출력, 푸터 출력이라는 동일한 논리적 순서를 갖지만, 포맷팅 방식(세부 구현)만 다르다 [6, 7]. 이를 분해하고 상위 클래스에 템플릿 메서드를 형성하면, 새로운 형태의 출력 방식(예: XML 출력)을 추가할 때 세부 단계의 추상 메서드만 오버라이딩하여 서브클래스를 만들면 되므로 확장이 매우 쉬워진다 [8].

## ⚖️ Trade-offs & Caveats
소스에 관련 정보가 부족합니다. (제공된 소스 데이터에서는 Template Method Pattern 또는 Form Template Method 기법의 목적, 절차, 이점 등에 대해 자세히 설명하고 있으나 [1, 2, 4-12], 이 패턴을 적용했을 때 발생할 수 있는 구체적인 부작용, 상속 구조의 경직성, 혹은 단점이나 제약 사항(Trade-off)에 대한 명시적인 설명은 포함되어 있지 않습니다.)

단, 이 리팩토링을 수행하기 위해서는 반드시 대상이 되는 메서드들이 공통 상위 클래스를 가지는 상속 구조(Inheritance structure) 내에 있어야 하며, 하위 클래스의 메서드들이 '대략적으로 비슷한 순서(broadly similar steps in the same sequence)'를 가지고 있어야 한다는 전제 조건이 요구된다는 점은 절차상 유의해야 할 사항이다 [1, 2, 9].

## 🔗 Knowledge Connections

### Related Concepts
#### [상속 및 계층 구조 리팩토링 (Inheritance/Hierarchy Refactoring)]
- [[Pull Up Method]]
  - 연결 이유: Form Template Method 과정에서 분해된 공통 메서드와 최종적인 템플릿 메서드 전체를 상위 클래스로 이동시킬 때 핵심적으로 사용되는 리팩토링 기법이다 [2, 4].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 하위 클래스들 간의 중복된 행위를 식별하고 이를 상위 클래스로 안전하게 일반화(Generalization)하여 버그 발생률을 줄이는 구체적인 메커니즘 [13, 14].
- [[Extract Method]]
  - 연결 이유: 기존의 메서드에서 공통된 부분과 달라지는 부분을 분리하여 템플릿 메서드 패턴을 적용할 수 있는 잘게 쪼개진 상태로 만들기 위해 선행되어야 하는 기법이다 [2, 3, 6].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 함수를 작고 의미 있는 단위로 분해하여 코드의 목적(Intention)을 드러내고 재사용성을 높이는 방법 [15, 16].

#### [객체지향 원칙 및 코드 스멜 (OOP Principles & Code Smells)]
- [[Polymorphism (다형성)]]
  - 연결 이유: 템플릿 메서드가 상위 클래스에서 전체 흐름을 제어할 때, 세부적인 단계의 실행을 각 하위 클래스의 특성에 맞게 변형하여 다르게 동작하게 만드는 객체지향의 핵심 원리이다 [1, 2].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 조건문(switch/if-else)에 의존하지 않고 객체의 타입에 따라 다른 행위를 수행하도록 시스템을 유연하게 설계하는 방법 [17].
- [[Duplicated Code (중복 코드)]]
  - 연결 이유: Form Template Method 리팩토링을 수행하게 만드는 가장 주요한 코드 스멜(문제점)이다 [3].
  - 이 개념을 통해 더 깊게 이해할 수 있는 부분: 형제 하위 클래스 간에 완전히 동일하지는 않지만 비슷한 코드가 존재할 때 발생하는 유지보수상의 문제점과 그 해결 원리 [3, 18].

### Deeper Research Questions
- 하위 클래스의 두 메서드가 '대략적으로 비슷한 순서(broadly similar steps in the same sequence)'를 가지지 않고 제어 흐름이 엇갈리는 경우, Template Method Pattern을 어떻게 변형하거나 다른 패턴으로 대체할 수 있는가?
- Template Method Pattern을 적용하기 위해 분해한 세부 메서드들의 시그니처를 동일하게 맞추는 과정(Rename Method)에서, 하위 클래스마다 요구하는 매개변수나 반환 타입이 서로 다를 경우 이를 어떻게 해결하고 추상화해야 하는가?
- 다형성(Polymorphism)을 활용한 Template Method Pattern과 조건문(Conditional logic)을 그대로 유지하는 설계 사이의 성능(Performance) 및 유지보수성(Maintainability) 차이는 구체적으로 어떠한가?
- 상태 패턴(State Pattern)이나 전략 패턴(Strategy Pattern)과 같이 위임(Delegation)을 사용하는 패턴과 비교할 때, 상속 기반의 Template Method Pattern이 가지는 구조적 장단점은 무엇인가?
- Extract Superclass 과정에서 공통점을 식별하고 Form Template Method를 적용하여 설계를 일반화(Generalize)할 때 권장되는 모범 사례(Best Practice)는 무엇인가?

### Practical Application Contexts
- **Implementation:** 애플리케이션 내에 고객 대여 내역을 Text 형식과 HTML 형식으로 각각 출력하는 메서드를 구현할 때, 데이터를 순회하는 로직과 전체 출력 순서가 같다면 상위 클래스에 템플릿을 두고 포맷팅 단계만 분리하여 하위 클래스에서 오버라이딩하도록 구현할 수 있다 [4-12].
- **System Design:** 다형성(Polymorphism)을 활용하여 시스템의 공통 실행 시퀀스를 상위 클래스에 정의함으로써, 향후 새로운 요구사항(예: 새로운 종류의 출력 포맷이나 계산 플로우 추가)이 발생했을 때 하위 클래스 하나를 추가하고 필요한 추상 메서드만 구현하면 되도록 유연하게 설계할 수 있다 [8].
- **Operation / Maintenance:** 중복된 로직을 상위 클래스의 템플릿 메서드 하나로 통합함으로써 핵심 로직에 변경이 생겼을 때 한 곳만 수정하게 하여, 누락으로 인한 버그 발생을 줄이고 유지보수 비용을 낮춘다 [1, 2].
- **Learning Path:** 중복 코드 제거를 위해 기본적으로 Extract Method와 Pull Up Method를 먼저 학습한 뒤, 두 기법을 복합적으로 사용하여 상속 계층의 구조를 개선하고 일반화(Generalization)하는 고급 과정으로 Form Template Method를 학습한다 [2, 3, 6].
- **My Project Relevance:** 프로젝트 내에 존재하는 다양한 종류의 파싱 로직이나 데이터 처리 파이프라인에서 공통된 순서를 발견할 때, 이 패턴을 적용하여 중복을 줄이고 새로운 처리 방식의 확장을 용이하게 만들 수 있다. (제공된 소스에 내 프로젝트에 대한 구체적 명시는 없으나, 코드 중복 제거와 확장성 확보를 위한 일반적 적용이 가능하다 [1, 2].)

### Adjacent Topics
- [[Replace Conditional with Polymorphism (조건식을 다형성으로 바꾸기)]]
  - 확장 방향: 템플릿 메서드 패턴과 마찬가지로 다형성을 활용하여 복잡한 조건문(switch 또는 if-else)을 제거하고, 타입에 따른 행위 분리를 객체지향적으로 풀어내는 또 다른 핵심 리팩토링 기법으로 이해를 확장할 수 있다 [17, 19].

---
*Last updated: 2026-05-03*