🎯 어떤 서비스인가?
Spring 을 사용하면서 JPA 나 QueryDSL 를 사용하며 쿼리를 작성하곤 합니다. 이때 쿼리에 대한 성능을 분석할때 Hibernate 환경에서 show-sql 을 true 로 설정한 뒤 실제 요청하는 쿼리를 파악하고 실행계획을 보기 위해서는 MySQL WorkBench 에 들어가 직접 EXPLAIN 키워드를 사용해 분석하곤합니다.
하지만 이러한 과정은 분석하려는 쿼리를 직접 실행해 직접 수동으로 복사하고 붙여 넣는 과정의 반복이었습니다. 이러한 과정을 축소화하고 성능 개선이 필요한 쿼리를 분석해 로그로 추출한 뒤 모니터링 하는 환경을 제공하는 SDK 서비스를 만들고자 합니다.
1. JPA, QueryDSL 에서 실행되는 메서드를 감지합니다.
2. 쿼리 실행 시간이 지정한 시간을 넘어가면 성능 개선의 여지가 있는 쿼리로 간주하고 메서드, 쿼리, 실행 계획등을 로그로 만들어 추출합니다.
3. 추출한 로그는 별도의 서버로 송신해 관리합니다.
4. 발급한 API KEY 를 이용해 사용자별 쿼리 로그를 모니터링하는 환경을 제공합니다.
시스템 아키텍처
슬로우 쿼리 추출
JPA나 QueryDSL은 내부적으로 프록시 기반의 메서드 호출 구조이기 때문에, Spring AOP를 활용하면 쿼리 실행 전후를 감지할 수 있습니다. 때문에 비즈니스 코드에는 영향을 주지 않으면서도 실행 시간을 측정할 수 있습니다.
@Around("execution(* com.example..*Repository.*(..))")
포인트컷을 통해 Repository 메서드를 타겟팅하며, 실행 시간은 System 시간 차를 통해 측정합니다.
로그 수집 및 전송
슬로우 쿼리로 간주된 요청은 다음 정보를 포함한 로그로 수집됩니다
- SQL 쿼리 문자열
- 실행 시간(ms)
- 호출된 메서드명
- 실행 계획 (DB EXPLAIN 결과)
로그는 SDK 내부의 큐에 저장된 뒤, 별도의 비동기 스레드를 통해 SnailCatch 서버로 전송됩니다. 이로 인해 실제 요청 흐름에는 영향을 주지 않으며, 네트워크 장애 상황에서도 재시도가 가능합니다.
로드 밸런서를 이용한 요청 분산
서버는 다수의 로그 수신 요청을 처리하기 때문에, 기본적으로 로드 밸런서를 전면에 배치해 트래픽을 분산시킵니다. 이때 클라이언트 IP 기반 해시 분산을 사용합니다. 이는 항상 같은 서버가 담당하면 서버 간 데이터 불일치 없이 캐시나 세션 유지가 가능합니다. 그리고 향후 로그 집계 또는 스케일 아웃면에 있어서 유리하다 판단했습니다.
사용자 식별
( JWT 같은 인증 토큰 방식은 과하고, 단순 로그 구분용으로 API KEY가 간결하고 관리하기 쉽다 생각했습니다. )
SDK를 설치한 사용자는 SnailCatch 대시보드에서 고유한 API KEY를 발급받습니다. SDK는 이 키를 Header에 포함시켜 로그 전송 시 함께 송신합니다.
POST /api/log Authorization: Bearer {API_KEY}
서버는 이를 통해 사용자 인증 및 식별을 수행하며, 쿼리 로그를 사용자별로 분리 저장합니다.
Write 에 강력한 NOSQL
이번 프로젝트에서 가장 중요한 것은 "얼마나 빠르게 데이터를 기록할 수 있는가?" 라고 생각했습니다. SnailCatch는 단순한 웹 서비스와는 달리, 한 명의 사용자가 수많은 쿼리 로그를 실시간으로 전송하기 때문에, 로그 저장 연산의 빈도와 쓰기 양이 압도적으로 많을 수밖에 없습니다.
따라서, 시스템의 핵심은 쓰기 성능(Write Performance)을 얼마나 효율적으로 처리하느냐에 달려 있다고 판단했습니다. 또한 NoSQL, 특히 MongoDB는 고속의 Write 처리에 최적화된 설계를 가지고 있어 수많은 사용자로부터 동시에 수신되는 로그를 빠르게 저장할 수 있습니다.
그리고 무엇보다 MongoDB는 Sharding(샤딩) 기능을 통해 수평 확장이 가능하기 때문에, 시스템이 커지고 사용자 수가 증가하더라도, 서버를 수평적으로 늘리는 방식으로 처리량을 지속적으로 확장해 나갈 수 있습니다.
프로젝트 기간은 5 주정도로 생각하고 있고, 최대한 빠른 기능 구현을 통해 사용자의 피드백을 받으며 서비스를 성장 시키는 것을 목표로 가지고 있습니다.
1 주차 : 도메인 설계및 기술 선택
2 주차 : 로그 수집 기능 SDK 개발
3 주차 : 로그 수신 서버 개발
4 주차 : 로그 모니터링 UI 개발 및 기능 테스트
5 주차 : 성능 개선 및 서비스 배포
'프로젝트' 카테고리의 다른 글
Opentelemetry 를 이용한 메트릭,트레이스,로그 수집 (2) | 2025.05.29 |
---|---|
[Snail Catch] 슬로우 쿼리 로그 수집 (0) | 2025.05.15 |
Cozy Share Privacy Policy (0) | 2025.02.28 |