로그 추적기 v1 개발
- 애플리케이션의 모든 로직에 직접 로그를 남겨도 사실 상관은 없지만, 그것은 너무 비효율적이다.
- 이전 요구사항을 분석하여 로그에 포함될 정보에는 무엇이 필요할지 확인해보자.
- 이번에는 우선
메서드 호출의 깊이 표현
과 HTTP 요청을 구분해야 한다.
라는 항목에 집중해보자. - 메소드 호출의 깊이라는 것은 컨트롤러 → 서비스 → 리포지토리 순서로 갈 때의 깊이를 의미한다.
- HTTP 요청을 구분한다는 것은 여러 개의 요청이 있을 때 각 요청을 구분할 수 있어야 한다는 것을 의미한다.
- 이 2가지를 합쳐 로그가 표시할 기반 데이터를 관리하는 클래스를 만들어 보자.
TraceId
- 트랜잭션 ID와 메소드 호출의 깊이를 표현하기 위한 클래스
TraceStatus
TraceV1
- TraceId와 TraceStatus를 통해 로그를 출력하는 클래스
로그 추적기 v1 테스트
- TraceV1에서 단축키
Ctrl + Shift + T
를 실행해서 테스트를 생성하자. - 아래 테스트를 통해 로그 추적기의 동작 원리와 사용 방법을 이해헤보자.
- begin_end 실행 로그
[51ded38c] hello
[51ded38c] hello time=9ms
- begin_exception 실행 로그
[cc7f34ea] hello
[cc7f34ea] hello time=7ms ex=java.lang.IllegalStateException
로그 추적기 v1 적용
- 차이점을 확인하기 위해 기존의 v0 패키지를 복사해서 v1으로 추가하자.
- v1 패키지 내부의 클래스명에서 v0을 v1로 변경한다.
- 각 클래스의 내부 로직에서 참고하는 타 클래스도 v1인지 확인한다.
- 컨트롤러에서 매핑 정보를
/v0/request
에서 /v1/request
로 변경한다.
- TraceV1을 적용해보자.
컨트롤러
서비스
리포지토리
로그추적기 v1 적용 결과
성공하는 케이스
- 실행 후 http://localhost:8081/v1/request?itemId=test로 이동해서 확인해보자.
[b9044175] OrderController.request()
[b4302b26] OrderService.orderItem()
[de52ee68] OrderRepository.save()
[de52ee68] OrderRepository.save() time=1007ms
[b4302b26] OrderService.orderItem() time=1007ms
[b9044175] OrderController.request() time=1008ms
실패하는 케이스
- 실행 후 http://localhost:8081/v1/request?itemId=ex로 이동해서 확인해보자.
[d9e5fe30] OrderController.request()
[5ab04ca5] OrderService.orderItem()
[1194edd9] OrderRepository.save()
[1194edd9] OrderRepository.save() time=0ms ex=java.lang.IllegalStateException: 예외 발생!
[5ab04ca5] OrderService.orderItem() time=1ms ex=java.lang.IllegalStateException: 예외 발생!
[d9e5fe30] OrderController.request() time=1ms ex=java.lang.IllegalStateException: 예외 발생!
로그추적기 v1 적용 결과 분석
- 직접 로그를 일일이 남기는 것보다는 낫긴한데 아직은 좀 번거롭다.
- 로그를 남기기 위한 코드가 너무 복잡하다.
- 요청을 한 번만 했으니 트랜잭션 ID가 동일해야 하는데 깊이가 변경될 때마다 새로운 트랜잭션 ID가 발급된다.
- 깊이가 다른데도 같은 깊이처럼 출력된다.
출처