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) 동시 부하.
| 단계 | 지속 시간 | 목표 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%)
| 단계 | 지속 시간 | 목표 VU |
|---|---|---|
| 램프업 | 30s | 5 |
| 피크 | 90s | 20 |
| 쿨다운 | 30s | 0 |
흐름: SockJS raw WebSocket 연결 → STOMP CONNECT(JWT Bearer) → /sub/chat/{roomId} 구독 → /pub/chat.message.{roomId} 전송 → Redis pub/sub 브로드캐스트 수신 후 종료
| 지표 | 결과 |
|---|---|
| 총 요청 수 | 5,856건 |
| 에러율 | 0.00% |
| 최대 동시 VU | 70 (REST 50 + WS 20) |
| 총 실행 시간 | 3분 00초 |
| rest_load | ✅ 통과 |
| ws_load | ✅ 통과 |
| 지표 | 결과 | 임계값 |
|---|---|---|
| 평균 응답시간 | 11ms | — |
| p95 응답시간 | 30ms | < 1,000ms ✅ |
| 에러율 | 0.00% | < 5% ✅ |
| 지표 | 결과 | 임계값 |
|---|---|---|
| 연결 지연 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