Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Template CallBack - 2 본문

인프런/[인프런] 스프링 핵심 원리 - 고급

Template CallBack - 2

Seung__ 2021. 11. 22. 23:50

1. Callback


public interface TraceCallback<T> {

    T call();
}

 

 

 

2. TraceTemplate


  • TraceTemplate 는 템플릿 역할을 한다.
  • execute(..) 를 보면 message 데이터와 콜백인 TraceCallback callback 을 전달 받는다.
  • <T> 제네릭을 사용했다. 반환 타입을 정의한다.
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;
        }
    }
}

 

 

3. Controller V5


@RestController //@Controller +@ResponseBody
//@RequiredArgsConstructor
public class OrderControllerV5 {

    private final OrderServiceV5 orderService;
    private final TraceTemplate traceTemplate;

    public OrderControllerV5(OrderServiceV5 orderService, LogTrace trace) {
        this.orderService = orderService;
        this.traceTemplate = new TraceTemplate(trace);
    }

    @GetMapping("/v5/request")
    public String request(String itemId){

       return traceTemplate.execute("OrderController.request()", new TraceCallback<>() {
            @Override
            public String call() {
                orderService.orderItem(itemId);
                return "ok";
            }
        });

    }
}
  • this.template = new TraceTemplate(trace)
    • trace 의존관계 주입을 받으면서 필요한 TraceTemplate 템플릿을 생성한다. 
    • 참고로 TraceTemplate 를 처음부터 스프링 빈으로 등록하고 주입받아도 된다. 이 부분은 선택이다.
  • template.execute(.., new TraceCallback(){..})
    • 템플릿을 실행하면서 콜백을 전달한다.
    • 여기서는 콜백으로 익명 내부 클래스를 사용했다.

 

 

4. ServiceV5


@Service
public class OrderServiceV5 {

    private final OrderRepositoryV5 orderRepository;
    private final TraceTemplate template;

    public OrderServiceV5(OrderRepositoryV5 orderRepository, LogTrace trace) {
        this.orderRepository = orderRepository;
        this.template = new TraceTemplate(trace);
    }

    public void orderItem(String itemId){

        template.execute("OrderService.orderItem()", () -> {
            orderRepository.save(itemId);
            return null;
        });
    }
}

 

  • template.execute(.., new TraceCallback(){..}) : 템플릿을 실행하면서 콜백을 전달한다.
  • 여기서는 콜백으로 람다를 전달했다.

 

5. RepositoryV5


@Repository
public class OrderRepositoryV5 {

   private final TraceTemplate template;

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

    public void save(String itemId){

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

    }

    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

 

6. GitHub : 211122 Template Callback2


 

GitHub - bsh6463/Spring_Advanced: initial

initial. Contribute to bsh6463/Spring_Advanced development by creating an account on GitHub.

github.com

 

'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글

Proxy Pattern - V1  (0) 2021.11.23
정리 및 한계  (0) 2021.11.23
Template CallBack - 1  (0) 2021.11.22
Template CallBack - 시작  (0) 2021.11.22
Strategy Pattern - 3  (0) 2021.11.22
Comments