백엔드/Spring

[Spring] Template Method

kwang2134 2024. 10. 31. 15:48
728x90
반응형
728x90

Template Method 패턴

  • 디자인 패턴 중 하나로 상위 클래스에서 로직을 정의하고 일부 단계를 하위 클래스에서 구체적으로 구현하도록 하는 패턴
  • 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 방식

사용 방법

  • 공통된 로직을 정의한 부모 클래스를 생성
  • 사용마다 변경되는 부분을 상속을 통해 자식 클래스에서 구현하게 정의
  • 자식 클래스는 부모 클래스를 상속 받아 해당 메서드를 구현
//부모 클래스
public abstract class ParentClass {

    public final void execute() {
        long startTime = System.currentTimeMillis();	//공통 로직
        
        beforeCall();    // 선택적인 훅 메서드
        call();          // 반드시 구현해야 하는 추상 메서드
        afterCall();     // 선택적인 훅 메서드
        
        long endTime = System.currentTimeMillis();	//공통 로직
        long resultTime = endTime - startTime;		//공통 로직
        log.info("resultTime={}", resultTime);		//공통 로직
    }

    // 훅(Hook) 메서드 - 선택적으로 오버라이딩 가능
    protected void beforeCall() {
        // 기본 구현은 비어있음
    }
    
    protected void afterCall() {
        // 기본 구현은 비어있음
    }
    
    //protected를 사용해 템플릿 메서드 패턴의 내부 동작을 외부에 노출하지 않고 
    //상속 관계에서만 접근 가능하도록 캡슐화
    protected abstract void call();			//자식 클래스에서 반드시 구현해야 하는 추상 메서드
}

//자식 클래스
public class ChildClass extends ParentClass{
    @Override
    protected void call() {
        log.info("로직 실행");    // 구체적인 로직 구현
    }
    
    @Override
    protected void beforeCall() {
        log.info("로직 실행 전 처리");
    }
}

//익명 클래스 사용 
ParentClass template = new ParentClass() {
    @Override
    protected void call() {
        log.info("로직 실행");
    }
};
template.execute();

장점

  • 공통 로직을 상위 클래스에 두어 중복을 줄임
  • 로직 구조는 유지하면서 하위 클래스에서 세부 구현만 변경가능
  • 알고리즘의 흐름을 일관되게 유지할 수 있음

단점

  • 상위 클래스의 변경이 하위 클래스에 영향을 줄 수 있음 -> 특정 클래스를 강하게 의존
  • 상속을 사용하는 방법으로 상속이 가져오는 문제점을 그대로 가져옴
    • 하위 클래스에서 상위 클래스의 로직을 전혀 사용하지 않으나 상속 받아야 함

스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런 강의 내용 참고

728x90

'백엔드 > Spring' 카테고리의 다른 글

[Spring] Proxy & Decorator Pattern  (0) 2024.11.02
[Spring] Strategy & Template Callback  (0) 2024.11.01
[Spring] Thread Pool & ThreadLocal  (0) 2024.10.30
[Spring] 모니터링 환경 구성  (0) 2024.10.12
[Spring] Actuator  (0) 2024.10.08