레스토랑 예약 시스템의 타임슬롯 관리 마이크로서비스
- 레스토랑별 예약 가능한 타임슬롯 생성 및 조회
- 타임슬롯의 잔여 좌석 수 관리 및 차감
- 동시 예약 요청에 대한 동시성 제어 (낙관적 락 기반)
- 다른 서비스(Reservation 등)에 타임슬롯 정보 제공
graph LR
Gateway[API Gateway] --> Timeslot[Timeslot Service]
Reservation[Reservation Service] -->|Feign| Timeslot
Timeslot --> Eureka[Eureka Server]
Timeslot --> DB[(PostgreSQL)]
Timeslot -.->|metrics| Prometheus[Prometheus]
Prometheus -.-> Grafana[Grafana]
| 분류 | 기술 |
|---|---|
| Language | Java 21 |
| Framework | Spring Boot 3.x |
| Build Tool | Gradle 8.x |
| Service Discovery | Spring Cloud Eureka |
| Inter-service Communication | Spring Cloud OpenFeign |
| 분류 | 기술 |
|---|---|
| Database | PostgreSQL 18.0 |
| Connection Pool | HikariCP (max-size: 3) |
| Concurrency Control | Optimistic Lock (@Version) |
| 분류 | 기술 |
|---|---|
| Unit / Integration Test | JUnit 5, Spring Boot Test |
| API Documentation | Spring REST Docs |
| Load Test | K6 |
| Retry | Spring Retry |
| 분류 | 기술 |
|---|---|
| Metrics | Prometheus (Micrometer) |
| Visualization | Grafana |
| Health Check | Spring Boot Actuator |
| 분류 | 기술 |
|---|---|
| Containerization | Docker, Docker Compose |
| CI/CD | GitHub Actions |
| 서비스 | 관계 | 통신 방식 |
|---|---|---|
| Eureka Server | 서비스 등록/디스커버리 | HTTP |
| Reservation Service | 본 서비스를 호출 (좌석 차감) | Feign Client |
| API Gateway | 외부 요청 라우팅 | HTTP |
- Java 21+
- Docker & Docker Compose
- PostgreSQL 18.0
# 1. 레포 클론
git clone https://github.com/Miche-Let/timeslot-service.git
cd timeslot-service
# 2. 환경변수 설정
cp .env.example .env
# .env 파일에서 DB 접속 정보 등을 수정
# 3. 도커 실행
docker-compose up -d
./gradlew clean buildAPI 명세서는 Spring REST Docs 로 작성되어 있으며, 테스트 실행 시 자동 생성됩니다.
# 문서 생성
./gradlew test asciidoctor
# 생성 위치
build/docs/asciidoc/index.html빌드 후 /docs/index.html 경로로 정적 문서를 제공합니다.
./gradlew testload-test/ 디렉토리에 K6 시나리오가 포함되어 있습니다.
k6 run load-test/deduct-load-test.js현재 낙관적 락(Optimistic Lock) 으로 동시성을 제어하고 있으며, 부하 테스트를 통해 충돌률 및 처리량을 측정하여 검증했습니다.
- Health Check:
GET /actuator/health - Metrics:
GET /actuator/metrics - Prometheus:
GET /actuator/prometheus
docker-compose.yml 에 Prometheus와 Grafana가 포함되어 있어,
실행 후 다음 URL에서 메트릭을 확인할 수 있습니다.
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000
설정 파일: prometheus.yml
본 서비스는 낙관적 락(@Version) 으로 타임슬롯 좌석 차감 시 동시성을 제어합니다.
- 좌석 차감 요청 시 현재
version과 함께 SELECT UPDATE ... SET remaining = remaining - 1, version = version + 1 WHERE id = ? AND version = ?- 영향받은 row가 0이면 충돌 → Spring Retry 로 재시도
- 추가 인프라(Redis 등) 없이 DB만으로 정합성 보장
- 충돌 빈도가 관리 가능한 수준에서 충분한 성능 확보
- 부하 테스트(K6)로 적정 수준임을 검증
향후 트래픽 증가 시 Redis 기반 분산락(Redisson) 도입 검토 예정