- 목차
- 인프런 김영한 강사님 스프링 핵심 원리 - 고급편 정리입니다.
- ThreadLocal, 스프링의 디자인 패턴, AOP의 원리 및 개념 학습을 위한 예제입니다.
- 로그 추적기를 통해서 프로젝트의 어떤 부분에서 병목이 발생하는지, 그리고 어떤 부분에서 예외가 발생하는 지를 로그를 통해 확인할 수 있다.
- 해당 강의에서 요청(Request)하는 객체는 클라이언트, 요청을 처리하는 객체는 서버로 부른다.
[ 로그 추적기 - 요구 사항 분석 ]

- 모든 클래스에서 로그 추적기 객체를 주입 받는다.
- 모든 public 메서드의 호출과 응답 정보를 로그로 출력한다.
- 정상 흐름과 예외 흐름을 구분해서 예외 시 예외 정보를 남겨야 한다.
- 로그 추적기는 어플리케이션 동작 흐름에 영향을 주면 안된다.
- 메서드 호출의 깊이(|—>)를 표현해야 한다.
- HTTP request를 구분해서 별도의 ID를 부여해야 한다.
TraceId
import java.util.UUID;
public class TraceId {
private String id; // [796bccd9]
private int level; // |--> 몇단계 호출인지.
public TraceId() {
this.id = createId();
this.level = 0;
}
// 클래스 내부에서 값 셋팅을 위해 사용하는 생성자
private TraceId(String id, int level){
this.id = id;
this.level = level;
}
private String createId() {
// 생성된 범용 고유 식별자(UUID) : ab99e16f-3cde-4d24-8241-256108c203a2
// ab99e16f <- 앞 8자리만 사용
return UUID.randomUUID().toString().substring(0,8);
}
public TraceId createNextId(){
return new TraceId(this.id, this.level + 1);
}
public TraceId createPreviousId(){
return new TraceId(this.id, this.level - 1);
}
public boolean isFirstLevel(){ // 첫번째 레벨인지 확인하는 메서드
return level == 0;
}
// getter method() {...}
}
- UUID를 자른 id와 몇 단계의 호출인지 저장하는 level 필드를 가진다.
TraceStatus
public class TraceStatus {
private TraceId traceId; // id와 level을 가지고 있다.
private Long startTimeMs; // 로그 시작시간
private String message; // 출력용 메시지 ex) OrderController.request()
public TraceStatus(TraceId traceId, Long startTimeMs, String message) {
this.traceId = traceId;
this.startTimeMs = startTimeMs;
this.message = message;
// getter method() {...}
}
- TraceId와 시작 시간, 출력 용 메시지를 가진다.