| 핵심 역량 | 동시성 제어, Redis 기반 대기열 설계, 분산 스케줄링, 성능 최적화, 테스트 기반 검증 |
|---|---|
| 기술 스택 | Java, Spring Boot, JPA, Redis, MySQL, Testcontainers, k6, Grafana |
| 프로젝트 | 핵심 성과 | GitHub Repository |
|---|---|---|
| Zariyo (대기열 시스템) | 순번 조회 O(N) → O(1) 전환, LIST - ZSET 성능 비교 | ‣ |
| E-Commerce (동시성 제어) | 비관적 락 기반 재고 정합성 확보, 캐싱으로 응답 200ms → 5ms 단축 | ‣ |
“대기열 중심 콘서트 예약 시스템 개인프로젝트”


| 모듈 | 역할 | Redis 구조 |
|---|---|---|
| Queue Module | 토큰 발급, 대기열 관리, 스케줄러 | LIST(대기열), push/exit 카운터 |
| Main Module | 콘서트 조회, 좌석 예약, 토큰 검증 | SET(토큰), STRING(토큰정보), threshold |
많은 대기열 구현 방식에서 Redis ZSET(Sorted Set)을 사용합니다. ZSET은 시간복잡도는 O(log N)으로 구성되어 있고 내부 자료구조를 통해 정렬과 순번 조회를 쉽게 할 수 있도로 도와줍니다. 구현 복잡도와 O(log N)에 시간복잡도를 고려했을때 충분히 대기열로 문제 없을거라 판단해 ZSET으로 초기 구현은 했지만,
저는 여기서 의문이 생겼습니다. Redis의 가장 큰 강점은 빠른 속도입니다. 그렇다면 O(1)의 성능으로 대기열을 구현할 수는 없을까? 그래서 이 프로젝트에 ZSET이 아닌 LIST를 사용해 대기열을 구현하고 성능테스트를 통헤 비교를 진행했습니다.
문제
저는 ZSET이 아닌 진입/퇴장/조회 연산을 O(1)로 구현하기 위해 LIST를 채택했습니다.
| 연산 | ZSET | LIST |
|---|---|---|
| 진입 | ZADD - O(log N) | RPUSH - O(1) |
| 퇴장 | ZPOPMIN - O(log N) | LPOP - O(1) |
| 순번 조회 | ZRANK - O(log N) | LPOS - O(N) |
LIST의 RPUSH와 LPOP은 O(1)으로 대기열의 핵심인 넣고 빼는 행위는 매우 빠릅니다. 하지만 치명적인 문제가 있었습니다. 특정 사용자의 순번을 조회하려면 LPOS로 LIST 전체를 순회해야 합니다.
실시간 순번조회가 많은 특성 상 조회가 빈번하기 때문에 이 부분에 다른 방법을 떠올려야 했습니다.