본문 바로가기

개발일기/Spring

[Spring]템플릿 메서드 패턴#1

728x90
반응형

로직을 구현하다보면 동일한 로직을 여러 함수의 사용할때가 있다.

이때 함수마다 변하는 기능과 변하지 않는 기능을 구분할 수 있는데

이러한 패턴 디자인을 템플릿 메서드 패턴이라고 한다.

먼저 템플릿 메서드 패턴을 적용하지 않은 예제를 보면

 

@Test
    void templateMethodV0(){
        logic1();
        logic2();
    }

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

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

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

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

@ loginc1과 logic2를 보면 시간을 계산하는 부분과 계산된 시간을 출력하는 부분은 동일하며 '비즈니스 로직1 실행' , '비즈니스 로직2 실행' log를 출력하는 부분문 다른것을 확인할 수 있다. 

@ 이러한 변하지 않는 부분과 변하는 부분을 나누어 로직을 구현할때 java 다형성을 이용한 템플릿 메소드 패턴을 사용할 수 있다.

 

1,AbstractTemplate

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

@ AbstractTemplate 라는 추상화 Class를 만들었다.

@ execute부분을 보면 위에서 작성한 시간을 계산하는 로직(변하지 않는) 을 이부분에 구현하였고 , 변하는 부분은 call 함수를 통해 수행한다.

 

2,SubClassLogic1 , SubClassLogic2

 

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

@ 각각 변하는 부분은 AbstractTemplate를 상속받아 override 한 함수를 사용한다.

 

3-1,호출(Class 파일을 만들어 호출)

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

@ Java의 다형성을 이용하여 각각의 SubClassLogic을 생성하여 execute 함수를 호출하면 원하는 결과를 출력할 수 있다.

 

3-2,호출(익명 Class로 호출)

@Test
    void templateMethodV2(){
        AbstractTemplate template1 = new AbstractTemplate() {
            @Override
            protected void call() {
                log.info("비즈니스 로직1");
            }
        };
        template1.execute();

        AbstractTemplate template2 = new AbstractTemplate() {
            @Override
            protected void call() {
                log.info("비즈니스 로직2");
            }
        };
        template2.execute();
    }

@ 3-1번처럼 Class 파일을 직접만들어 호출 할 수 도있지만, 익명 Class를 통하여 따로 파일을 생성하지 않고 호출할 수 있다.

728x90
반응형

'개발일기 > Spring' 카테고리의 다른 글