카테고리 없음

k6 부하테스트 완벽 가이드 – 2026년 최신 정리 (설치부터 실전 시나리오까지)

idea9329 2026. 4. 9. 14:55
728x90
반응형

📊 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

728x90
반응형