템플릿 메서드 패턴

HoyongLee·2023년 2월 26일
0

로그 기능을 핵심 기능 내에 구현하면(예를 들어, 모든 메서드의 실행 시간을 측정하여 로깅하는) 핵심 기능을 구현할 때마다 로그 기능을 반복적으로 작성해야 한다는 번거로움이 있다.

좋은 설계의 특징 중 하나는, 변하는 부분(핵심 기능)과 변하지 않는 부분(부가 기능)을 분리하는 것이다.

템플릿 메서드 패턴을 통해 변하는 부분과 변하지 않는 부분을 분리하여 모듈화 할 수 있다.

템플릿 메서드 패턴

  • 부가 기능을 템플릿이라는 부분에 몰아두고, 변하지 않는 부분을 별도로 호출한다.
  • 단일 책임 원칙 을 지키기 때문에 변경이 발생하면 수정해야 할 부분이 적다.
    • 예를 들어, 모든 메서드의 실행 시간을 측정하는 부가 기능을 적용할 때, 메서드마다 로그 기능을 작성하게 되면 로그의 포맷이 바뀌면 모든 메서드를 전부 바꿔야 한다.
@Slf4j
public abstract class AbstractTemplate {
	
    public void execute() {
    	long startTime = 시작시간을 얻어온다();
        call(); // 핵심 기능
        long endTime = 종료시간을 얻어온다();
    }
    
    protected abstract void call();
}

부가 기능을 몰아둘 추상 템플릿 클래스이다.

public class SubjectClass1 extends AbstractTemplate{
	@Override
    protected void call() {
    	핵심 기능 구현;
    }
}

public class SubjectClass2 extends AbstractTemplate{
	@Override
    protected void call() {
    	핵심 기능 구현;
    }
}

추상 템플릿 클래스를 구현한 구체 클래스이다.

void run() {
	AbstractTemplate subject1 = new SubjectClass1();
    AbstractTemplate subject2 = new SubjectClass2();
    
    subject1.execute();
    subject2.execute();
}

다형성과 상속을 사용해서 템플릿 메서드를 구현할 수 있다.
핵심 기능이 되는 것은 추상 템플릿 클래스의 call() 메서드를 오버라이드하여 구체 클래스에서 구현한다.

템플릿 메서드 패턴의 목적
작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다. 따라서 하위 클래스의 알고리즘을 변경하지 않고 알고리즘의 특정 단계를 재정의 할 수 있다.
-GOF

문제점

  • 자식 클래스는 부모 클래스의 기능을 사용하지 않음에도 불구하고 부모 클래스와 자식 클래스가 강하게 결합되어 있다.
  • 부모 클래스가 변경되면 자식 클래스에 영향이 있을 수 있다.
  • 상속 구조를 사용하기 때문에 별도의 클래스나 내부 클래스를 만들어야 한다.

템플릿 메서드와 비슷한 역할을 하는데 상속의 단점을 제거하자! -> 전략 패턴


참고자료
Spring 핵심 원리 - 고급편(인프런, 김영한)

profile
아직 반지하

0개의 댓글

관련 채용 정보