Spring/아키텍처, 설계

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

가지코딩 2025. 6. 18. 19:18

템플릿 메서드 패턴(Template Method Pattern) 이란?

  • 상위 클래스에서 알고리즘의 전체 구조(뼈대)를 정의하고, 그 알고리즘의 일부 단계는 하위 클래스에서 구체적으로 구현하도록 하는 디자인 패턴
  • 변하지 않는 기능(템플릿)은 상위 클래스에 만들어두고 자주 변경되며 확장할 기능은 하위 클래스에서 구현하여 유연성을 확보한다.

템플릿 메서드 패턴의 필요성

 

중복된 로직 문제 예시

class FileUploadTask {
    public void execute() {
        System.out.println("[공통] 작업 시작 로그 찍기");
        System.out.println("파일 업로드 작업 수행");
        System.out.println("[공통] 작업 종료 로그 찍기");
    }
}

class EmailSendTask {
    public void execute() {
        System.out.println("[공통] 작업 시작 로그 찍기");
        System.out.println("이메일 전송 작업 수행");
        System.out.println("[공통] 작업 종료 로그 찍기");
    }
}

public class Main {
    public static void main(String[] args) {
        FileUploadTask uploadTask = new FileUploadTask();
        uploadTask.execute();

        EmailSendTask emailTask = new EmailSendTask();
        emailTask.execute();
    }
}

 

 

1. 코드 중복 (Duplicated Code)

  • execute() 메서드 내에서 시작/종료 로그 출력 부분이 두 클래스에 똑같이 반복되어 있다.
  • 이런 중복은 코드의 양을 불필요하게 늘리고 가독성을 떨어뜨린다.

 

2. 변경에 취약함 (변경 시 수정 범위가 큼)

  • 예를 들어, 로그 메시지 형식이나 출력 방식을 변경해야 한다면,
    두 클래스(FileUploadTask, EmailSendTask) 모두의 execute() 메서드를 각각 수정해야 한다.
  • 이는 수정 실수나 누락 가능성을 높이고, 유지보수 비용을 증가시킨다.

 

3. 코드 일관성 저하

  • 여러 군데에 동일한 코드가 존재하면, 하나만 수정하고 다른 곳은 놓치는 경우가 생길 수 있다.
  • 이로 인해 실행 흐름이나 로그 메시지의 일관성이 깨질 위험이 있다.

 

4. 확장성 저하

  • 새로운 작업이 추가될 때마다 같은 공통 로직을 복사해서 붙여넣어야 하므로 코드가 점점 커지고 복잡해진다.
  • 변경이 필요할 때마다 중복된 모든 부분을 일일이 점검해야 해서 작업이 번거롭다.

템플릿 메서드 패턴 구조

 

주요 구성 요소

  • 추상 클래스(= 상위 클래스): 알고리즘의 골격(템플릿 메서드) 정의 및 공통 기능 구현
    • 템플릿 메서드
      • 알고리즘의 전체 흐름을 정의하고, 변하지 않는 부분 관리\
      • ex. excute()
    • 추상 메서드
      • 알고리즘 중 변할 수 있는 부분을 하위 클래스가 구현하도록 정의
      • ex. doTesk()
    • 훅 메서드
      • 기본 구현을 가진 선택적 메서드
      • 하위 클래스가 필요에 따라 재정의하여 알고리즘의 일부 흐름이나 동작을 유연하게 변경할 수 있도록 허용
      • ex. start(), end()
  • 구체 클래스 (하위 클래스): 추상 클래스가 정의한 추상 메서드를 구체적으로 구현

템플릿 메서드 패턴 예시

 abstract class TaskTemplate {
    public final void execute() {
        start();
        doTask();
        end();
    }

    protected void start() {
        System.out.println("[공통] 작업 시작 로그 찍기");
    }

    protected abstract void doTask(); // 하위 클래스에서 구현

    protected void end() {
        System.out.println("[공통] 작업 종료 로그 찍기");
    }
}
class FileUploadTask extends TaskTemplate {
    @Override
    protected void doTask() {
        System.out.println("파일 업로드 작업 수행");
    }
}

class EmailSendTask extends TaskTemplate {
    @Override
    protected void doTask() {
        System.out.println("이메일 전송 작업 수행");
    }
}

 

클라이언트 사용 예

public class Main {
    public static void main(String[] args) {
        TaskTemplate uploadTask = new FileUploadTask();
        uploadTask.execute();

        TaskTemplate emailTask = new EmailSendTask();
        emailTask.execute();
    }
}

템플릿 메서드 패턴의 장단점

 

장점

  • 코드 중복 제거 및 재사용성 향상
  • 알고리즘의 구조와 흐름을 명확하게 정의
  • 유지보수 용이
  • 확장성 제공
  • 하위 클래스의 역할 분리

 

단점

  • 상속에 의존 → 설계 유연성 저하
  • 복잡성 증가 가능성
  • 알고리즘 변경이 어려울 수 있음
  • 과도한 추상화 위험

참고 자료

https://engineering.linecorp.com/ko/blog/templete-method-pattern

 

템플릿 메서드 패턴으로 모순 없는 상태 보장하기

시작하기 전에 안녕하세요. LINE Pay의 iOS 개발을 맡고 있는 정지인입니다. LINE Pay iOS의 결제 기능을 리팩토링하는 데에 적용했던 템플릿 메서드 패턴을 이용한 계약 기반 프로그래밍 기법에 대해

engineering.linecorp.com

 

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%A9%94%EC%86%8C%EB%93%9CTemplate-Method-%ED%8C%A8%ED%84%B4-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%B0%B0%EC%9B%8C%EB%B3%B4%EC%9E%90

 

💠 템플릿 메소드(Template Method) 패턴 - 완벽 마스터하기

Template Method Pattern 템플릿 메서드(Template Method) 패턴은 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화 하여 상위 클래스에서 정의하고, 하위 클래스마다 세부 동작 사항을 다르게 구현하

inpa.tistory.com