privatevoidlogic1(){ longstartTime= System.currentTimeMillis(); // 비즈니스 로직 실행 log.info("비즈니스 로직1 실행"); // 비즈니스 로직 종료 longendTime= System.currentTimeMillis(); longresultTime= endTime - startTime; log.info("resultTime = {}", resultTime); }
privatevoidlogic2(){ longstartTime= System.currentTimeMillis(); // 비즈니스 로직 실행 log.info("비즈니스 로직1 실행"); // 비즈니스 로직 종료 longendTime= System.currentTimeMillis(); longresultTime= endTime - startTime; log.info("resultTime = {}", resultTime); } }
Template Method 패턴 적용 후
로그를 찍은 공통적인 로직 을 묶어 하나의 Template 을 만들어준다. 추상화된 Method 를 Template 내에 넣어줌으로써 하위 객체에서 각각의 비즈니스 로직을 구현하도록 한다. 이를 통해 비즈니스 로직 실행시 시작 시간과 종료시간에 대한 로그를 찍고 싶은 객체는 AbstractTemplate 객체를 상속해 구현하면 된다.
02:25:23.488 [Test worker] INFO com.example.advancedspring.trace.template.TemplateMethodTest - 비즈니스 로직 1 실행 02:25:23.491 [Test worker] INFO com.example.advancedspring.trace.template.code.AbstractTemplate - resultTime = 5 02:25:23.493 [Test worker] INFO com.example.advancedspring.trace.template.TemplateMethodTest - 비즈니스 로직 2 실행 02:25:23.493 [Test worker] INFO com.example.advancedspring.trace.template.code.AbstractTemplate - resultTime = 0
익명 내부 클래스 사용하기
템플릿 메서드 패턴은 클래스를 계속 만들어 줘야 하는 단점이 있다. 익명 내부 클래스를 사용하면 해당 단점을 보완할 수 있다.
02:25:23.488 [Test worker] INFO com.example.advancedspring.trace.template.TemplateMethodTest - 비즈니스 로직 1 실행 02:25:23.491 [Test worker] INFO com.example.advancedspring.trace.template.code.AbstractTemplate - resultTime = 5 02:25:23.493 [Test worker] INFO com.example.advancedspring.trace.template.TemplateMethodTest - 비즈니스 로직 2 실행 02:25:23.493 [Test worker] INFO com.example.advancedspring.trace.template.code.AbstractTemplate - resultTime = 0