Skip to content

[프로젝트 설계] Service layer logging

YoonTaeMin edited this page May 18, 2023 · 9 revisions

AOP 를 활용한 로깅처리

핵심로직(트랜잭션)의 실행시간을 측정하고, 실행시간에 따른 로그를 출력하기 위하여 AOP를 사용하여 구현하였습니다.

Service layer를 한정한 이유

  • 트랜잭션의 처리시간을 구하는 것이 주목적이었기 때문에 only 서비스계층만을 타겟으로 하는 advisor를 생성하였습니다.
  • controller는 특별한 로직이 존재하지 않고, 단순히 [서비스계층을 호출하는 역할 + 서비스계층으로부터 전달받은 데이터를 응답해주는 역할] 만 존재하기 때문에 트랜잭션이 작용하는 핵심로직과 분리하여 로깅을 할 필요가 있다고 판단하였습니다. (불필요한 로깅은 오히려 성능상 좋지 않을거라 판단)
  • service와 repository 계층을 분리하여 각각 로깅한다면, 서비스계층에서 발생하는 dirty checking에 의한 트랜잭션과 순수 repository에서 발생하는 트랜잭션에 대한 처리가 모호해진다고 판단하였습니다.

로깅

스프링 AOP는 프록시 방식을 기반에 두고 있으므로 조인포인트가 메소드호출시점으로 한정됩니다. 따라서, 서비스계층의 각각의 메소드를 가리키도록 포인트컷을 설정하였습니다. 그 이후 서비스 내부의 메소드가 실행되기 전과 실행된 이후의 시간을 계산하여 service+repository 의 실행시간을 구하였습니다. 그리고 실행시간이 1000ms(1초) 를 초과하면 warn level로 로그를 출력하도록 설정하였습니다. 마지막으로, 쓰레드(각각의 요청) 별로 로그를 구분하기 위하여 임의의 문자열을 thread id 값으로 설정하였고, 이 또한 로그에 출력하였습니다. 이 때, thread id는 동시성 이슈를 해결하기 위해서 ThreadLocal에 저장하였습니다.

AWS CloudWatch 도입

초기에는 로그파일을 생성하여 특정폴더에 저장하는 방식을 구상하였습니다. 하지만, 이러한 방식은 수많은 로그파일을 관리하기 쉽지 않고, 저장 용량에 한계가 있다고 판단하였습니다. 따라서 AWS CloudWatch를 이용하여 로그파일을 관리하고, 특정 기간이 지나면 자동으로 삭제될 수 있도록 설정하였습니다. 자동삭제기간은 7일로 설정하였습니다.

Clone this wiki locally