이번 포스트는 인프런 - 스프링 핵심 원리 고급편을 정리한 내용입니다.
템플릿 메서드 패턴은 GoF의 디자인 패턴중 행위 패턴중 하나입니다

출처: https://engineering.linecorp.com/ko/blog/templete-method-pattern
템플릿 메서드 패턴으로 모순 없는 상태 보장하기
시작하기 전에 안녕하세요. LINE Pay의 iOS 개발을 맡고 있는 정지인입니다. LINE Pay iOS의 결제 기능을 리팩토링하는 데에 적용했던 템플릿 메서드 패턴을 이용한 계약 기반 프로그래밍 기법에 대해
engineering.linecorp.com
이 패턴은 서비스 로직에서 비즈니스 로직과 운영에 필요한 부가 코드들을 분리할때 유용하게 쓰입니다
부가 코드가 구조가 동일할때 중복 코드를 제거하고 코드 응집도를 높일 수 있습니다
패턴 구조
추상 메서드를 가진 추상 클래스가 있고, 추상 클래스(AbstractClass)를 확장한 실질적으로 비즈니스 서비스를 수행할 클래스(ConcreteClass)가 있습니다
비즈니스 로직을 수행하는 ConcreteService1, ConcreteService2 가 있고
운영에 필요한 부가 코드들이 있다고 가정해봅니다
@Slf4j
public class ConcreteService1 extends Template {
@Override
protected void call() {
log.info(SubClassLogic1.class.getName() + " 로직 실행");
}
}
@Slf4j
public abstract class Template {
public void execute() {
// 비즈니스 로직 전에 실행할 부가 로직
sth();
//비즈니스 로직 실행
call(); //상속
//비즈니스 로직 종료
}
protected abstract void call();
}
클라이언트 코드에서는 ConcreteService1를 주입하되 Template으로 타입을 선언하여 다형성을 통해 각 비즈니스 로직을 수행하면서
비즈니스 로직에 공통으로 부가 코드가 실행되도록 구성할 수 있습니다
이렇게 함으로써 ConcreteService에서는 비즈니스 로직만 관리할 수 있어 PR리뷰에서 봐야할 코드가 적어지고, 비즈니스 로직이 아닌 로직은 Template에서 관리되어 코드 응집도를 높여서 프로젝트 전체의 유지보수성이 높아집니다.
템플릿 메서드 패턴은 추상클래스를 각 구현클래스에서 상속하기 때문에 상속에서 오는 단점들, 부모 클래스의 기능을 사용하지 않더라도 강결합이 되는 문제가 있습니다. 부모 클래스가 복잡해지면 보이지 않은 코드 강결합으로 인해 어느 시점부터는 코드 수정이 까다로워질수 있습니다
전략 패턴에서 템플릿 메서드 패턴의 단점을 보완할 수 있습니다
'디자인패턴' 카테고리의 다른 글
SOLID - SRP (0) | 2024.09.19 |
---|---|
소프트웨어 설계원칙 - 관심사 분리 (0) | 2024.08.07 |
전략패턴 (0) | 2024.06.16 |