최근 Spring AOP를 공부하던 중, 공통 로직과 핵심 로직을 분리하는 구조에서 템플릿 메서드 패턴(Template Method Pattern)이 등장하는 걸 보게 됐습니다. 그동안 디자인 패턴관련 내용들이 나오면 조금 추상적으로 느껴졌던 개념이었는데, 이번 기회에 디자인 패턴들에 정리해보려고 합니다.
템플릿 메소드 패턴 ( Template Method Pattern )
템플릿 메소드 패턴(template method pattern)은 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 디자인 패턴이다. 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 다시 정의할 수 있게 해준다. (feat.위키 백과)
템플릿 메소드 패턴의 구조

템플릿 메서드 패턴은 상위 클래스(AbstractClass)에서 전체 알고리즘의 흐름(템플릿)을 정의하고, 일부 세부 단계는 하위 클래스(ConcreateClass)에서 구현하도록 위임하는 패턴입니다.
즉, 전체 처리 순서는 고정하되, 일부 동작은 서브클래스가 재정의할 수 있도록 열어둡니다.
💡 “알고리즘의 뼈대는 상위 클래스에서 정의하고, 세부 구현은 하위 클래스에 맡긴다.”
설명
| AbstractClass | 추상 클래스 |
| ConcreteClass | 실제 구현 클래스 |
| Template Method | 전체 알고리즘의 흐름을 정의한 메서드. 하위 클래스가 변경하지 않도록 final로 선언하는 경우도 있다 |
| Primitive Method | 템플릿 메서드가 호출하는 메서드 중, 하위 클래스에서 반드시 구현해야 하는 메서드 |
템플릿 메서드 패턴 예제 코드 : 데이터 처리 시스템
아래 예제는 템플릿 메서드 패턴을 사용하여 데이터 처리 로직을 추상화한 구조입니다.
공통된 흐름(데이터베이스 연결 → 데이터 처리 → 연결 해제)을 템플릿으로 정의하고, 실제 데이터 처리 부분만 하위 클래스가 자유롭게 구현하도록 구성했습니다.
// 추상 클래스
public abstract class DatabaseProcessor {
// 템플릿 메서드
public void execute() {
System.out.println("데이터 베이스 연결");
processData();
System.out.println("데이터 베이스 해제");
}
// 추상 메서드
protected abstract void processData();
}
// 실제 구현 메서드
public class ReadData extends DatabaseProcessor {
@Override
protected void processData() {
System.out.println("데이터 읽기");
}
}
// 실제 구현 메서드
public class SaveData extends DatabaseProcessor {
@Override
protected void processData() {
System.out.println("데이터 저장");
}
}
- execute() 메서드는 템플릿 메서드로, 전체 작업 흐름을 정의합니다.
- processData()는 추상 메서드로, 하위 클래스가 각자 구현하게 됩니다.
- 이렇게 하면 공통된 흐름은 유지하면서, 처리 방식은 유연하게 변경할 수 있습니다.
- ReadData는 processData()를 "데이터 읽기"로 구현
- SaveData는 "데이터 저장"으로 구현
- 이처럼 하위 클래스마다 각기 다른 데이터 처리 로직을 담을 수 있습니다.
템플릿 메서드 패턴의 특징, 장단점
앞서 살펴본 예제처럼 템플릿 메서드 패턴은 공통된 알고리즘의 구조(템플릿)를 상위 클래스에 정의하고, 세부 구현은 하위 클래스에 위임하는 방식입니다. 이 구조에는 여러 가지 장점이 있지만, 단점도 존재하므로 상황에 맞게 사용하는 것이 중요합니다.
🌟 장점
- 중복 제거 및 코드 재사용
알고리즘의 공통 부분을 상위 클래스에서 정의하므로, 중복되는 코드가 줄어들고 재사용성이 높아집니다. - 알고리즘 구조의 명확한 표현
템플릿 메서드를 통해 전체 로직의 흐름이 명확히 드러나므로, 가독성과 이해도가 높아집니다. - 프레임워크 설계에 적합
공통 로직을 고정하고 사용자 정의 동작만 오버라이딩하게 하므로, 프레임워크나 라이브러리 설계에 자주 사용됩니다.
⚠️ 단점
- 상속에 의존
템플릿 메서드 패턴은 상속을 기반으로 하기 때문에, 클래스 간 결합도가 높아질 수 있습니다. 유연성 측면에서 구성(Composition)보다 제약이 많을 수 있습니다. - 하위 클래스가 많아질 수 있음
세부 로직이 조금씩 다른 다양한 처리를 위해 하위 클래스를 많이 만들어야 할 수 있습니다. 이는 코드 관리가 복잡해질 수 있음을 의미합니다. - 추상 클래스의 제약
Java에서는 다중 상속이 불가능하므로, 이미 다른 클래스를 상속 중이라면 템플릿 메서드 패턴을 적용하기 어렵습니다.
📌 정리
템플릿 메서드 패턴은 변하지 않는 부분과 변해야 하는 부분을 분리하는 데 유용한 패턴입니다. 특히 공통 프로세스는 고정하되, 세부 동작만 바꾸고 싶을 때 유연성을 제공합니다. 단, 상속에 기반하기 때문에 지나친 사용은 코드 구조를 복잡하게 만들 수 있어, 상황에 따라 신중하게 선택하는 것이 좋습니다.
'개발' 카테고리의 다른 글
| 변하는 알고리즘을 분리하는 디자인 패턴: 전략 패턴 (0) | 2025.05.18 |
|---|---|
| 손으로 하던 사과게임, 이제는 자동으로! Python으로 만든 매크로 이야기 (2) | 2025.04.27 |
| Fixed length format과 getByte()의 예상치 못한 함정 (1) | 2025.03.11 |