Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Template Method - 예제2 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

Template Method - 예제2

Seung__ 2021. 11. 22. 19:14

1. Template Method Pattern


 

 

2. AbstractTemplate


  • 템플릿 메서드 패턴은 이름 그대로 템플릿을 사용하는 방식이다. 
  • 템플릿은 기준이 되는 거대한 틀이다.
  • 템플릿이라는 틀에 변하지 않는 부분을 몰아둔다. 
  • 그리고 일부 변하는 부분을 별도로 호출해서 해결한다.
  • AbstractTemplate 코드를 보자. 
  • 변하지 않는 부분인 시간 측정 로직을 몰아둔 것을 확인할 수 있다. 
  • 이제 이것이 하나의 템플릿이 된다. 
  • 그리고 템플릿 안에서 변하는 부분은 call() 메서드를 호출해서 처리한다.
  • 템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿 코드를 둔다. 
  • 그리고 변하는 부분은 자식 클래스에 두고 상속과 오버라이딩을 사용해서 처리한다.
@Slf4j
public abstract class AbstractTemplate {

    public void execute(){
        long startTime = System.currentTimeMillis();

        //변하는 부분
        call();

        //비즈니스 로직 종료
        long endTime = System.currentTimeMillis();
        long resultTime = endTime - startTime;
        log.info("resultTime = {}", resultTime);
    }


    protected abstract void call();
}

 

 

 

3. SubClassLogic1, 2


  • 변하는 부분을 처리함.
  • call()을 오버라이드 함.
@Slf4j
public class SubClassLogic1 extends AbstractTemplate{

    @Override
    protected void call() {
      log.info("비즈니스 로직1 실행");
    }
}
@Slf4j
public class SubClassLogic2 extends AbstractTemplate{

    @Override
    protected void call() {
      log.info("비즈니스 로직2 실행");
    }
}

 

 

 

4. Test


/**
 * 템플릿 메서드 패턴 적용
 */
@Test
void templateMethodV1(){

    AbstractTemplate template1 = new SubClassLogic1();
    template1.execute();

    AbstractTemplate template2 = new SubClassLogic2();
    template2.execute();
}
19:03:37.318 [main] INFO hello.advanced.trace.template.code.SubClassLogic1 - 비즈니스 로직1 실행
19:03:37.321 [main] INFO hello.advanced.trace.template.code.AbstractTemplate - resultTime = 5
19:03:37.325 [main] INFO hello.advanced.trace.template.code.SubClassLogic2 - 비즈니스 로직2 실행
19:03:37.325 [main] INFO hello.advanced.trace.template.code.AbstractTemplate - resultTime = 0

 

 

5. 정리


  • template1.execute() 를 호출하면 템플릿 로직인 AbstractTemplate.execute() 를 실행한다. 
  • 여기서 중간에 call() 메서드를 호출하는데, 이 부분이 오버라이딩 되어있다. 
  • 따라서 현재 인스턴스인 SubClassLogic1 인스턴스의 SubClassLogic1.call() 메서드가 호출된다.

 

  • 템플릿 메서드 패턴은 이렇게 다형성을 사용해서 변하는 부분과 변하지 않는 부분을 분리하는 방법이다.

 

6. GitHub : 211122 TeplateMethod example2


 

GitHub - bsh6463/Spring_Advanced: initial

initial. Contribute to bsh6463/Spring_Advanced development by creating an account on GitHub.

github.com

 

Comments