@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 |