[Design Pattern] 템플릿 메서드 패턴

2023. 2. 21. 08:30· DESIGN_PATTERN
목차
  1. 0. 들어가기 전에
  2. 1. 템플릿 메서드 패턴 적용 전
  3. 2. 템플릿 메서드 패턴이란?
  4. 3. 적용 후 코드
  5. 4. 장단점
  6. ※ 출처

[Design Pattern] 템플릿 메서드 패턴

 

0. 들어가기 전에

  이 글은 예제 코드를 이용하여 템플릿 메서드 패턴을 적용시켜보고, 어떠한 장단점이 있는지 설명하는 글입니다.



1. 템플릿 메서드 패턴 적용 전

  현재 주문 로직과 결제 로직이 있다.(간단하게 로그로 표현했다.)

@Slf4j
public class DefaultOrderLogic {

    private void order() {
        log.info("주문 로직 실행");
    }
}

@Slf4j
public class DefaultPayLogic {

    private void pay() {
        log.info("결제 로직 실행");
    }
}

  그런데 여기에 요구사항으로 메서드의 시작과 끝에 로그를 출력하는 기능을 추가한다고 하자.

  그렇다면 위의 코드는 아래처럼 바뀌게 된다.

@Slf4j
public class DefaultOrderLogic {

    private void order() {
        log.info("메서드 시작");

        log.info("주문 로직 실행");

        log.info("메서드 끝");
    }
}

@Slf4j
public class DefaultPayLogic {

    private void pay() {
        log.info("메서드 시작");

        log.info("결제 로직 실행");

        log.info("메서드 끝");
    }
}

  여기까지는 할 만하다. 그렇다면 여기에 주문 취소 로직이 추가되면 어떨까?

@Slf4j
public class DefaultCancelLogic {

    private void cancel() {
        log.info("메서드 시작");

        log.info("주문 취소 로직 실행");

        log.info("메서드 끝");
    }
}

  그리고 모든 메서드의 실행 시간을 재는 로직이 추가되어야 한다면??

  함수가 많으면 많을수록 코드를 유지보수하는 비용이 커지게된다.

  이때 발생하는 문제들을 템플릿 메서드 패턴으로 해결할 수 있다.



2. 템플릿 메서드 패턴이란?

상속을 활용하여 변하는 부분과 변하지 않는 부분을 분리하는 디자인 패턴 중의 하나이다.


  정의 자체는 좋아보인다. 어떻게 적용할 수 있을까?



3. 적용 후 코드

  첫 단계로 공통된 로직들을 추상화 해야한다.

@Slf4j
public abstract class AbstractTemplate {

    public void commonLogic() {
        log.info("메서드 시작");

        specificLogic();

        log.info("메서드 끝");
    }

    protected abstract void specificLogic();
}

  공통된 로직은 commonLogic()에 넣고, 바뀌는 부분은 AbstractTemplate을 상속받아 specificLogic을 Override 해주면 된다.

  그러면 적용 후 코드는 아래와 같은 모양이 된다.

@Slf4j
public class OrderTemplateMethod extends AbstractTemplate {
    @Override
    protected void specificLogic() {
        log.info("주문 로직 실행");
    }
}

@Slf4j
public class PayTemplateMethod extends AbstractTemplate {
    @Override
    protected void specificLogic() {
        log.info("결제 로직 실행");
    }
}

@Slf4j
public class CancelTemplateMethod extends AbstractTemplate {
    @Override
    protected void specificLogic() {
        log.info("주문 취소 로직 실행");
    }
}

  이제 공통된 요구사항이 변경되었을 때 AbstractTemplate을 수정하면 상속 받은 모든 클래스에 적용이 될 것이다.

  또한, 메인 로직은 공통 로직에 영향을 주지 않고, 쉽게 교체 할 수 있다.



4. 장단점

  • 장점
    • 공통 로직이 변경되었을 경우 하나의 추상 클래스만 수정하면, 수정된 내용들을 나머지 클래스에서도 반영할 수 있다.
    • 클래스 각각의 로직을 변경해도 공통 로직에 영향을 주지 않는다.
  • 단점
    • 상속을 사용했기 때문에 상속의 단점을 모두 가지고 있다.
      • 기능을 일부만 사용하지만, 부모 클래스의 모든 구현을 알고 있다. -> 캡슐화 위반
      • 컴파일 시점에 관계가 결정되어 결합도가 높아진다.
      • 하나를 수정하려면 불필요하게 다른 클래스들을 추가하거나 수정해야한다. -> 설계 유연 X, 클래스의 폭발




※ 출처

  • 스프링 핵심 원리 - 고급편
  • 상속보단 합성
  • [OOP] 코드의 재사용, 상속(Inheritance)보다 합성(Composition)을 사용해야 하는 이유
저작자표시 (새창열림)

'DESIGN_PATTERN' 카테고리의 다른 글

[Design Pattern] 전략 패턴  (2) 2023.02.22
  1. 0. 들어가기 전에
  2. 1. 템플릿 메서드 패턴 적용 전
  3. 2. 템플릿 메서드 패턴이란?
  4. 3. 적용 후 코드
  5. 4. 장단점
  6. ※ 출처
'DESIGN_PATTERN' 카테고리의 다른 글
  • [Design Pattern] 전략 패턴
쿠엔크
쿠엔크
우아한테크코스 5기 BE 에단 Github : https://github.com/cookienc
쿠엔크
기러기는 기록기록
쿠엔크
전체
오늘
어제
  • 분류 전체보기 (132)
    • CS (46)
      • [OS] (12)
      • [NETWORK] (10)
      • [DATABASE] (11)
      • [BASIC CONCEPT] (1)
      • [DATA STRUCTURE] (7)
      • [ALGORITHM] (5)
    • LANGUAGE (17)
      • [JAVA] (17)
    • DESIGN_PATTERN (2)
    • FRAMEWORK (18)
      • [SPRING] (18)
    • ORM (11)
      • JPA (11)
    • AWS (7)
    • BOOK (10)
      • [자바 웹 개발 워크북] (3)
      • [이펙티브 자바] (7)
    • 개발 (19)
      • [오류] (7)
      • [고민] (1)
      • [우테코] (10)
      • [iTracker] (1)
    • Tip (1)
      • [Plugins] (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 디자인 패턴
  • CORS
  • 알고리즘
  • 자료구조
  • Spring
  • Effective Java
  • 네트워크
  • 개념
  • 운영체제
  • ArgumentResolver
  • 데이터베이스
  • HTTP
  • JVM
  • 가비아
  • 스프링
  • java
  • 자바 웹 개발 워크북
  • aws
  • 오류
  • JPA

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
쿠엔크
[Design Pattern] 템플릿 메서드 패턴

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.