Design Pattern

[디자인 패턴] 템플릿 메서드 패턴 (Template Method Pattern)

꾸준함. 2024. 7. 3. 23:56

템플릿 메서드 패턴

  • 콜백으로 상속 대신 위임을 사용하는 템플릿 패턴
  • 특정 알고리즘의 구조를 정의하되 해당 알고리즘의 일부 단계를 서브 클래스에서 구현하도록 위임
  • 알고리즘의 뼈대를 정의하고 일부 단계를 추상 메서드로 선언하여 서브 클래스에서 구체적인 동작을 제공하여 코드 재사용성을 높이고 알고리즘의 변화를 서브 클래스에서 쉽게 구현할 수 있도록 지원

 

https://www.geeksforgeeks.org/template-method-design-pattern/

 

주요 구성 요소

 

1. Abstract Class

  • 알고리즘의 뼈대를 정의하고 템플릿 메서드를 포함
  • 템플릿 메서드는 알고리즘의 구조를 정의하며 하나 이상의 추상 메서드를 호출

 

2. Abstract Method

  • 서브 클래스에서 구현해야 하는 메서드들

 

3. Concrete Class

  • 추상 클래스에서 정의된 추상 메서드를 구현하여 알고리즘의 구체적인 단계를 제공

 

템플릿 메서드 패턴 구현 예시

 

1. Abstract Class

 

 

2. Concrete Class

 

 

3. 클라이언트 코드

 

 

부연 설명

  • Game은 템플릿 메서드 play()를 정의하는 추상 클래스
    • play() 메서드는 initialize(), startPlay(), endPlay() 메서드를 호출하여 게임의 전체 흐름을 정의

 

  • Soccer와 Basketball은 Game 추상 클래스를 상속받아 각자의 게임 초기화, 시작, 종료 단계를 구현한 구체 클래스\
  • 클라이언트 코드로, Game 객체를 생성하고 play() 메서드를 호출하여 각 게임의 실행 흐름을 보여줌

 

템플릿 메서드 패턴 장단점

 

장점

  • 템플릿 코드를 재사용하고 중복 코드를 줄일 수 있음
  • 템플릿 코드를 변경하지 않고 상속을 받아서 구체적인 알고리즘만 변경할 수 있음

 

단점

  • 알고리즘 구조가 복잡할수록 템플릿을 유지하기 어려워짐
  • SOLID의 LSP 원칙을 어길 수 있음
    • 리스코프 치환 원칙은 객체 지향 프로그래밍의 중요한 원칙 중 하나로, 서브타입 객체는 언제나 그 base type 객체로 치환할 수 있어야 한다는 것을 의미
    • 서브클래스가 부모 클래스의 추상 메서드를 재정의할 때, 부모 클래스에서 기대하는 행동과 다른 방식으로 구현하면 치환 원칙을 위반
    • ex) 부모 클래스의 메서드가 특정 순서로 동작해야 하는데, 서브클래스에서 그 순서를 변경하거나, 특정 단계를 생략하거나, 추가하는 경우

 

실무에서 쓰이는 템플릿 메서드 패턴

 

1. 자바의 HttpServlet

  • HttpServlet 클래스는 자바 서블릿 API에서 클라이언트의 HTTP 요청을 처리하기 위해 사용되는 클래스
  • HttpServlet 클래스는 템플릿 메서드 패턴을 기반으로 설계되어 있으며, 이를 통해 특정 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)에 대한 처리를 쉽게 할 수 있도록 지원
    • 템플릿 메서드: service(HttpServletRequest req, HttpServletResponse resp) 메서드는 HTTP 요청을 처리하기 위한 템플릿 메서드이며 해당 메서드는 요청 메서드(GET, POST 등)에 따라 적절한 메서드를 호출
    • doGet(HttpServletRequest req, HttpServletResponse resp), doPost(HttpServletRequest req, HttpServletResponse resp), doPut(HttpServletRequest req, HttpServletResponse resp), doDelete(HttpServletRequest req, HttpServletResponse resp) 등의 메서드는 서브클래스에서 overide 할 수 있는 메서드들

 

2. 스프링 프레임워크의 Configuration

  • @Configuration 클래스는 스프링 컨테이너에 빈을 등록하기 위해 사용되는 구성 클래스
  • @Configuration 클래스는 템플릿 메서드 패턴을 사용하여 애플리케이션 컨텍스트의 설정 구조를 정의하고, 사용자 정의 빈 생성 메서드를 통해 구체적인 빈 정의를 제공
    • Abstract Class: 스프링에서는 @Configuration이 적용된 클래스가 추상 클래스로 동작하며, 내부적으로 템플릿 메서드 패턴을 사용하여 스프링 컨텍스트 초기화를 관리
    • 템플릿 메서드: 스프링 컨테이너는 @Configuration 클래스를 스캔하고, 그 안에 정의된 @Bean 메서드를 호출하여 빈을 생성하고 초기화하며 이는 템플릿 메서드의 역할
    • Abstract Methods와 Concrete Methods: @Configuration 클래스의 @Bean 메서드는 사용자가 구현해야 하는 추상 메서드처럼 동작하며 개발자는 이 메서드를 통해 특정 빈의 정의와 초기화를 제공

 

3. 스프링 프레임워크의 RestTemplate

  • 스프링 프레임워크의 RestTemplate은 템플릿 메서드 패턴을 활용하여 HTTP 요청과 응답 처리를 단순화하고, 재사용 가능한 코드 구조를 제공
  • RestTemplate은 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등)를 통해 외부 웹 서비스와 상호작용할 수 있도록 지원
    • 템플릿 메서드: RestTemplate은 getForObject, postForObject, put, delete 등의 메서드를 통해 HTTP 요청을 보내며 해당 메서드들은 템플릿 메서드로 동작하여 공통적인 HTTP 요청-응답 처리 흐름을 정의
    • Abstract Methods와 Concrete Methods: RestTemplate의 템플릿 메서드는 내부적으로 execute와 같은 다양한 하위 단계 메서드를 호출하여 HTTP 요청을 구성하고, 전송하며, 응답을 처리하며 이러한 하위 메서드는 필요에 따라 오버라이드하여 커스터마이징 할 수 있음

 

참고

코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님

반응형