본문 바로가기
프로그래밍/kotlin

[디자인 패턴] 템플릿 메서드 패턴이란

by 뜨끔쓰 2022. 9. 14.
728x90
728x90
인프런의 김영한님의 강의 스프링 핵심 원리 - 고급편을 학습하며 정리한 글입니다.

 

스프링 핵심 원리 - 고급편 (인프런)

 

스프링 핵심 원리 - 고급편 - 인프런 | 강의

스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

템플릿 메서드 패턴이란?

템플릿 메서드 패턴은 이름 그대로 템플릿을 작성하여 사용하는 방식이다. 템플릿은 기준이 되는 거대한 틀이다.

템플릿에 변하지 않고 중복적인 코드들을 몰아두며 일부 변하는 부분을 별도로 호출해서 해결하는 패턴이다.

알게 모르게 객체지향 언어로 개발을 하다보면 무의식적으로 사용하는 패턴이라고 생각된다.

 

 

직접 예제를 보며 확인해보자. 일단 템플릿을 작성해보자.

 

AbstractTemplate
abstract class AbstractTemplate<T>(
    val trace: LogTrace
) {
    fun execute(message: String): T {
        val status = trace.begin(message)
        try{
            // 로직 호출
            val result = call()

            trace.end(status)
            return result
        } catch (e: Exception){
            trace.exception(status, e)
            throw e
        }
    }

    protected abstract fun call(): T

}

코드에서 보다시피 로그추적기의 trace를 주입받아 execute 메서드를 구현 해주고있다.

 

추상메서드 call을 자식 클래스에서 상속받아 핵심 로직들을 call 메서드에 구현하면 로그 추적기의 탑재가 가능하다!

 

아주 심플하지 않은가!?

 

이제 작성한 템플릿을 이용하여 클래스를 작성 해보도록 합시다.

 

OrderControllerV4
@RestController
class OrderControllerV4(
    private val orderService: OrderServiceV4,
    private val trace: LogTrace,
) {

    @GetMapping("/v4/request")
    fun request(itemId: String): String{

        /* 익명 내부 클래스로 구현 */
        val template = object:AbstractTemplate<String>(trace){
            override fun call(): String {
                orderService.orderItem(itemId)
                return "ok"
            }

        }
        return template.execute("OrderController.request()")

    }
}

template 객체를 생성할때 기존에 작성한 AbstractTemplate를 익명내부 클래스로 call메서드내부에 비즈니스 로직을 구현하여 객체를 생성한다.

그리고 템플릿 내부의 execute 메서드를 호출하여 사용 하는것이 템플릿 메서드 패턴이다.

 

이렇게하면 일일히 로그관련 로직들을 직접 OrderControllerV4 클래스내부에 구현하지 않아도 마치 템플릿 처럼 미리 구현해둔 로직을 이용할 수 있다.

 


 

템플릿 메소드 패턴의 장단점

장점

  1. 중복코드를 줄일 수 있다.
  2. 핵심 로직을 제외한 나머지 로직을 템플릿 메소드에 위임하여 핵심로직에 집중이 가능하다.
  3. 객체 지향적인 설계가 가능하다.

단점

  1. 상속에서 오는 단점을 그대로 안고간다.
    => 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합되는 문제가 있다.
    => 자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않기 때문에 불필요한 상속의 증가
  2. 추상 메서드가 많아져 클래스 관리가 복잡해 질 수 있다.

 

간단하게 배웠던 점을 정리 해보았습니다.

 

추가로 부족하거나 잘못된 점이 있다면 언제든 댓글로 피드백 부탁드리겠습니다.

 

감사합니다.

 

 

728x90
반응형

댓글