공통 로깅 Aspect 설계 및 구축 - Genie-Uss/genieus GitHub Wiki
✅ 공통 로깅 Aspect 설계 및 적용
🧩 문제 상황 (Problem)
서비스가 점차 복잡해지면서 다음과 같은 관측성과 디버깅 문제에 직면했습니다:
- 장애 발생 시, 요청이 어느 컴포넌트까지 도달했는지 추적 불가능
- Kafka 소비자나 스케줄러에서 발생하는 예외는 기존 요청 기반 로그 체계에 포함되지 않아 누락
- Zipkin과 같은 분산 추적 도구는 서비스 간 흐름은 보이지만, 메서드 레벨의 진입/종료 타이밍 추적은 어려움
- 각 서비스마다 로깅 방식이 달라 로그 포맷과 위치가 불일치, 분석 비용 증가
🎯 선택한 해결 방안 (Decision)
Spring AOP 기반의 공통 Aspect를 정의하여, 컨트롤러·스케줄러·이벤트 리스너 등 주요 진입점에서 진입, 반환, 예외 상황을 통합적으로 로깅하는 구조를 설계했습니다.
@Aspect
로 정의된EntryExitLoggingAspect
를 통해 주요 메서드 흐름을 가로채고 로그 기록- 공통 설정 클래스(
CommonConfig
)에LoggingConfig
를 포함시켜, 모든 서비스에서 자동 적용되도록 구성 Slf4j + MDC
를 활용해 traceId 및 사용자 식별 정보 등 공통 컨텍스트 정보 자동 포함
🧩 시퀀스 다이어그램 (Mermaid)
sequenceDiagram
participant Client
participant Controller
participant EntryExitLoggingAspect
participant Service
Client->>Controller: HTTP 요청
activate Controller
Controller->>EntryExitLoggingAspect: 메서드 호출 인터셉트
activate EntryExitLoggingAspect
EntryExitLoggingAspect->>EntryExitLoggingAspect: 진입 로그 기록
EntryExitLoggingAspect->>Service: 비즈니스 로직 호출
activate Service
Service-->>EntryExitLoggingAspect: 결과 반환
deactivate Service
EntryExitLoggingAspect->>EntryExitLoggingAspect: 반환/예외 로그 기록
EntryExitLoggingAspect-->>Controller: 원래 결과 반환
deactivate EntryExitLoggingAspect
Controller-->>Client: HTTP 응답
deactivate Controller
✅ 적용 효과 (Outcome)
- 컨트롤러, Kafka 리스너, 스케줄러 등 다양한 진입점에 대해 일관된 로그 출력 포맷 확보
MDC
기반의 traceId 포함 로그로 Zipkin, Loki 등과 완전한 분산 추적 연계 가능- 장애 발생 시 실제 어느 메서드에서 문제가 발생했는지 추적이 용이
- 각 서비스에서 별도 로깅 구현 없이도 자동으로 진입/반환 로그가 기록되어 코드 간결성 유지
🔭 향후 개선 방향 (Next Steps)
- 🔄 ThreadLocal 기반 Context 확장: 사용자 ID, 요청 ID 등 커스텀 MDC 필드 자동 설정
- ⚠️ Slow Method 탐지 기능: 일정 시간 이상 소요된 메서드에 대해 WARN 로그 출력
- 🔐 민감 정보 필터링 정책 적용: 요청 파라미터 중 일부 민감 정보 마스킹 또는 제외 처리
💬 요약
“Spring AOP 기반의 공통 Aspect를 정의함으로써, 서비스 간 일관된 진입/반환/예외 로깅 체계를 확보하였고, 이는 장애 분석, 트레이싱, 운영 관측성 측면에서 큰 개선 효과를 가져왔습니다.”