개발 기간: 2025.07.07 ~ 2025.07.15
ClassPath는 Spring Boot 기반의 대학 수강신청 사이트입니다. 사용자는 강의 검색·조회 및 잔여 정원 확인, Redisson 분산 락을 통한 동시성 제어로 피크 타임에도 안정적인 성능을 제공합니다.
6. API 명세
- 여러 사용자가 동시에 수강신청 시 실제 생성된 수강신청 데이터 개수와 현재 수강 인원 데이터 간의 불일치 문제 발생
- 단일 트랜잭션 내에서 INSERT(수강신청 레코드 생성)와 UPDATE(강의 현재 인원 갱신)를 연속 실행하면서 데드락 발생
- Redisson으로 분산 락 구현하여 동시성 문제 해결.
시나리오 : 50명 정원의 강의에 대해 200명이 한번에 요청
- 도입 전: 동시 요청으로 인해 데이터 불일치 발생, 데드락 발생, 요청 실패율 증가.
| 구분 | 표본 수 | 평균 (ms) | 최소값 (ms) | 최대값 (ms) | p(90)(ms) | p(95)(ms) | 오류 % |
|---|---|---|---|---|---|---|---|
| HTTP 요청 | 200 | 656 | 138 | 973 | 910 | 926 | 95.0% |
- 도입 후: 동시성 제어에 성공하여 정확한 강의 인원 관리, 요청 실패율 0%.
| 구분 | 표본 수 | 평균 (ms) | 최소값 (ms) | 최대값 (ms) | p(90)(ms) | p(95)(ms) | 오류 % |
|---|---|---|---|---|---|---|---|
| HTTP 요청 | 200 | 1008 | 178 | 1720 | 1610 | 1980 | 0% |
- 동시 요청 처리: 정확한 강의 수강 인원 유지.
- 오류율: 95% → 0% (완전 제거)
- 게시글 조회 시마다 DB에서 조회수를 즉시 증가시키면서 DB 부하 및 성능 저하 발생
- 동시 다발적인 조회 요청 시 DB 업데이트 경합과 느린 응답 문제 발생
- Redis 캐시를 사용해 조회수 캐싱
- 일정 시간 간격으로 캐시된 조회수를 DB에 일괄 업데이트하는 방식 도입
- 캐시 TTL 및 스케줄러(@Scheduled)를 활용해 데이터 일관성 유지
시나리오 : 50명의 가상 사용자가 30초 동안 동시에 특정 공지사항 단일 조회 API를 반복 요청
- 도입 전: 조회 요청 시마다 DB 업데이트 → 높은 부하, 응답 지연 및 데이터 경쟁 발생
| 구분 | 표본 수 | 평균 (ms) | 최소값 (ms) | 최대값 (s) | p(90)(ms) | p(95)(ms) |
|---|---|---|---|---|---|---|
| HTTP 요청 | 15839 | 141.87 | 6.83 | 2.59 | 199.43 | 222.47 |
- 도입 후: 조회수 증가 요청은 Redis 캐시에 기록 → DB 부하 감소, 응답 속도 개선, 동시성 문제 완화
| 구분 | 표본 수 | 평균 (ms) | 최소값 (ms) | 최대값 (s) | p(90)(ms) | p(95)(ms) |
|---|---|---|---|---|---|---|
| HTTP 요청 | 26151 | 25.49 | 5.26 | 1.35 | 48.8 | 61.27 |
- 응답 속도 크게 향상: 평균 응답 시간이 약 82% 감소
- 최대 응답 시간 단축: 최대 응답 시간이 절반 이상 감소
- 90%, 95% 지연 시간(p90, p95) 대폭 개선: p(90) 199.43ms → 48.8ms, p(95) 222.47ms → 61.27ms
- 처리량 증가: 캐시 적용 후 표본 수가 증가해 더 많은 요청을 처리 가능
- 서비스 안정성 및 사용자 경험 개선: 빠른 응답과 부하 완화로 오류 및 지연 감소 기대







