본문 바로가기

Design Pattern

[Design Pattern] Template Method Pattern

* 해당 블로그의 모든 내용과 사진은 아래 참고자료를 작성하였습니다.

 

#11 TMP 패턴 (TMP Pattern)

단순하게 비즈니스 로직의 시간을 측정하는 상황이 있다고 가정하겠습니다.

 

 

위의 코드를 보시면 알다싶이 비즈니스 로직의 시간을 측정하는데 필요한 코드는 어느 메서드나 중복이 되는것을 알 수 있습니다. 

하지만 저 중복되는 코드를 메서드화 시키기엔 어려워보입니다. 또한 시간측정의 예시가 아닌 다른 예시로써 try-catch 가 들어가게 된다면 더욱 메서드화 시키기 어려워 보입니다. 

또한 매 매서드 마다 저런식의 코드를 추가 시킨다면 가독성이 정말 떨어질 것으로 예상됩니다.

 

유지보수하기 쉬운 코드를 설계 하기위해선 변할 수 있는 부분변하지 않는 부분을 잘 나눠놔야합니다.

해당 예시에선 비즈니스 로직이 변할 수 있는 부분이고, 시간을 재는 부분이 변하지 않는 부분입니다.

위와같은 문제를 해결하고, 변할 수 있는 부분변하지 않은 부분을 잘 나눠놓기위한 템플릿 메서드 패턴이 있습니다.

 

 

위의 그림은 템플릿 메서드 패턴입니다. 보이시는 것과 같이 추상 템플릿이 존재합니다.

해당 추상 템플릿변하지 않는 부분을 몰아넣는 것입니다. 즉, 말 그대로 템플릿을 사용하는 것입니다.

그 후 변하는 부분은 위의 그림에선 call() 이라는 메서드를 이용해 처리합니다.

 

이해를 위해 예시를 들겠습니다.

 

 

해당 코드와 같이 call() 이라는 메서드를 두어 자식 클래스가 상속받아 오버라이딩하여 사용할 수 있게 설계를 해놓습니다.

 

 

그래서 이런식으로 사용할 수 있습니다.

하지만 이렇게만 사용한다면 사용할 때마다 클래스를 SubClassLogic과 같은 클래스를 계속 생성해야된다는 단점이 존재합니다.

이를 위해 익명 내부 클래스가 존재합니다.

 

 

이런식으로 클래스를 따로 생성하지 않더라도 바로 오버라이딩해서 사용할 수 있습니다.

 

좋은 설계란?

 

변경이 일어날 때 자연스럽게 드러납니다.

TMP패턴은 단일 책임 원칙을 잘 지킴으로써 변경에 쉽게 대처할 수 있는 구조입니다.

 

템플릿 메서드 디자인 패턴의 목적은 "작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의 할 수 있습니다."

따라서 상속과 오버라이딩을 통한 다형성으로 문제를 해결합니다.

 

하지만 상속의 단점을 그대로 가지고왔는데, 컴파일 시점에 자식클래스와 부모클래스가 강결합된다는 단점이 있습니다.

즉, 자식 클래스는 부모 클래스를 사용하고 있지도 않지만 패턴때문에 상속을 받고있습니다.

 

템플릿 메서드 패턴과 비슷한 역할을 하며 상속의 단점을 제거할 수 있는 패턴이 전략패턴입니다.

 

전략패턴 (Strategy Pattern)

템플릿 메서드 패턴은 변하지 않는 부분은 템플릿에 두고, 변하는 부분을 상속받아 해결했다면,

전략 패턴은 변하지 않는부분을 Context에 두고, 변하는 부분을 Strategy 라는 인터페이스를 만들고, 해당 인터페이스에서 구현하도록 해서 문제를 해결합니다.

 

전략 패턴의 목적은 "알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들고 따라서 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다." 입니다.

 

 

위의 보이는 그림과 같이 기존 템플릿 메서드 패턴은 변하지않는 부분을 모두 자식 클래스가 상속받았지만

해당 그림에서는 변하지 않는 부분 Strategy라는 인터페이스에 의존을 하여 이를 갈아끼우는 식의 패턴을 사용합니다.

 

즉, ContextStrategy를 원하는 모양으로 조립해두고, 그 다음 Context를 실행하는 선 조립, 후 실행 방식이여서 매우 유용합니다. 

 

이 방식의 단점은 ContextStrategy를 조립한 이후에는 전략을 변경하기 번거롭다는 점입니다.

 


 

● 참고자료 : 스프링 핵심원리 - 고급편 (김영한 | 인프런)

'Design Pattern' 카테고리의 다른 글

[Design Pattern] Proxy Pattern, Decorator Pattern  (0) 2023.06.01
[Design Pattern] 디자인 패턴  (1) 2023.01.02