Skip to content

Repository files navigation

🕒 Timeslot Service

레스토랑 예약 시스템의 타임슬롯 관리 마이크로서비스

Java Spring Boot Gradle PostgreSQL Docker

📌 서비스 책임

  • 레스토랑별 예약 가능한 타임슬롯 생성 및 조회
  • 타임슬롯의 잔여 좌석 수 관리 및 차감
  • 동시 예약 요청에 대한 동시성 제어 (낙관적 락 기반)
  • 다른 서비스(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]
Loading

🛠️ 기술 스택

Backend

분류 기술
Language Java 21
Framework Spring Boot 3.x
Build Tool Gradle 8.x
Service Discovery Spring Cloud Eureka
Inter-service Communication Spring Cloud OpenFeign

Data

분류 기술
Database PostgreSQL 18.0
Connection Pool HikariCP (max-size: 3)
Concurrency Control Optimistic Lock (@Version)

Testing & Quality

분류 기술
Unit / Integration Test JUnit 5, Spring Boot Test
API Documentation Spring REST Docs
Load Test K6
Retry Spring Retry

Observability

분류 기술
Metrics Prometheus (Micrometer)
Visualization Grafana
Health Check Spring Boot Actuator

Infrastructure

분류 기술
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 build

📡 API 명세

API 명세서는 Spring REST Docs 로 작성되어 있으며, 테스트 실행 시 자동 생성됩니다.

# 문서 생성
./gradlew test asciidoctor

# 생성 위치
build/docs/asciidoc/index.html

빌드 후 /docs/index.html 경로로 정적 문서를 제공합니다.

🧪 테스트

단위 / 통합 테스트

./gradlew test

부하 테스트 (K6)

load-test/ 디렉토리에 K6 시나리오가 포함되어 있습니다.

k6 run load-test/deduct-load-test.js

부하 테스트 결과 요약

현재 낙관적 락(Optimistic Lock) 으로 동시성을 제어하고 있으며, 부하 테스트를 통해 충돌률 및 처리량을 측정하여 검증했습니다.

📊 모니터링

Actuator 엔드포인트

  • Health Check: GET /actuator/health
  • Metrics: GET /actuator/metrics
  • Prometheus: GET /actuator/prometheus

Prometheus + Grafana

docker-compose.yml 에 Prometheus와 Grafana가 포함되어 있어, 실행 후 다음 URL에서 메트릭을 확인할 수 있습니다.

설정 파일: prometheus.yml

⚙️ 동시성 제어 전략

본 서비스는 낙관적 락(@Version) 으로 타임슬롯 좌석 차감 시 동시성을 제어합니다.

동작 방식

  1. 좌석 차감 요청 시 현재 version 과 함께 SELECT
  2. UPDATE ... SET remaining = remaining - 1, version = version + 1 WHERE id = ? AND version = ?
  3. 영향받은 row가 0이면 충돌 → Spring Retry 로 재시도

선택 이유

  • 추가 인프라(Redis 등) 없이 DB만으로 정합성 보장
  • 충돌 빈도가 관리 가능한 수준에서 충분한 성능 확보
  • 부하 테스트(K6)로 적정 수준임을 검증

향후 트래픽 증가 시 Redis 기반 분산락(Redisson) 도입 검토 예정

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

Generated from Miche-Let/.github