테스트 목적: 실제 유저 트래픽 패턴을 시뮬레이션하여 목표 TPS 달성 여부 및 서버 안정성 검증
일일 활성 사용자(DAU) 500명을 기준으로, 피크 시간대 트래픽을 견딜 수 있는 목표치를 산출했습니다.
| 항목 | 수치 | 산출 근거 |
|---|---|---|
| DAU | 500명 | 초기 서비스 목표 사용자 수 |
| 1인당 요청 | 30회 | 검색(10) + 상세조회(15) + 스크리닝(5) |
| 평균 TPS | 0.52 | (500명 × 30회) ÷ 28,800초(8시간) |
| 최종 목표 | 50 TPS | 평균 TPS × 10(성장치) × 3(피크) × 2(안전계수) |
- Framework: Locust (Python)
- Server: Spring Boot (Localhost)
실제 앱 사용 패턴을 반영하여 API별 호출 가중치를 부여했습니다.
class StockApiUser(HttpUser):
wait_time = between(0.3, 0.7) # 유저가 화면을 보는 시간 (평균 0.5초)
@task(59)
def autocomplete(self):
"""자동검색 (59%): 검색창 타이핑 시 실시간 호출"""
@task(24)
def stock_detail(self):
"""종목상세 (24%): 개별 종목 정보 조회"""
@task(18)
def screener(self):
"""스크리너 (18%): 조건에 맞는 종목 필터링 (Heavy Query)"""locust -f locustfile.py --headless -u 50 -r 5 -t 3m --host http://localhost:8080
- Users: 50명 (동시 접속자) / Time: 3분 지속
목표치인 50 TPS를 크게 상회하는 트래픽에서도 매우 안정적인 성능을 보였습니다.
| 지표 | 목표값 | 실측값 | 달성률 | 결과 |
|---|---|---|---|---|
| Throughput | 50 TPS | 163.2 RPS | 326% | 🚀 초과 달성 |
| Error Rate | < 1% | 0.00% | - | Pass |
| Avg Latency | < 200ms | 10 ms | - | ⚡ 매우 빠름 |
| P95 Latency | < 500ms | 18 ms | - | Pass |
각 API 엔드포인트별 상세 처리량과 응답 속도입니다. 가장 부하가 높은 '스크리너' 기능도 안정적인 속도를 유지했습니다.
전체 테스트 구간 동안의 트래픽 추이와 서버 응답 패턴입니다.
- RPS (초록색 선): 테스트 시작 직후 166 RPS에 도달하여 종료 시점까지 일정하게 유지됨.
- 응답 속도 (보라색 선): P95(상위 95%) 응답 속도가 평균 20ms 매우 안정적임. 후반부에 치솟은 부분이 있으며 GC 처리로 인한 지연으로 예상되고 해당 지연에도 40ms라는 빠른 성능을 유지함
- Failure (빨간색 선): 전 구간 0건으로 안정성 입증.
이번 테스트는 로컬 환경의 특수성이 반영된 결과임을 명시합니다.
- 서버 스펙: MacBook Air - Local Environment
- 한계점: 1. 로컬 루프백(Loopback) 통신으로 네트워크 Latency가 배제됨.
- 한계점: 2. 고성능 프로세서(M칩)로 인해 실제 운영 예상 환경(AWS t3.micro 등)보다 높은 퍼포먼스가 측정됨.
보완 계획: 추후 Docker Resource Limit(cpus: 0.5, memory: 512m)을 적용하여 저사양 환경 재검증.
실제 배포 후 네트워크 지연을 포함한 통합 테스트 진행 예정.
load-test/
├── locustfile.py # Locust 테스트 시나리오 스크립트
└── results/ # 테스트 결과
└── README.md # 문서