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

10. 필드 동기화 적용

sdafdq 2024. 1. 14. 19:14

그냥 뭐 비슷함

 

@GetMapping("/v3/request")
public String request(@RequestParam("itemId") String itemId){
    TraceStatus status = null;
    try{
        status = trace.begin("OrderController.request()");
        orderService.orderItem(itemId);
        trace.end(status);
        return "ok";
    } catch (Exception e){
        trace.exception(status, e);
        throw e;
    }
}

 

begin, 컨트롤러에서 처음 호출 하는 거니 new 해서 새로 holder에 들어갈 거고,

 

 

서비스

public void orderItem(String itemId){
    TraceStatus status = null;
    try{
        status = trace.begin("OrderService.orderItem()");

        orderRepository.save(itemId);

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

이제 보면 begin안에 sync(holder에 없으면 새로 만들고 있으면 레벨 올리고)가 따로 있기 때문에, 그냥 begin으로 호출하면 된다.

 

 

리포지토리

public void save(String itemId){
    TraceStatus status = null;
    try{
        status = trace.begin("OrderRepository.save()"); // 현재 메소드 명

        if(itemId.equals("ex")){
            throw new IllegalStateException("예외 발생!!");
        }

        sleep(1000);

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

 

 

다른 점은 이제 beginSync가 아니라 begin으로 호출하고, 또 따로 traceId 객체를 받지 않는다.

 

 

'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글

12. 동시성 문제 예시  (0) 2024.01.14
11. 동시성 문제  (0) 2024.01.14
9. 필드 동기화  (0) 2024.01.14
8. V2 정리  (0) 2024.01.14
7. V2 적용  (0) 2024.01.14