스프링/스프링 핵심 원리 - 고급편

18. 템플릿 메서드 패턴 예제

sdafdq 2024. 1. 14. 22:29
@Slf4j
public class TemplateMethodTest {
    @Test
    void templateMethodV0(){
        loginc1();
        loginc2();
    }

    private void loginc1(){
        long startTime = System.currentTimeMillis();

//        비즈니스 로직 실행
        log.info("비즈니스 로직1 실행");
//        비즈니스 로직 종료

        long endTime = System.currentTimeMillis();
        long resultTime = endTime - startTime;
        log.info("resultTime={}", resultTime);
    }

    private void loginc2(){
        long startTime = System.currentTimeMillis();

//        비즈니스 로직 실행
        log.info("비즈니스 로직2 실행");
//        비즈니스 로직 종료

        long endTime = System.currentTimeMillis();
        long resultTime = endTime - startTime;
        log.info("resultTime={}", resultTime);
    }
}

 

보면, logic1과 logic2의 다른 부분은 저렇게 비즈니스 로직 실행하는 부분이다.

 

그 외엔 완전히 같다. 

 

 

저렇게 완전히 같은 부분은 놔두고, 바뀌는 부분만 메소드로 처리하는.

 

템플릿이란 어떤 틀을 뜻하고, 거기에 로직을 메소드에 넣어서 처리 하는 것이 템플릿 메소드 패턴

 

@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();
}

이렇게 가상 클래스를 만들고, 

execute() 부분이 고정된 부분이며,

 

call()을 override 하여 바뀌는 부분을 처리할 것임.

 

@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");
    }
}

 

이렇게 바뀐 부분인 call만 override 하여 다르게 처리.

 

테스트

@Test
void templateMethodV1(){
    AbstractTemplate template1 = new SubClassLogic1();
    template1.execute();
    AbstractTemplate template2 = new SubClassLogic2();
    template2.execute();
}

문제없음.

 

바뀐 부분, 공통적인 로직의 부분, 다 문제없이 실행.

 

 

하지만 나는 좀 불만임.

로직 다르다고 매번 새 클래스를 만들어 하기에는 좀..

 

그리고 비즈니스 로직이 곧대로 안 보인다는 것도..

예를 들면 로직이 가려져 있고 클래스를 생성하고 호출하여 사용한 다는 점.

'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글

20. 템플릿 메서드 패턴 적용  (0) 2024.01.15
19. 익명 클래스  (0) 2024.01.15
17. 템플릿 메서드 패턴  (0) 2024.01.14
16. 쓰레드로컬 주의사항  (0) 2024.01.14
15. 쓰레드로컬 적용  (0) 2024.01.14