"500만 건 데이터 환경에서 조회 속도 94% 개선 및 Kafka 기반 비동기 알림 시스템 구축"
본 프로젝트는 대용량 데이터 환경에서 발생할 수 있는 **성능 병목(Slow Query)**과 데이터 정합성(Concurrency) 문제를 해결하고, 시스템 간 결합도를 낮추기 위해 비동기 메시징 시스템을 도입한 백엔드 성능 최적화 프로젝트입니다. 단순한 기능 구현을 넘어, 인덱스 튜닝, 비관적 락, Kafka 메시징을 단계별로 적용하며 기술적 근거를 바탕으로 성능을 최적화했습니다.
- 개발 기간: 2026.02.09 ~ 2026.02.10
- 개발 인원: 1인 (Backend Engineering)
이 프로젝트는 기술적 과제 해결 과정에 따라 브랜치를 분리하여 관리하고 있습니다.
| 브랜치 (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 |
- 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
500만 건의 도서 데이터를 대상으로 쿼리 튜닝을 진행하여 응답 속도를 혁신적으로 단축했습니다.
| 테스트 시나리오 | 개선 전 (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배 단축 | 커서 기반 페이징 |
인기 도서 대출 시나리오에서 발생하는 갱신 손실(Lost Update) 문제를 해결하기 위해 **비관적 락(Pessimistic Lock)**을 채택했습니다. 충돌이 빈번한 환경에서 재시도 비용이 발생하는 낙관적 락보다 안정적인 데이터 무결성을 보장했습니다.
재고 감소 후 발생하는 알림 발송 로직을 메인 트랜잭션에서 분리하여 시스템의 응답성을 높였습니다.
- Loose Coupling: 슬랙 API 장애가 도서 대출 로직의 실패로 이어지지 않도록 시스템 간 결합도를 낮춤.
- 성능 최적화: 사용자는 재고 감소 직후 응답을 받으며, 알림 처리는 백그라운드에서 Kafka Consumer가 처리.
- 이벤트 기반 알림:
SUCCESS및FAILED상황에 맞는 차별화된 슬랙 알림 포맷 설계.
- 성공 알림 (✅ SUCCESS): 대출 상세 정보를 가독성 높은 마크다운 형식으로 전송.
- 실패 알림 (🚨 FAILED): 재고 부족 등 예외 발생 시 원인과 함께 경고 메시지 발송.
1. 인프라 실행 (Docker)
docker-compose up -d