로직을 구현하다보면 동일한 로직을 여러 함수의 사용할때가 있다.
이때 함수마다 변하는 기능과 변하지 않는 기능을 구분할 수 있는데
이러한 패턴 디자인을 템플릿 메서드 패턴이라고 한다.
먼저 템플릿 메서드 패턴을 적용하지 않은 예제를 보면
@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를 통하여 따로 파일을 생성하지 않고 호출할 수 있다.
'개발일기 > Spring' 카테고리의 다른 글
[Spring]ThreadLocal (0) | 2024.04.01 |
---|---|
[Spring]로그 추적기 (0) | 2024.04.01 |
[Spring]@PostConstruct와@PreDestory (0) | 2024.03.21 |
[Spring]@autowired , @qualifier , @primary (0) | 2024.03.20 |
[Spring]@ComponentScan , @Component , @Autowired (0) | 2024.03.18 |