Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- springdatajpa
- 그리디
- jpa
- JPQL
- java
- pointcut
- transaction
- 알고리즘
- http
- 스프링 핵심 기능
- 자바
- 김영한
- 백준
- Android
- Thymeleaf
- Spring Boot
- db
- Exception
- QueryDSL
- spring
- AOP
- 스프링
- 스프링 핵심 원리
- JDBC
- 인프런
- SpringBoot
- Proxy
- Greedy
- Servlet
- kotlin
Archives
- Today
- Total
개발자되기 프로젝트
로그 추적기 V2 - 적용 본문
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
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
필드 동기화 - 적용 (0) | 2021.11.20 |
---|---|
필드 동기화 - 개발 (0) | 2021.11.20 |
로그 추적기 V2 - 파라미터로 동기화 개발 (0) | 2021.11.20 |
로그 추적기 V1 - 적용 (0) | 2021.11.19 |
로그 추적기 v1 - 프로토 타입 (0) | 2021.11.18 |
Comments