Skip to content

[Libro Query Boost] 500만 건 도서 데이터의 조회 성능을 10s → 0.6s로 단축시킨 쿼리 튜닝 및 No-Offset 페이징 최적화 프로젝트.

Notifications You must be signed in to change notification settings

memoryDev/libro-query-boost

Repository files navigation

⚡ Libro Query Boost (대용량 트래픽 성능 최적화 프로젝트)

1. 프로젝트 개요 (Overview)

"500만 건 데이터 환경에서 조회 속도 94% 개선 및 Kafka 기반 비동기 알림 시스템 구축"

본 프로젝트는 대용량 데이터 환경에서 발생할 수 있는 **성능 병목(Slow Query)**과 데이터 정합성(Concurrency) 문제를 해결하고, 시스템 간 결합도를 낮추기 위해 비동기 메시징 시스템을 도입한 백엔드 성능 최적화 프로젝트입니다. 단순한 기능 구현을 넘어, 인덱스 튜닝, 비관적 락, Kafka 메시징을 단계별로 적용하며 기술적 근거를 바탕으로 성능을 최적화했습니다.

  • 개발 기간: 2026.02.09 ~ 2026.02.10
  • 개발 인원: 1인 (Backend Engineering)

2. 브랜치 전략 (Branch Strategy)

이 프로젝트는 기술적 과제 해결 과정에 따라 브랜치를 분리하여 관리하고 있습니다.

브랜치 (Branch) 설명 (Description) 주요 기술
main [Step 1] 조회 성능 최적화 Index Tuning, No-Offset, Querydsl
feat/concurrency [Step 2] 동시성 제어 및 락 Pessimistic Lock, Optimistic Lock, Strategy Pattern
feat/kafka-notification [Step 3] 비동기 알림 시스템 Apache Kafka, Slack Webhook, Async Event

3. 기술 스택 (Tech Stack)

  • Language/Core: Java 17, Spring Boot 3.x
  • Data: Spring Data JPA, MariaDB 10.11 (Docker), JDBC Template, Querydsl 5.0
  • Messaging: Apache Kafka (Docker)
  • External API: Slack Webhook API
  • Test: JUnit 5, Mockito

4. 핵심 성과 1: 조회 성능 최적화 (Read Performance)

500만 건의 도서 데이터를 대상으로 쿼리 튜닝을 진행하여 응답 속도를 혁신적으로 단축했습니다.

4.1. 성능 개선 결과표

테스트 시나리오 개선 전 (Before) 개선 후 (After) 개선율 비고
대용량 Insert JPA saveAll() (Timeout) JDBC Batch Update (180s) 약 100배 Bulk Insert 최적화
검색 (정렬 포함) Full Table Scan (10.2s) Index Scan (0.6s) 94% 단축 커버링 인덱스 적용
페이징 (400만 이후) Offset Paging (3.5s) No-Offset (0.01s) 350배 단축 커서 기반 페이징

5. 핵심 성과 2: 동시성 제어 및 비동기 시스템 (Concurrency & Messaging)

5.1. 비관적 락을 통한 데이터 정합성 보장

인기 도서 대출 시나리오에서 발생하는 갱신 손실(Lost Update) 문제를 해결하기 위해 **비관적 락(Pessimistic Lock)**을 채택했습니다. 충돌이 빈번한 환경에서 재시도 비용이 발생하는 낙관적 락보다 안정적인 데이터 무결성을 보장했습니다.

5.2. Kafka 기반 비동기 알림 아키텍처 구축

재고 감소 후 발생하는 알림 발송 로직을 메인 트랜잭션에서 분리하여 시스템의 응답성을 높였습니다.

  • Loose Coupling: 슬랙 API 장애가 도서 대출 로직의 실패로 이어지지 않도록 시스템 간 결합도를 낮춤.
  • 성능 최적화: 사용자는 재고 감소 직후 응답을 받으며, 알림 처리는 백그라운드에서 Kafka Consumer가 처리.
  • 이벤트 기반 알림: SUCCESSFAILED 상황에 맞는 차별화된 슬랙 알림 포맷 설계.

5.3. 실시간 모니터링 및 장애 대응

  • 성공 알림 (✅ SUCCESS): 대출 상세 정보를 가독성 높은 마크다운 형식으로 전송.
  • 실패 알림 (🚨 FAILED): 재고 부족 등 예외 발생 시 원인과 함께 경고 메시지 발송.

6. 실행 방법 (How to run)

1. 인프라 실행 (Docker)

docker-compose up -d

About

[Libro Query Boost] 500만 건 도서 데이터의 조회 성능을 10s → 0.6s로 단축시킨 쿼리 튜닝 및 No-Offset 페이징 최적화 프로젝트.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages