본문 바로가기

Design/Design Pattern

[Design Pattern] Template Method Pattern

이번 장에서는 템플릿 메소드(Template Method) 패턴에 대해서 알아보도록 한다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


이번 템플릿 메소드 패턴은 "데이터 베이스"에 데이터를 Insert, Select하는 과정을 접목시켜 알아보겠다.

템플릿 메소드 패턴이란?

특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴이라고 많은 곳에 나와있다.

조금 쉽게 풀어보면

  • 확장 및 수정이 자주 일어나는 코드는 서브 클래스에서 구현하고
  • 중복되고 공통적으로 사용되는 코드는 상위 클래스에서 관리한다.

쉽게 적는다고 적었는데도 쉽지가 않다.
그림을 보면서 알아보도록 하겠다.

GoF Design Patterns에 따르면 아래와 같은 Class Diagam이 그려진다.

AbstractClass는 TemplateMethod()를 구현하고 있으며 PrimitiveOperation1, PrimitiveOperation2 추상 메소드를 가지고 있다.
ConcreteClass는 PrimitiveOperation1과 PrimitiveOperation2를 구현하고 있으며 구현된 메소드는 AbstractClass의 TemplateMethod에 의해서 조립된다.

위의 설명을 "데이터 베이스"에 접목시켜보면 조금 쉽게 다가올 것이다.

DB에 접근하고자하는 User가 있다.
DBClient라는 추상 클래스가 있으며 DB에 연결하는 connect, 트랜잭션을 시작하는 startTransaction, 트랜잭션을 종료하는 commit,
DB와의 연결을 해제하는 disconnect 추상 메소드가 있다. 이러한 메소드를 조합하여 실제로 데이터를 삽입하는 insert, 데이터를 조회하는 select라는
템플릿 메소드가 있다.

코드로 보면서 하나씩 살펴보도록 한다.

DBClient는 connect, startTransaction, commit, disconnection 추상 메소드를 가지고 있다.
데이터를 저장하는 insert라는 템플릿 메소드를 호출하면
connect -> transaction 시작 -> 데이터 삽입 -> commit -> disconnect 과정을 거쳐서 데이터를 insert하게 된다.
여기서 주목해야하는 점은 User는 데이터를 insert할 때의 관심사는 정상적으로 insert가 되었는가 이다.
DB와의 connection이 잘 되는지 transaction이 잘 시작되었는지는 User의 관심사가 아니다.

(다만 추상 메소드로 만들 때 private 접근자는 사용이 불가능하여 완벽한 캡슐화는 아니라고 생각한다.)

DBClient Abstract Class

DBClient를 구현하는 MariaDBClient는 connect, transaction, commit, disconnect 메소드를 구현하고 있다.

MariaDBClient Class

데이터를 삽입하고 조회하려는 User는 내부적인 동작을 몰라도 단순히 insert, select 템플릿 메소드를 호출하는 것 만으로
원하는 결과를 얻어낼 수 있다.

User Class

코드 작동 결과는 아래와 같다.


지금까지 템플릿 메소드 패턴을 DB에 접근하여 데이터를 삽입하고 조회하는 과정에 비유하여 알아보았다.

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

[Design Pattern] Prototype Pattern  (0) 2022.02.01
[Design Pattern] Singleton Pattern  (0) 2022.02.01
[Design Pattern] Factory Method Pattern  (0) 2022.02.01
[Design Pattern] Adapter Pattern  (0) 2022.01.28
[Design Pattern] Strategy Pattern  (0) 2022.01.26