📊 k6 부하테스트 구성도
graph LR
A[테스트 스크립트 .js] --> B[k6 엔진 Go 기반]
B --> C[대상 서버 API / Web]
B --> D[결과 출력]
D --> D1[CLI Summary]
D --> D2[Grafana Cloud]
D --> D3[InfluxDB + Grafana]
D --> D4[JSON / CSV Export]
서론
서비스 배포 전 "트래픽이 몰리면 우리 서버가 버틸 수 있을까?"라는 질문은 모든 운영자와 개발자의 공통 고민입니다. 이 고민을 해결해주는 도구가 바로 k6입니다. Grafana Labs에서 관리하는 오픈소스 부하테스트 도구로, JavaScript 기반 스크립트와 Go 엔진의 조합으로 가볍고 강력한 성능을 자랑합니다. 이 글에서는 k6의 개념부터 설치, 실전 시나리오, 결과 분석까지 한 번에 정리합니다.
1. k6란?
k6는 Grafana Labs에서 개발·유지하는 오픈소스 부하테스트(Load Testing) 도구입니다. 테스트 시나리오를 JavaScript(ES6)로 작성하고, 내부적으로는 Go 언어로 빌드된 고성능 엔진이 실행합니다. JMeter처럼 무거운 GUI 없이 CLI 환경에서 동작하므로, CI/CD 파이프라인에 자연스럽게 통합할 수 있다는 것이 가장 큰 장점입니다.
지원 프로토콜
- HTTP / HTTPS (REST API)
- WebSocket
- gRPC
- Browser (k6 browser 모듈)
2. k6 vs JMeter vs Locust 비교
항목k6JMeterLocust
| 언어 | JavaScript | Java (XML GUI) | Python |
| 엔진 | Go (네이티브 바이너리) | Java (JVM) | Python (gevent) |
| 리소스 효율 | 매우 높음 | 보통 | 보통 |
| CI/CD 통합 | CLI 기반으로 우수 | 가능하나 무거움 | 가능 |
| GUI | 없음 (코드 기반) | 있음 | 웹 UI 있음 |
| 분산 테스트 | k6 Cloud / xk6-distributed | Remote JMeter | 내장 지원 |
| 학습 곡선 | JS 개발자에게 쉬움 | XML 기반으로 복잡 | Python 개발자에게 쉬움 |
핵심 차이는 리소스 효율입니다. 같은 머신에서 k6는 JMeter 대비 5~10배 이상의 가상 유저(VU)를 생성할 수 있습니다.
3. 설치 방법
macOS
brew install k6
Ubuntu / Debian
sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg \
--keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" \
| sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update && sudo apt-get install k6
Docker
docker run --rm -i grafana/k6 run - < script.js
설치 확인
k6 version
4. 기본 테스트 스크립트 작성
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 50, // 동시 가상 유저 50명
duration: '1m', // 1분간 실행
thresholds: {
http_req_duration: ['p(95)<500'], // 95% 응답이 500ms 이내
http_req_failed: ['rate<0.01'], // 에러율 1% 미만
},
};
export default function () {
const res = http.get('https://example.com/api/health');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 300ms': (r) => r.timings.duration < 300,
});
sleep(1);
}
실행
k6 run script.js
5. 실전 시나리오별 설정
5-1. Smoke Test (기본 동작 확인)
export const options = {
vus: 1,
duration: '10s',
};
배포 직후 API가 정상 동작하는지 최소 부하로 확인하는 용도입니다.
5-2. Load Test (일반 부하)
export const options = {
stages: [
{ duration: '2m', target: 100 }, // 2분 동안 100명까지 증가
{ duration: '5m', target: 100 }, // 5분간 100명 유지
{ duration: '2m', target: 0 }, // 2분 동안 점진적 감소
],
};
5-3. Stress Test (한계 확인)
export const options = {
stages: [
{ duration: '2m', target: 200 },
{ duration: '5m', target: 200 },
{ duration: '2m', target: 500 },
{ duration: '5m', target: 500 },
{ duration: '2m', target: 0 },
],
};
5-4. Spike Test (급격한 트래픽)
export const options = {
stages: [
{ duration: '10s', target: 0 },
{ duration: '1m', target: 1000 }, // 갑자기 1000명
{ duration: '10s', target: 0 }, // 즉시 0으로
],
};
6. 인증이 필요한 API 테스트
import http from 'k6/http';
export default function () {
// 로그인 후 토큰 획득
const loginRes = http.post('https://example.com/api/login', JSON.stringify({
username: 'testuser',
password: 'testpass',
}), { headers: { 'Content-Type': 'application/json' } });
const token = loginRes.json('access_token');
// 인증된 API 호출
http.get('https://example.com/api/data', {
headers: { Authorization: `Bearer ${token}` },
});
}
7. 결과 분석 핵심 지표
k6 실행이 끝나면 CLI에 요약 결과가 출력됩니다. 반드시 확인해야 할 핵심 지표는 다음과 같습니다.
지표의미기준 예시
| http_req_duration | 요청 응답 시간 | p(95) < 500ms |
| http_req_failed | 요청 실패율 | rate < 0.01 (1%) |
| http_reqs | 초당 처리 요청 수 (RPS) | 높을수록 좋음 |
| vus | 현재 활성 가상 유저 수 | 설정값 확인 |
| iteration_duration | 한 루프 실행 시간 | 시나리오에 따라 다름 |
8. Grafana 연동으로 시각화하기
CLI 결과만으로는 추이 분석이 어렵습니다. InfluxDB + Grafana 조합으로 실시간 대시보드를 구성할 수 있습니다.
# InfluxDB로 결과 전송
k6 run --out influxdb=http://example.com:8086/k6 script.js
Grafana에서 k6 전용 대시보드 템플릿(ID: 2587)을 import하면 응답 시간, RPS, 에러율 등을 실시간 차트로 확인할 수 있습니다.
9. CI/CD 파이프라인 통합 예시 (GitHub Actions)
name: k6 Load Test
on:
push:
branches: [main]
jobs:
load-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run k6 test
uses: grafana/k6-action@v0.3.1
with:
filename: tests/load-test.js
thresholds를 설정해두면, 기준을 넘길 경우 k6가 exit code 99를 반환하므로 파이프라인이 자동으로 실패 처리됩니다.
10. 실무 팁 정리
스크립트 관리: 테스트 스크립트를 Git으로 버전 관리하면 "이전에 어떤 조건으로 테스트했는지" 추적이 쉽습니다.
환경 변수 활용: 대상 URL을 하드코딩하지 말고 __ENV.BASE_URL로 분리하면 dev/staging/prod 환경을 스크립트 수정 없이 전환할 수 있습니다.
k6 run -e BASE_URL=https://example.com script.js
태그와 그룹: group()과 tag를 활용하면 API 엔드포인트별 응답 시간을 분리해서 분석할 수 있습니다.
분산 테스트: 단일 머신의 한계를 넘어서야 할 때는 Grafana Cloud k6를 활용하거나, 여러 머신에서 동시에 k6를 실행하는 방식을 사용합니다.
마무리
k6는 가볍고 빠르며 코드 기반이라는 세 가지 강점 덕분에, 현대적인 인프라 운영 환경에서 부하테스트 도구의 사실상 표준으로 자리 잡고 있습니다. EKS 클러스터 위에 올린 API든, EC2 단일 인스턴스든, 배포 전에 k6로 한 번 돌려보는 습관이 장애를 예방하는 가장 확실한 방법입니다.
SEO 키워드: k6 부하테스트, k6 설치, k6 사용법, k6 vs JMeter, 부하테스트 도구 비교, k6 Grafana 연동, k6 CI/CD, k6 스트레스 테스트, k6 스크립트 작성, 오픈소스 성능 테스트 2026