예약 시스템 개편기: 우리는 왜 '예약 레고'를 만들었나
아키텍처
예약 시스템 개편기: 우리는 왜 '예약 레고'를 만들었나
두줄요약
병원 예약을 진료 항목별 가변 슬롯 구조로 전면 개편한 사례를 다루었습니다. 동시성 제어와 추적 가능성을 위해 분산 락과 개별 레코드 기반 카운팅도 도입했습니다.
문제 상황
- 고정 시간 간격만 지원하는 예약 구조로 인해 진료 항목별 소요 시간을 유연하게 반영하기 어려운 상태
- 최종 카운트만 저장하는 방식으로 동시 요청 경쟁 조건과 디버깅 어려움이 동시에 존재
구조와 흐름
- 진료 항목마다 고유 timeUnit을 부여하고, 시간대에는 허용 진료 항목과 동시 예약 가능 인원을 설정하는 가변 슬롯 설계
- 템플릿 스케줄과 커스텀 스케줄을 분리해 반복 패턴과 예외 주간을 함께 관리하는 구조
- 예약 가능 시간은 조회 시점에 계산하고, 반개구간 기준 겹침 판정으로 슬롯별 예약 가능 여부 산정
성능/운영 포인트
- 예약 중복 방지를 위해 5분 단위 Redis 분산 락과 이중 락 전략 적용
- 단순 카운트 대신 개별 레코드 기반으로 저장해 예약 추적, 취소 처리, 온라인/오프라인 구분을 개선
- 현재는 선형 탐색으로 충분하지만, 향후 데이터 증가 시 Interval Tree나 Sweep Line 검토 여지 존재
