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

주요 구성 요소
1. Abstract Class
- 알고리즘의 뼈대를 정의하고 템플릿 메서드를 포함
- 템플릿 메서드는 알고리즘의 구조를 정의하며 하나 이상의 추상 메서드를 호출
2. Abstract Method
- 서브 클래스에서 구현해야 하는 메서드들
3. Concrete Class
- 추상 클래스에서 정의된 추상 메서드를 구현하여 알고리즘의 구체적인 단계를 제공
템플릿 메서드 패턴 구현 예시
1. Abstract Class
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
abstract class Game { | |
public final void play() { | |
initialize(); | |
startPlay(); | |
endPlay(); | |
} | |
abstract void initialize(); | |
abstract void startPlay(); | |
abstract void endPlay(); | |
} |
2. Concrete Class
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Soccer extends Game { | |
@Override | |
void initialize() { | |
System.out.println("축구 게임 환경 설정 완료!"); | |
} | |
@Override | |
void startPlay() { | |
System.out.println("축구 게임 시작"); | |
} | |
@Override | |
void endPlay() { | |
System.out.println("축구 게임 끝"); | |
} | |
} | |
public class BasketBall extends Game { | |
@Override | |
void initialize() { | |
System.out.println("농구 게임 환경 설정 완료!"); | |
} | |
@Override | |
void startPlay() { | |
System.out.println("농구 게임 시작"); | |
} | |
@Override | |
void endPlay() { | |
System.out.println("농구 게임 끝"); | |
} | |
} |
3. 클라이언트 코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Client { | |
public static void main(String[] args) { | |
Game game = new Soccer(); | |
game.play(); | |
System.out.println(); | |
game = new BasketBall(); | |
game.play(); | |
} | |
} |

부연 설명
- 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의 디자인 패턴 - 백기선 강사님
반응형
'Design Pattern' 카테고리의 다른 글
[디자인 패턴] Reactor Pattern (0) | 2024.07.15 |
---|---|
[디자인 패턴] 방문자 패턴 (Visitor Pattern) (0) | 2024.07.05 |
[디자인 패턴] 전략 패턴 (Strategy Pattern) (0) | 2024.07.03 |
[디자인 패턴] 상태 패턴 (State Pattern) (0) | 2024.07.03 |
[디자인 패턴] 옵저버 패턴 (Observer Pattern) (0) | 2024.07.02 |