🎟️ 예약 API 동시성 테스트 (다중 사용자 경쟁) 결과 보고

2026. 4. 27. 11:56·프로젝트/공연 티켓팅 프로젝트

1️⃣ 테스트 목적

본 테스트의 목적은 다음과 같다.

  • 여러 사용자가 동시에 예약 요청을 보낼 때 각 사용자별로 1건만 예약이 생성되는지 확인
  • Redis 기반 admitted(입장 권한) 시스템이 동시 요청 상황에서도 정상적으로 소비되는지 검증
  • 동시성 상황에서 데이터 정합성(booking, booked_count)이 유지되는지 확인
  • 인증/인가 흐름(JWT + Spring Security)이 동시 요청에서도 안정적으로 동작하는지 확인

2️⃣ 테스트 환경

  • Backend: Spring Boot + Spring Security + JWT
  • Queue/Admission: Redis (admitted key 기반)
  • 예약 API:
POST /api/concerts/{concertId}/booking
  • 테스트 도구:
    • Postman (단건 검증)
    • JMeter (동시성 테스트)

3️⃣ 사전 조건

3. 1 테스트 사용자

  • userId = 1
  • userId = 2

각 사용자에 대해 JWT 토큰을 준비

3. 2 DB 초기화

deletefrom bookingwhere concert_id=1and user_idin (1,2);
update concertset booked_count=0where id=1;

3. 3 admitted 상태 생성

SET EX admitted:concert:1:user:16001
SETEX admitted:concert:1:user:26001
  • 각 사용자별 admitted 1개씩 발급
  • TTL: 600초

4️⃣ 테스트 시나리오

시나리오: 다중 사용자 동시 예약

  • user1, user2 각각 여러 번 요청을 보내는 상황
  • 총 요청 수: 50
    • user1 토큰 25건
    • user2 토큰 25건
  • JMeter 설정:
    • Thread: 50
    • Ramp-up: 1초
    • Synchronizing Timer: 사용 (동시 요청)

👉 즉, 두 명의 사용자가 동시에 예약 버튼을 여러 번 누르는 상황을 시뮬레이션


5️⃣ 테스트 결과

5. 1 JMeter 결과

  • 총 요청 수: 50
  • 성공 응답 (200): 일부 존재 (예약 성공)
  • 실패 응답 (409): 다수 (입장 권한 없음)

대표 성공 응답:

{
  "status":"BOOKED",
  "concertId":1,
  "concertTitle":"2026 봄 페스티벌"
}

대표 실패 응답:

{
  "message":"입장 권한이 없습니다. (입장권이 없거나 만료/이미 사용됨)",
  "status":409
}

5. 2 DB 결과

select id, user_id, concert_id, status
from booking
where concert_id=1;

결과:

id | user_id | concert_id | status
----------------------------------
4  |    2    |     1      | PENDING_PAYMENT
5  |    1    |     1      | PENDING_PAYMENT

5. 3 booked_count 확인

select booked_countfrom concertwhere id=1;

기대 결과 :

2

6️⃣ 결과 해석

6. 1 사용자별 중복 예약 방지

  • user1 → 1건만 생성
  • user2 → 1건만 생성
  • 동일 사용자의 다중 요청은 추가 예약 생성되지 않음

👉 중복 방지 로직 정상 동작

6. 2 admitted 소비 로직 검증

  • 각 사용자 admitted는 1회만 소비됨
  • 이후 요청은 모두 409로 차단됨

👉 Redis admitted 기반 접근 제어 정상 동작

6. 3 동시성 제어 검증

  • 총 50개의 동시 요청에도 불구하고
  • 사용자별 1건씩만 예약 생성

👉 동시성 환경에서도 데이터 충돌 없이 처리됨

6. 4 데이터 정합성 검증

  • booking 테이블: 총 2건 생성
  • concert.booked_count: 2

👉 실제 데이터와 카운트 값이 일치

6.5 인증/인가 안정성

  • JWT 기반 인증 정상 동작
  • 미인증/잘못된 토큰은 401 반환
  • 권한 없는 접근은 컨트롤러 진입 전에 차단

👉 Security 설정 개선 후 안정적으로 동작

7️⃣ 결론

본 테스트를 통해 다음을 확인하였다.

  • 동일 사용자에 대한 중복 예약 요청은 정확히 1건만 처리됨
  • 여러 사용자 동시 요청 상황에서도 각 사용자별로 1건씩만 예약 생성됨
  • admitted 기반 접근 제어는 동시 환경에서도 정확히 동작함
  • 예약 수와 카운트 값이 일치하여 데이터 정합성이 유지됨
  • 보안 구조(JWT + Spring Security)는 500 오류 없이 안정적으로 동작함

👉 따라서 현재 예약 시스템은 다중 사용자 동시성 환경에서도 안정적으로 동작함을 확인하였다.

'프로젝트 > 공연 티켓팅 프로젝트' 카테고리의 다른 글

🎟️ Docker-compose up 한 번으로 실행되는 백엔드 만들기  (1) 2026.05.18
🎟️ MySQL 인덱스 실험: 예약 만료 배치 쿼리 성능 개선 (10만 건 실험)  (1) 2026.05.13
🎟️ 결제 API는 정말 중복 결제를 막을 수 있을까?  (1) 2026.04.27
🎟️ Redis 입장권 기반 예약 시스템은 정말 중복 예약을 막을까?  (0) 2026.04.27
🎟️ 선착순 강의에서 공연 티켓팅으로 확장한 이유  (2) 2026.04.17
'프로젝트/공연 티켓팅 프로젝트' 카테고리의 다른 글
  • 🎟️ MySQL 인덱스 실험: 예약 만료 배치 쿼리 성능 개선 (10만 건 실험)
  • 🎟️ 결제 API는 정말 중복 결제를 막을 수 있을까?
  • 🎟️ Redis 입장권 기반 예약 시스템은 정말 중복 예약을 막을까?
  • 🎟️ 선착순 강의에서 공연 티켓팅으로 확장한 이유
hak0622
hak0622
개발하면서 “이게 뭐지?”라는 순간마다 궁금한 점을 바탕으로 정리한 개발 블로그입니다.
  • hak0622
    궁금한 개발 이야기 Why?
    hak0622
  • 전체
    오늘
    어제
    • 분류 전체보기 (81)
      • 공부 (36)
        • 1. 자바 ORM 표준 JPA 프로그래밍 - 기본.. (35)
        • 시험 (1)
      • 프로젝트 (45)
        • 스프링 부트 3 백엔드 개발자 되기 Blog + .. (35)
        • 공연 티켓팅 프로젝트 (10)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
hak0622
🎟️ 예약 API 동시성 테스트 (다중 사용자 경쟁) 결과 보고
상단으로

티스토리툴바