docs/load-test-report.md 원본 정리. k6 v2.0.0(Grafana Labs), travel-core-service(Spring Boot 3, localhost:8080) 대상, REST API + WebSocket(STOMP over SockJS) 동시 부하.

시나리오 구성

rest_load — REST API 램프업 부하

단계 지속 시간 목표 VU
워밍업 30s 10
정상 부하 60s 30
피크 부하 60s 50
쿨다운 30s 0

테스트 대상 API(랜덤 분배): GET /api/workspaces/{id}(40%), GET /api/conquest(30%), GET /api/v1/messaging/rooms(30%)

ws_load — WebSocket STOMP 동시 접속

단계 지속 시간 목표 VU
램프업 30s 5
피크 90s 20
쿨다운 30s 0

흐름: SockJS raw WebSocket 연결 → STOMP CONNECT(JWT Bearer) → /sub/chat/{roomId} 구독 → /pub/chat.message.{roomId} 전송 → Redis pub/sub 브로드캐스트 수신 후 종료


테스트 결과 (3분 풀 부하)

지표 결과
총 요청 수 5,856건
에러율 0.00%
최대 동시 VU 70 (REST 50 + WS 20)
총 실행 시간 3분 00초
rest_load ✅ 통과
ws_load ✅ 통과

REST API 성능

지표 결과 임계값
평균 응답시간 11ms —
p95 응답시간 30ms < 1,000ms ✅
에러율 0.00% < 5% ✅

WebSocket + Redis pub/sub 성능

지표 결과 임계값
연결 지연 p95 0ms < 2,000ms ✅
메시지 왕복 p95 0ms < 500ms ✅

<aside> ℹ️

WebSocket 메시지 왕복이 0ms로 측정된 이유: 로컬 환경에서 Redis와 Spring Boot가 동일 호스트에 있어 pub/sub 브로드캐스트 지연이 측정 단위(1ms) 미만으로 처리됨. 프로덕션(별도 네트워크 홉)에서는 이보다 높게 나올 수 있음 — 참고용 수치로 해석할 것.

</aside>

thresholds:
  http_req_duration  p(95) < 1000ms  → 30ms  ✅
  ws_connect_latency p(95) < 2000ms  → 0ms   ✅
  ws_message_latency p(95) < 500ms   → 0ms   ✅
  error_rate         rate  < 0.05    → 0.00% ✅

실행 명령어

k6 run \
  -e JWT_TOKEN=<ACCESS_TOKEN> \
  -e WORKSPACE_ID=1 \
  -e MESSAGING_ROOM_ID=1 \
  k6/load-test.js

분석 요약