스프링/스프링 핵심 원리 - 고급편

20. 템플릿 메서드 패턴 적용

sdafdq 2024. 1. 15. 13:35
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