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

25. 템플릿 콜백 패턴 적용

sdafdq 2024. 1. 17. 13:16
public interface TraceCallback<T> {
    T call();
}

콜백용 인터페이스 하나 만들고,

 

public class TraceTemplate {
    private final LogTrace trace;

    public TraceTemplate(LogTrace trace) {
        this.trace = trace;
    }

    public <T> T execute(String message, TraceCallback<T> callback){
        TraceStatus status = null;

        try{
            status = trace.begin(message);

//            로직
            T result = callback.call();

            trace.end(status);
            return result;
        } catch (Exception e){
            trace.exception(status, e);
            throw e;
        }
    }
}

적용.

 

저 <T> 이게 제너릭 쓴다는 거임.

<A> 이렇게 하면 A라는 이름으로 씀.

 

 

@GetMapping("/v5/request")
public String request(@RequestParam("itemId") String itemId){
    return template.execute("OrderController.request()",()->{
        orderService.orderItem(itemId);
        return "ok";
    });
}

사용.

 

return String으로 해서, 인터페이스도 제너릭이라서 String으로 정해짐.

 

public void save(String itemId){
    template.execute("OrderRepository.save()", ()->{
        if(itemId.equals("ex")){
            throw new IllegalStateException("예외 발생!!");
        }
        sleep(1000);
        return null;
    });
}

void는 이렇게 null 하면 됨.