패키지 study.advanced.app.v2 생성 후
앞전 컨트롤러, 서비스, 레파지토리 파일을 복사한다.
TraceStatus status = trace.begin() 에서 반환 받은 TraceStatce에는 트랜잭션ID와 level 정보가 있는 traceId가 있다.
OrderService.orderItem()을 호출할 때 TraceId를 파라미터로 전달
TraceId를 파라미터로 전달하기 위해 OrderService2.orderItem()의 파라미터에 TraceId를 추가해야 한다.
package study.advanced.app.v2;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import study.advanced.trace.TraceStatus;
import study.advanced.trace.hellotrace.HelloTraceV2;
@RestController
@RequiredArgsConstructor
public class OrderControllerV2 {
private final OrderServiceV2 orderService;
private final HelloTraceV2 trace;
@GetMapping("/v2/request") //요청이 오면 아래 메서드가 호출
public String request(String itemId) {
TraceStatus status = null;
//예외가 되더라도 로그가 되게끔 try처리
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; // 예외를꼭 다시 던져주어야 한다.
}
}
}
package study.advanced.app.v2;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import study.advanced.trace.TraceId;
import study.advanced.trace.TraceStatus;
import study.advanced.trace.hellotrace.HelloTraceV2;
@Service
@RequiredArgsConstructor
public class OrderServiceV2 {
private final OrderRepositoryV2 orderRepository;
private final HelloTraceV2 trace;
public void orderItem(TraceId traceId, String itemId) {
TraceStatus status = null;
// 예외가 되더라도 로그가 되게끔 try처리
try {
status = trace.beginSync( traceId, "OrderService.orderItem()");
orderRepository.save(traceId, itemId);
trace.end(status);
} catch (Exception e) {
trace.exception(status, e);
throw e;
}
}
}
package study.advanced.app.v2;
import org.springframework.stereotype.Repository;
import lombok.RequiredArgsConstructor;
import study.advanced.trace.TraceId;
import study.advanced.trace.TraceStatus;
import study.advanced.trace.hellotrace.HelloTraceV2;
@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("예외발생");
}
//상품저장에 1초
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();
}
}
}
레벨이 추가되면 아이디값은 동일하게 잘 나오는걸 볼 수 있다.