-
영화, 뮤지컬, 클래식 공연 등의 좌석 예약 서비스를 제공하는 웹 애플리케이션
-
성능 병목 분석부터 인프라 구성까지 전반을 다루며 3단계에 걸쳐 점진적으로 개선
-
SKILL
- 개발: Spring Boot, JPA, JUnit5, MariaDB, H2, Redis
- 인프라: AWS EC2, AWS RDS, AWS CodeDeploy, AWS S3
- 기타: Git, Intellij, DBeaver, nGrinder
- Spring Framework 기반으로 진행하며, 직접 Configuration 클래스를 통해 Bean 간의 관계를 설정함으로써 DI 대한 이해
- 외부 Tomcat 환경에서 리소스 반영 지연 및 기동 오류를 경험하여, 더 안정적인 배포 환경을 위해 Spring Boot로 전환, Spring → Spring Boot (4.3 → 2.7)
- 반복 SQL문과 변경이 잦은 설계로 인해 JdbcTemplate에서 JPA로 변경
- 이상 현상 방지를 위해 ERD 재설계
- 관람 좌석 등급 기능을 추가하며 관람 장소 좌석 테이블의 N:M 관계를 1:N 관계를 분리
- 인기 예약 상품 조회에 Local Cache(Thread Safe 자료구조)를 통해 API 응답속도 85% 향상
- 100건 동시 예약 요청에서도 데이터 무결성을 보장하도록 동시성 제어
- synchronized로 한 스레드씩 처리하려 했지만,
- JPA는 flush와 커밋 타이밍이 분리되어 WAS의 동기화와 DB 반영 시점이 일치하지 않는 경우 발생 (100건 중 약 94건 통과)
- 필요한 데이터에만 동시성 문제를 세밀하게 제어하기 위해 Pessimistic Lock 적용하여 동시성 제어
- 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초)
