템플릿 메서드 패턴
- 콜백으로 상속 대신 위임을 사용하는 템플릿 패턴
- 특정 알고리즘의 구조를 정의하되 해당 알고리즘의 일부 단계를 서브 클래스에서 구현하도록 위임
- 알고리즘의 뼈대를 정의하고 일부 단계를 추상 메서드로 선언하여 서브 클래스에서 구체적인 동작을 제공하여 코드 재사용성을 높이고 알고리즘의 변화를 서브 클래스에서 쉽게 구현할 수 있도록 지원
주요 구성 요소
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의 디자인 패턴 - 백기선 강사님
반응형
'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 |