public abstract class AbstractTemplate<T> {
private final LogTrace trace;
protected AbstractTemplate(LogTrace trace) {
this.trace = trace;
}
public T execute(String message){
TraceStatus status = null;
try{
status = trace.begin(message);
// 로직
T result = call();
trace.end(status);
return result;
} catch (Exception e){
trace.exception(status, e);
throw e;
}
}
protected abstract T call();
}
이렇게 가상 클래스로,
execute에 위 아래로 LogTrace 로직으로 감싸주고,
저 call을 override 하면서 사용할 것.
@GetMapping("/v4/request")
public String request(@RequestParam("itemId") String itemId){
AbstractTemplate<String> template = new AbstractTemplate<>(trace) {
@Override
protected String call() {
orderService.orderItem(itemId);
return "ok";
}
};
return template.execute("OrderController.request()");
}
이런 식으로.
정의 하면서, execute로 실행.
public void save(String itemId){
AbstractTemplate<Void> template = new AbstractTemplate<>(trace) {
@Override
protected Void call() {
if(itemId.equals("ex")){
throw new IllegalStateException("예외 발생!!");
}
sleep(1000);
return null;
}
};
template.execute("OrderRepository.save()");
}
제너릭은 void는 안돼고,
Void로 객체로 따로 제공을 해 줌.
return은 null로 하면 됨.
'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글
22. 전략 패턴 익명 및 람다 (0) | 2024.01.17 |
---|---|
21. 전략 패턴 (0) | 2024.01.17 |
19. 익명 클래스 (0) | 2024.01.15 |
18. 템플릿 메서드 패턴 예제 (0) | 2024.01.14 |
17. 템플릿 메서드 패턴 (0) | 2024.01.14 |