본문으로 건너뛰기
개인

콘서트 예약 서비스

2024-10-05 — 2024-11-30

1만 동시 요청 환경에서 좌석 선점·결제·포인트 충전의 동시성 문제를 시나리오별 하이브리드 락 전략으로 해결한 콘서트 좌석 예약 서비스 — 낙관적 락 + Redisson 분산 락, Redis 캐싱 TPS 15배 향상, Kafka 이벤트 드리븐 아키텍처, K6 부하 테스트 기반 병목 개선

콘서트 예약 서비스 project cover image

프로젝트 설명

대규모 트래픽 환경에서의 동시성 문제를 다양한 락 전략(비관적 락, 낙관적 락, Redis 분산 락)으로 해결하고, 시나리오별 최적의 동시성 제어 방식을 선정한 프로젝트이다. 좌석 선점에는 낙관적 락, 포인트 충전과 결제에는 Redisson 기반 분산 락을 적용하는 하이브리드 전략을 설계했으며, Redis 캐싱과 DB 인덱싱으로 조회 성능을 최적화하고 Kafka를 활용한 이벤트 기반 아키텍처로 시스템 간 결합도를 낮췄다. K6 부하 테스트를 통해 성능 병목을 식별하고 개선하는 전 과정을 경험했다.

주요 내용

  • 낙관적 락으로 좌석 예약 응답 시간 50% 개선 (1,678ms → 835ms)
  • 시나리오별 하이브리드 락 전략 설계 (낙관적 락 + Redisson 분산 락)
  • Redis 캐싱으로 TPS 15배 향상 (100 → 1,500), DB 쿼리 94% 감소
  • Kafka 이벤트 드리븐 아키텍처로 도메인 간 결합도 제거
  • K6 부하 테스트 기반 성능 병목 식별 및 개선

담당 기능

  • 좌석 예약 — 낙관적 락 기반 좌석 선점, 임시 배정 후 5분 내 결제 미완료 시 자동 해제
  • 포인트 충전·결제 — Redisson 분산 락으로 동시 충전/결제 시 잔액 정합성 보장
  • 대기열 시스템 — Redis Sorted Set 기반 대기열로 입장 순서 관리, 폴링 기반 순번 조회
  • Redis 캐싱 — 콘서트·좌석 조회에 캐시 적용, TPS 100→1,500 (15배 향상), DB 쿼리 94% 감소
  • Kafka 이벤트 드리븐 — 예약 완료 이벤트를 Kafka로 발행하여 결제·알림 도메인 간 결합도 제거
  • K6 부하 테스트 — 1만 동시 요청 시나리오별 성능 측정, 병목 식별 및 락 전략 비교 검증

깨달은 점

  • 비관적/낙관적/분산 락의 트레이드오프를 비교하며 동시성 제어의 본질적 차이를 이해
  • 시나리오별 하이브리드 락 전략 설계로 단일 솔루션이 아닌 맥락 기반 선택의 중요성 학습
  • Redis 캐싱과 DB 인덱스 최적화를 병행하여 읽기 성능을 극대화하는 계층적 캐싱 전략 경험
  • Kafka 기반 이벤트 드리븐 아키텍처로 도메인 간 결합도를 제거하는 비동기 통신 설계 학습

기술 스택

Java Spring Boot JPA Redis MySQL Kafka Docker K6

관련 글

  • JPA 비관적 락과 낙관적 락 및 재시도
  • Spring Boot 콘서트 예약 시나리오 동시성 문제 분석
  • Spring Boot Redis를 활용한 분산 락 구현
  • 캐시(Cache)와 캐싱 전략(Caching Strategy)

관련 링크

  • erd
  • api Spec
  • sequence Diagram
  • requirements
  • project Structure
  • concurrency Analysis
  • caching Strategy
  • index Optimization