1. 개요

이 프로젝트는 콘서트 예매 시스템에서 선착순 예약을 공정하게 처리하기 위해 대기열 처리 시스템의 성능과 안정성을 검증하는 데 목적이 있다. 대기열 진입 시점에 급격한 사용자 요청이 몰리는 상황을 스파이크 트래픽으로 모델링하여 시스템의 병목 현상, 응답 시간, 처리량을 정량적으로 측정하였다.

1.1 테스트 목적

1.2 테스트 대상

대상 API는 스크립트를 통해 호출되는 대기열 토큰 발급 API이다. 이 API는 Redis 기반 SortedSet 큐에 사용자 토큰을 삽입하며 동시에 중복 체크와 TTL 설정, 발급 성공 여부 확인 등을 수행한다.

1.3 테스트 인프라 구성

구분 상세 내용 비고
애플리케이션 서버 Spring Boot 기반 예약 API 포트: 8081
모니터링 도구 Prometheus + cadvisor 포트: 9090 / 8082
시각화 도구 Grafana 포트: 3000
부하 테스트 도구 k6 (CLI 기반 스크립트 실행) token-test.js 사용

1.4 테스트 시나리오

import http from 'k6/http';
import { check, sleep } from 'k6';
import { htmlReport } from '<https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js>';

export const options = {
  scenarios: {
    spike_test: {
      executor: 'ramping-arrival-rate',
      startRate: 10,
      timeUnit: '1s',
      preAllocatedVUs: 2000,
      maxVUs: 5000,
      stages: [
        { duration: '10s', target: 1000 },
        { duration: '20s', target: 10000 },
        { duration: '10s', target: 0 },
      ],
    },
  },
  thresholds: {
    http_req_duration: ['p(95)<1000'],
    http_req_failed: ['rate<0.05'],
    checks: ['rate>0.99'],
  },
};

const CONCERT_ID = __ENV.CONCERT_ID || 1;
const BASE_URL = __ENV.BASE_URL || '<http://localhost:8081>';

export default function () {
  const userId = Math.floor(Math.random() * 1000000) + 1;
  const url = `${BASE_URL}/token?concertId=${CONCERT_ID}`;
  const headers = { 'X-USER-ID': userId.toString() };

  const res = http.post(url, null, { headers });

  // 성공(202) 또는 선착순 실패(409)는 OK로 처리
  check(res, {
    'status is 202 or 409': (r) => r.status === 202 || r.status === 409,
    'no 5xx error': (r) => r.status < 500
  });

  sleep(1);
}

export function handleSummary(data) {
  return {
    'summary.html': htmlReport(data, { title: '대기열 토큰 발급 Spike Test 결과' }),
  };
}