Skip to content

hj0328/reservation-system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

예약 시스템

  • 영화, 뮤지컬, 클래식 공연 등의 좌석 예약 서비스를 제공하는 웹 애플리케이션

  • 성능 병목 분석부터 인프라 구성까지 전반을 다루며 3단계에 걸쳐 점진적으로 개선

  • SKILL

    • 개발: Spring Boot, JPA, JUnit5, MariaDB, H2, Redis
    • 인프라: AWS EC2, AWS RDS, AWS CodeDeploy, AWS S3
    • 기타: Git, Intellij, DBeaver, nGrinder
  • 아키텍처 아키텍처

Postman API Docs

image

1차 개발

  • Spring Framework 기반으로 진행하며, 직접 Configuration 클래스를 통해 Bean 간의 관계를 설정함으로써 DI 대한 이해
  • 외부 Tomcat 환경에서 리소스 반영 지연 및 기동 오류를 경험하여, 더 안정적인 배포 환경을 위해 Spring Boot로 전환, Spring → Spring Boot (4.3 → 2.7)

2차 개발

  • 반복 SQL문과 변경이 잦은 설계로 인해 JdbcTemplate에서 JPA로 변경
  • 이상 현상 방지를 위해 ERD 재설계
    • 관람 좌석 등급 기능을 추가하며 관람 장소 좌석 테이블의 N:M 관계를 1:N 관계를 분리
  • 인기 예약 상품 조회에 Local Cache(Thread Safe 자료구조)를 통해 API 응답속도 85% 향상
  • 100건 동시 예약 요청에서도 데이터 무결성을 보장하도록 동시성 제어
    • synchronized로 한 스레드씩 처리하려 했지만,
    • JPA는 flush와 커밋 타이밍이 분리되어 WAS의 동기화와 DB 반영 시점이 일치하지 않는 경우 발생 (100건 중 약 94건 통과)
    • 필요한 데이터에만 동시성 문제를 세밀하게 제어하기 위해 Pessimistic Lock 적용하여 동시성 제어

3차 개발

  • Github Action + AWS S3 + CodeDeploy 환경으로 CI/CD 무중단 배포 도입
  • 통합 테스트에서 @DirtiesContext 로 인한 시간 지연을 개선하기 위해 @sql 활용, 테스트 시간 12초 → 9초 개선
  • vUser 100명 기준 부하 테스트를 진행하여 성능 개선
    • 2Core, 4GB 사양의 AWS EC2, RDS 서버에서 100만건 더미 데이터 활용
    • TPS 1.7 → 27.6 약 23배 증가
      • cursor 기반 페이징 및 커버링 인덱스, redis 등을 도입하여 db 부하 감소 및 성능 최적화
    • Redis Warm-up 지연 원인을 Redisson addAll() 호출 방식에서 찾아, Lua Script를 활용한 일괄 삽입 방식으로 성능 병목을 해결(22분 → 12초)

About

좌석 예약 시스템

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published