
백엔드
AOP와 MDC로 구현하는 보급형 APM - 인터페이스 이력 관리부터 호출 추적까지
두줄요약
인터페이스 이력 관리 시스템을 AOP와 MDC, Kafka Interceptor로 구현한 과정을 정리했습니다. 멀티스레드 전파와 호출 스택 누락 문제를 여러 차례 개선한 시행착오를 공유했습니다.
핵심 내용
- 인터페이스 이력 관리 필요성과 도입 배경 정리
- AOP 기반 호출 흐름에 호출 스택, 결과, 응답시간을 적재하는 구조 설명
- MDC, TaskDecorator, Kafka Interceptor, ConcurrentHashMap 조합으로 추적 ID 전파와 멀티스레드 이력 관리 구현
- 스레드 전파와 메모리 누수, 중복 저장 문제를 겪으며 개선한 시행착오 공유
구조와 흐름
- 템플릿 메서드 패턴으로 트래픽 유형과 호출 스택 유형 판별
- 데코레이터 패턴과 책임 연쇄 패턴으로 시간, 호출 스택, 결과 저장 단계 분리
- BeanPostProcessor와 TaskDecorator로 비동기 스레드에 MDC 전파
주의할 점
- InheritableThreadLocal의 깊은 복사와 얕은 복사 모두 호출 스택 누락 문제 유발
- 자식 스레드에서의 remove가 부모 스레드 데이터까지 영향을 줄 수 있는 점
- HTTP와 Kafka에서 추적 ID 전파 방식이 달라 별도 처리 필요
