본문 바로가기
IT/Java

템플릿 메서드 패턴 예제(Template Method Pattern)

by 성준하이 2024. 10. 24.
반응형

디자인 패턴에 대해서 예제를 적어두고자 포스팅한다.

 

프로그래밍 코드를 짤 때 

변하는 부분과 변하지 않는 부분을 구분해서 개발을 해야한다.

 

실제로 개발을 진행하다보면 작게는 로그 찍는 부분부터
크게는 호출관계 도출을 위해 이력을 쌓거나 디비에 적재 등 공통 부분들이 상당히 많이 존재한다.

 

예를 들어,

A라는 서비스와 B라는 서비스를 호출하는 메인서비스 개발 하였고

서비스가 실행되기 전과 후에는 언제 실행이 되었는지 로그를 찍고, 호출 시간을 DB에 저장하는 로직이 있다고 하면

public class Test(){

     // A 서비스 관련
     log.info("서비스 실행");
     // A 비지니스 로직 실행
     // 현재 시간 DB 저장
     log.info("서비스 종료");

     // B 서비스 관련
     log.info("서비스 실행");
     // B 비지니스 로직 실행
     // 현재 시간 DB 저장
     log.info("서비스 종료");
}

위 서비스 2개는 비지니스 로직 실행 부분만 다르고 나머지에 대해서는 동일한 기능을 하는 코드가 중복으로 들어가있다.

 

그리고 만약 서비스가 수십개, 수백개가 되면 더욱 지저분하고 관리가 안되는 코드가 될 것이다.

 

이럴 경우 나머지 부분을 하나의 공통 템플릿으로 만들고, 변하는 비지니스 로직만 각각 짜주면

개발도 편하고 관리도 잘 되고 코드의 통일성 등 다양한 장점이 있다.

 

그럴 경우에 많이 사용되는 템플릿 메서드 패턴에 대한 예제를 정리한다.

 

위 예제 코드를 템플릿 메서드 패턴으로 변경해서 코드를 바꾸면,

 

  • 추상클래스로 공통 코드를 담을 템플릿을 하나 만든다.
    그리고 비지니스 로직을 담을 call 이라는 함수를 만들어줬다.
public abstract class AbstractTemplate {
     public void execute() {
          log.info("서비스 실행");
          //business logic start
          call();
          //business logic end
          // 현재 시간 DB 저장
          log.info("서비스 종료");
     }

     protected abstract void call();

}
  • 메인코드로 돌아가서 아래와 같이 익명클래스를 만들어주고 비지니스 로직을 그 안에 추상클래스를 오버라이드 해서 구현한다.
    그리고 객체에서 execute를 호출하여 사용을 한다.
public class Test(){

     // A 서비스 관련
     AbstractTemplate templateA = new AbstractTemplate(){
          @Override
          protected void call(){
              // A 비지니스 로직 실행
          }
     };
    templateA.execute();

     // B 서비스 관련
     AbstractTemplate templateB = new AbstractTemplate(){
          @Override
          protected void call(){
              // B 비지니스 로직 실행
          }
     };
    templateB.execute();
}

 

결과는 동일하게 나오고

다른 곳에서도 함께 사용하려면 익명클래스가 아니라 별도 클래스에서 구현해도 가능하다.

 

익명클래스, 추상클래스 관련해서는 아래 참고 포스팅 참고 바란다.

 


참고 포스팅

https://thenicesj.tistory.com/496

 

익명 클래스(anonymous class)란?

먼저 oracle 에서 소개하는 익명클래스에 대해서는 아래 링크에서 확인 가능하다. https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Cla

thenicesj.tistory.com

https://thenicesj.tistory.com/704

 

추상클래스와 인터페이스 차이점 (abstract VS interface)

권장하는 개발의 방향중 하나가 선언부와 구현부를 나누는 것이다.대부분 사람들이 인터페이스를 통해 메서드를 선언 하고 클래스에서 상속받아 구현를 하는 방향으로 개발을 진행한다. 이번

thenicesj.tistory.com

https://thenicesj.tistory.com/1050

 

Gof 디자인 패턴

디자인패턴에 대해서는 예전에 포스팅을 하였다.자세한 내용은 아래 참고 포스팅을 참고 바란다. 이번 포스팅은 Gof 에 대해서 알아보려고 한다. 디자인패턴을 말할때 Gof 디자인 패턴이라고 사

thenicesj.tistory.com

https://thenicesj.tistory.com/87

 

디자인패턴 정의와 종류

소프트웨어 개발을 할때 사용되는 디자인 패턴이란 과거에 소프트웨어 개발 과정에서 발견된 설계 노하우를 축적하여 그 방법에 이름이 붙여서 이후에 재사용 하기 좋은 형태로 특정 규약을 만

thenicesj.tistory.com

 

반응형

댓글