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
관리 메뉴

개발자되기 프로젝트

로그 추적기 V2 - 적용 본문

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

로그 추적기 V2 - 적용

Seung__ 2021. 11. 20. 11:34

1. V2 적용하기


  • 메서드 호출의 깊이를 표현하고, HTTP 요청도 구분해보자.
  • 이렇게 하려면 처음 로그를 남기는 OrderController.request() 에서 로그를 남길 때 
  • 어떤 깊이와 어떤  트랜잭션 ID를 사용했는지 
  • 다음 차례인 OrderService.orderItem() 에서 로그를 남기는 시점에  알아야한다.
  • 결국 현재 로그의 상태 정보인 트랜잭션ID 와 level 이 다음으로 전달되어야 한다.
  • 이 정보는 TraceStatus.traceId 에 담겨있다. 
  • 따라서 traceId 를 컨트롤러에서 서비스를 호출할 때 넘겨주면 된다.

 

 

2. Controller


  • Controller에서 로그를 처음 남김.
  • 현재 status의 TraceId 정보를 Service계층에 넘겨줌.
@RestController //@Controller +@ResponseBody
@RequiredArgsConstructor
public class OrderControllerV2 {

    private final OrderServiceV2 orderService;
    private final HelloTraceV2 trace;

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

        TraceStatus status = null;

        try{
            status = trace.begin("OrderController.request()");
            orderService.orderItem(status.getTraceId(), itemId);
            trace.end(status);
            return "ok";
        }catch (Exception e){
            trace.exception(status, e);
            throw e; //예외를 반드시 다시 던져줘야 함.
        }
    }
}

 

 

 

3. Service


  • Controller에서 받은 TraceId 정보를 가지고 새로운 Status 정보를 생성.
    • id동일, level 1증가
  • 새로 만들어진 status 정볼를 Repository 계층에 넘겨줌.
@Service
@RequiredArgsConstructor
public class OrderServiceV2 {

    private final OrderRepositoryV2 orderRepository;
    private final HelloTraceV2 trace;

    public void orderItem(TraceId traceId, String itemId){

        TraceStatus status = null;

        try{
            status = trace.beginSync(traceId, "OrderService.orderItem()");
            orderRepository.save(status.getTraceId(), itemId);
            trace.end(status);
        }catch (Exception e){
            trace.exception(status, e);
            throw e; //예외를 반드시 다시 던져줘야 함.
        }

    }
}

 

 

 

4. Repository


  • Service에서 받은 TraceId 정보를 가지고 beginSync() 호출.
  • id동일, level 1증가
@Repository
@RequiredArgsConstructor
public class OrderRepositoryV2 {

    private final HelloTraceV2 trace;

    public void save(TraceId traceId, String itemId){

        TraceStatus status = null;

        try{
            status = trace.beginSync(traceId, "OrderRepository.save()");

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

            trace.end(status);
        }catch (Exception e){
            trace.exception(status, e);
            throw e; //예외를 반드시 다시 던져줘야 함.
        }


    }

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

 

 

5. 실행


  • 각 요청마다 id구분이 확실하게 됨.
  • 정상
[34dd4c36] OrderController.request()                 
[34dd4c36] |-->OrderService.orderItem()              
[34dd4c36] |  |-->OrderRepository.save()             
[34dd4c36] |  |<--OrderRepository.save() time=1013ms 
[34dd4c36] |<--OrderService.orderItem() time=1013ms  
[34dd4c36] OrderController.request() time=1015ms
  • 예외

[daf636b4] OrderController.request()
[daf636b4] |-->OrderService.orderItem()
[daf636b4] |  |-->OrderRepository.save()
[daf636b4] |  |<X-OrderRepository.save() time=0ms ex=java.lang.IllegalStateException: 예외 발생
[daf636b4] |<X-OrderService.orderItem() time=1ms ex=java.lang.IllegalStateException: 예외 발생
[daf636b4] OrderController.request() time=1ms ex=java.lang.IllegalStateException: 예외 발생

 

 

 

6. GitHub :211119 Log Tracer V2


 

GitHub - bsh6463/Spring_Advanced: initial

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

github.com

 

Comments