[스프링 핵심원리 - 고급편 ] 로그추적기 v2 - 적용

JEONG SUJIN·2023년 2월 12일
0

스프링부트 기본

목록 보기
10/15

로그추적기를 애플리케이션에 적용

패키지 study.advanced.app.v2 생성 후
앞전 컨트롤러, 서비스, 레파지토리 파일을 복사한다.

OrderControllerV2.java

  • 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; // 예외를꼭 다시 던져주어야 한다. 
		}	
	}
}

OrderServiceV2.java

  • orderItem()은 파라미터로 전달 받은 traceId를 사용해서 trace.beginSync()를 실행
  • beginSync()는 내부에서 다음 traceId를 생성하면서 트랜잭션 ID는 유지하고 level은 하나 증가시킨다.
  • beginSync()가 반환한 새로운 TraceStatus를 orderRepository.save()를 호출하면서 파라미터로 전달한다.
  • TraceId를 파라미터로 전달하기 위해 orderRepository.save()의 파라미터에 TraceId를 추가해야 한다.
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; 
		}
		
	}

}

OrderRepositoryV2.java

  • save()는 파라미터로 전달받은 traceId를 사용해서 trace.beginSync()를 실행한다.
  • beginSync()는 내부에서 다음 traceId를 생성하면서 트랜잭션ID는 유지하고 level은 하나 증가시킨다.
  • beginSync()는 이렇게 갱신된 traceId로 새로운 TraceStatus를 반환
  • trace.end(status)를 호출하면서 반환된 TraceStatus를 전달한다.
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();
		}
	}
	
}

레벨이 추가되면 아이디값은 동일하게 잘 나오는걸 볼 수 있다.

profile
기록하기

0개의 댓글