부하 테스트(Load Testing)는 시스템이 예상 트래픽과 피크 부하를 처리할 수 있는지 검증하는 성능 테스트 방법이다.
주요 부하 테스트 도구 비교
| 도구 | 언어 | 프로토콜 | CI/CD 통합 | 특징 |
|---|
| k6 | JS (Go 런타임) | HTTP/gRPC/WebSocket | 우수 | 개발자 친화적, 클라우드 확장 |
| JMeter | Java/GUI | HTTP/JDBC/JMS 등 | 보통 | GUI, 다양한 프로토콜 |
| Locust | Python | HTTP | 좋음 | 코드로 시나리오 |
| Gatling | Scala/DSL | HTTP | 좋음 | 상세 리포트 |
| Artillery | JS/YAML | HTTP/WebSocket | 우수 | YAML 정의 |
k6 기본 테스트
javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
import { Rate } from 'k6/metrics';
const errorRate = new Rate('errors');
export const options = {
stages: [
{ duration: '2m', target: 100 }, // 램프업
{ duration: '5m', target: 100 }, // 유지
{ duration: '2m', target: 0 }, // 램프다운
],
thresholds: {
http_req_duration: ['p(95)<500'], // 95%ile 500ms 이하
errors: ['rate<0.1'], // 에러율 10% 이하
},
};
export default function () {
const response = http.get('https://api.example.com/users');
const result = check(response, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
});
errorRate.add(!result);
sleep(1);
}
k6 시나리오 (복잡한 흐름)
javascript
export const options = {
scenarios: {
browse: {
executor: 'constant-vus',
vus: 50,
duration: '5m',
exec: 'browseProducts',
},
checkout: {
executor: 'ramping-vus',
startVUs: 0,
stages: [{target: 20, duration: '5m'}],
exec: 'doCheckout',
},
},
};
export function browseProducts() {
http.get('/api/products');
sleep(Math.random() * 3);
}
export function doCheckout() {
const payload = JSON.stringify({ productId: 1, quantity: 1 });
http.post('/api/orders', payload, {
headers: { 'Content-Type': 'application/json' },
});
sleep(5);
}
JMeter CLI 실행
bash
jmeter -n -t test-plan.jmx -l results.jtl -e -o reports/ -Jhost=api.example.com -Jthreads=100 -Jrampup=60