본문 바로가기

개발

반복되는 흐름을 정리하는 디자인 패턴: 템플릿 메서드 패턴

반응형

 

최근 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에서는 다중 상속이 불가능하므로, 이미 다른 클래스를 상속 중이라면 템플릿 메서드 패턴을 적용하기 어렵습니다.

 

📌 정리

템플릿 메서드 패턴은 변하지 않는 부분과 변해야 하는 부분을 분리하는 데 유용한 패턴입니다. 특히 공통 프로세스는 고정하되, 세부 동작만 바꾸고 싶을 때 유연성을 제공합니다. 단, 상속에 기반하기 때문에 지나친 사용은 코드 구조를 복잡하게 만들 수 있어, 상황에 따라 신중하게 선택하는 것이 좋습니다.

반응형