k6 API 부하 테스트: 실전 가이드

실용적인 k6 부하 테스트 가이드: k6 설치, 첫 스크립트 작성, VUs, 단계, 임계값 설정, p95/p99 결과 확인, 그리고 CI에서 실행.

Ashley Goolam

Ashley Goolam

25 June 2026

k6 API 부하 테스트: 실전 가이드

Apidog 엔터프라이즈

온프레미스 배포

SSO & RBAC

SOC 2 준수

Apidog Enterprise 살펴보기

API가 한 명의 사용자에게는 잘 작동하지만 트래픽이 몰리면 중단된다면 부하 테스트가 필요하며, k6는 이를 수행하는 가장 깔끔한 방법 중 하나입니다. 이 가이드는 k6가 무엇인지, 설치 방법, 첫 번째 스크립트 작성 방법, 그리고 결과를 읽는 방법을 다루므로 부하 테스트를 일반적인 API 성능 테스트 루틴의 일부로 다룰 수 있습니다. 또한 세부 사항이 중요한 공식 k6 문서를 참조하여 k6가 CI에서 기능 테스트와 어떻게 조화를 이루는지 살펴보겠습니다.

k6란 무엇인가요?

k6는 Grafana에서 현재 관리하는 오픈 소스 부하 테스트 도구입니다. 테스트를 JavaScript 파일로 작성하면 k6는 빠른 Go 엔진으로 이를 실행하고, 시뮬레이션된 트래픽으로 엔드포인트를 공격합니다. 이러한 분리는 의도적입니다. 대부분의 개발자가 이미 알고 있는 언어로 테스트를 작성하지만, 부하 생성기 자체는 컴파일된 Go로 실행되므로 단일 머신에서 성능 저하 없이 많은 가상 사용자를 구동할 수 있습니다.

k6는 한 가지 작업을 위해 만들어졌고, 그 작업을 훌륭하게 수행합니다. 즉, 지속적이고 반복 가능한 부하를 생성하고 시스템이 어떻게 반응하는지 측정합니다. 대기 시간 백분위수, 요청 속도, 오류율을 보고하고 이러한 숫자에 대한 합격/불합격 규칙을 설정할 수 있습니다. 바로 그 집중이 핵심입니다. k6는 API 클라이언트, 문서화 도구 또는 기능 테스트 프레임워크가 아닙니다. 이는 부하 엔진입니다.

자주 접하게 될 몇 가지 용어:

k6 설치

k6는 단일 바이너리로 제공되므로 설치가 간단합니다. Homebrew를 사용하는 macOS에서는 다음과 같습니다.

brew install k6

Chocolatey를 사용하는 Windows에서는 다음과 같습니다.

choco install k6

Debian 또는 Ubuntu에서는 Grafana apt 저장소를 추가하고 설치합니다.

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

작동하는지 확인합니다.

k6 version

로컬에 아무것도 설치하고 싶지 않다면 Docker 이미지도 사용할 수 있습니다. 패키지 세부 정보는 시간이 지남에 따라 변경될 수 있으므로 문서의 설치 페이지에서 현재 명령을 확인하세요.

첫 번째 k6 스크립트

k6 테스트는 기본 함수가 있는 JavaScript 모듈입니다. k6는 각 반복마다 각 VU에 대해 해당 함수를 한 번 호출합니다. 다음은 하나의 엔드포인트를 호출하고 응답을 확인하는 최소한의 스크립트입니다.

import http from 'k6/http';
import { check, sleep } from 'k6';

export default function () {
  const res = http.get('https://test-api.example.com/users');

  check(res, {
    'status is 200': (r) => r.status === 200,
    'body is not empty': (r) => r.body.length > 0,
  });

  sleep(1);
}

`script.js`로 저장하고 실행합니다.

k6 run script.js

기본적으로 k6는 하나의 VU를 사용하여 한 번의 반복을 실행합니다. `sleep(1)`은 반복 사이에 1초의 일시 정지를 추가하여 실제 사용자가 작업 사이에 일시 정지하는 것을 모방합니다. sleep이 없으면 각 VU는 네트워크가 허용하는 한 빨리 반복을 수행하며, 이는 순수 처리량 테스트에는 유용하지만 사용자 행동 시뮬레이션에는 비현실적입니다.

`check()` 호출은 소프트 어설션입니다. 실패한 확인은 요약에 표시되지만 실행을 중지하지는 않습니다. 이는 의도적인 것입니다. 과도한 부하에서는 일부 실패를 예상하며, 테스트가 계속 측정되어 상황이 얼마나 나빠지는지 확인할 수 있도록 하고 싶습니다.

VU, 단계 및 임계값

첫 번째 스크립트는 한 명의 사용자를 한 번 실행합니다. 실제 부하 테스트는 얼마나 많은 사용자가 API를 얼마나 오랫동안 호출하는지 제어하는 ​​것입니다. 이는 내보낸 `options` 객체로 구성합니다.

가장 간단한 형태는 고정된 VU 수와 지속 시간을 설정합니다.

export const options = {
  vus: 50,
  duration: '30s',
};

이는 50명의 가상 사용자를 30초 동안 실행합니다. 더 유용한 것은 트래픽이 증가하고, 유지되며, 감소하는 것을 시뮬레이션할 수 있는 단계로 구성된 램핑 프로필입니다.

export const options = {
  stages: [
    { duration: '1m', target: 100 },  // ramp up to 100 VUs
    { duration: '3m', target: 100 },  // hold at 100 VUs
    { duration: '1m', target: 0 },    // ramp down to 0
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'],   // 95% of requests under 500ms
    http_req_failed: ['rate<0.01'],     // less than 1% errors
  },
};

임계값은 k6가 CI에서 자리를 잡는 곳입니다. 임계값이 실패하면 k6는 0이 아닌 코드로 종료됩니다. 이는 대기 시간 또는 오류율이 설정한 선을 넘을 때 파이프라인 단계에서 빌드를 실패할 수 있음을 의미합니다. 기능적 어설션을 인코딩하는 것과 동일한 방식으로 성능 예산을 코드로 인코딩하는 것입니다.

일반적인 부하 프로필과 각 프로필이 답변하는 질문에 대한 간략한 안내입니다.

프로필 목표 알려주는 정보
Smoke 아주 적은 부하, 스크립트 실행 확인 테스트 자체가 올바른지
Load 예상되는 일반 트래픽 API가 일상적으로 잘 작동하는지
Stress 예상 최고점을 넘어 테스트 어디에서 문제가 발생하기 시작하는지
Spike VU의 갑작스러운 급증 트래픽 급증을 견딜 수 있는지
Soak 몇 시간 동안의 중간 부하 메모리 누수, 점진적인 성능 저하

다섯 가지 모두 필요하지는 않습니다. 스모크 및 부하 테스트부터 시작하십시오. 일반적인 수치를 알게 되면 스트레스 및 스파이크 테스트를 추가하십시오. 접근 방식과 그 뒤에 있는 메트릭에 대한 더 광범위한 조사를 위해 성능 테스트의 기본 원리는 k6뿐만 아니라 모든 도구에 적용됩니다.

k6 결과 읽기

실행이 완료되면 k6는 터미널에 요약을 출력합니다. 가장 중요한 줄은 다음과 같습니다.

평균이 아닌 백분위수를 읽으십시오. 평균 응답 시간이 200ms이면 괜찮아 보이지만, p99가 4초라면 100명 중 한 명의 사용자가 4초를 기다린다는 의미입니다. 이러한 꼬리 부분에서 사용자 이탈이 발생합니다.

터미널에서 직접 확인하는 것 이상으로, k6는 결과를 외부 출력으로 스트리밍할 수 있습니다. JSON 또는 CSV를 작성하며, Grafana 대시보드 및 Prometheus와 통합되어 실행 중에 실시간 시각적 분석을 제공합니다. k6와 Grafana의 이러한 조합 때문에 이 도구를 종종 “grafana k6”라고 부릅니다. 일회성 테스트에는 터미널 요약으로 충분하지만, 지속적인 모니터링을 위해서는 메트릭을 차트로 만들 수 있는 곳으로 보내야 합니다.

k6가 적합한 곳, 그리고 Apidog가 적합한 곳

k6는 부하 엔진입니다. “지속적인 트래픽 하에서 내 시스템이 어떻게 작동하는가”에 답합니다. API가 올바른 데이터를 반환하는지, 계약과 일치하는지, 또는 모든 엔드포인트에서 인증을 올바르게 처리하는지는 확인하지 않습니다. 이는 기능 및 계약 테스트 질문이며, 다른 도구가 필요합니다.

이것이 명확하게 유지해야 할 구분입니다. 파이프라인에 두 가지 유형의 테스트를 모두 원하며, 이들은 서로 경쟁하지 않습니다.

관심사 가장 잘 처리하는 도구 답변하는 질문
지속적인 과부하, 대규모 백분위수 k6 트래픽이 많을 때도 빠른가
기능적 정확성, 계약, 인증 Apidog 올바른 것을 반환하는가
모든 커밋에 대한 CI의 회귀 Apidog (apidog run) 이 변경 사항이 엔드포인트를 손상시켰는가
CI의 성능 예산 k6 임계값 대기 시간 또는 오류가 임계값을 넘었는가

Apidog는 정확성 측면을 처리합니다. API를 설계하거나 가져와서 시각적 어설션으로 테스트 시나리오를 구축하고, k6 스크립트를 실행하는 것과 동일한 방식으로 `apidog run`을 사용하여 CI에서 실행할 수 있습니다. Apidog CLI 가이드는 이러한 기능 테스트를 파이프라인에 연결하는 방법을 설명합니다. Apidog는 또한 Apidog의 API 성능 테스트 설명서에 설명된 빠른 확인을 위한 경량 성능 테스트 기능을 포함하지만, k6 수준의 부하 생성기는 아니며 그렇게 되려고 하지도 않습니다.

실제 워크플로는 다음과 같습니다. 모든 커밋에서 Apidog는 API가 여전히 제대로 작동하는지 확인하기 위해 기능 및 계약 테스트를 실행합니다. 예약에 따라 또는 릴리스 전에 k6는 스테이징 환경에 대해 부하 프로필을 실행하여 트래픽이 많을 때도 API가 빠르게 유지되는지 확인합니다. 정확성 게이트와 성능 게이트는 각각 해당 용도로 구축된 도구로 처리됩니다.

커밋하기 전에 엔진을 비교하고 있다면 k6는 JMeter, Gatling, Locust와 함께 위치합니다. 부하 테스트 도구 총정리와 이 Locust 대안 비교는 스크립팅 언어나 규모에 따라 선택이 달라질 경우의 장단점을 설명합니다.

자주 묻는 질문

k6는 무료인가요?

네, 그렇습니다. k6는 AGPL 라이선스 하에 오픈 소스이며, 바이너리는 사용자의 하드웨어 용량을 넘어선 가상 사용자 수 제한 없이 로컬에서 무료로 실행할 수 있습니다. Grafana는 또한 대규모 분산 테스트를 실행하고 결과를 저장하기 위한 유료 서비스인 k6 Cloud를 제공하지만, 이를 반드시 사용할 필요는 없습니다. 핵심 도구만으로도 대부분의 팀에 충분합니다. 다른 무료 옵션을 먼저 살펴보고 싶다면, 부하 테스트 도구 개요에서 각 도구가 제공하는 기능을 확인할 수 있습니다.

k6를 사용하려면 JavaScript를 알아야 하나요?

깊은 전문 지식이 아닌 기본적인 JavaScript 지식이 필요합니다. 대부분의 k6 스크립트는 기본 함수, 일부 `http.get` 또는 `http.post` 호출, 몇 가지 확인 및 옵션 객체로 구성됩니다. 이 가이드의 예제를 읽을 수 있다면 작동하는 테스트를 작성할 수 있습니다. 빌드 단계나 학습할 프레임워크가 없으며, k6 API만 알면 됩니다.

성능 테스트를 위한 k6와 Apidog의 차이점은 무엇인가요?

k6는 지속적인 과도한 트래픽을 유도하고 대규모 백분위수를 보고하도록 구축된 전용 부하 생성기입니다. Apidog는 설계, 기능 테스트 및 계약 테스트에 중점을 둔 API 플랫폼으로, 빠른 확인을 위한 경량 성능 테스트 기능을 제공합니다. 실제 부하와 CI 성능 예산이 필요할 때는 k6를 사용하십시오. 정확성, 계약 유효성 검사 및 모든 커밋에 대한 기능 테스트 실행에는 Apidog를 사용하십시오. 이들은 서로 다른 문제를 해결하며 잘 함께 작동합니다.

CI/CD에서 k6를 실행할 수 있나요?

네, 가능하며 일반적인 설정입니다. k6는 임계값이 실패하면 0이 아닌 코드로 종료되므로, 모든 CI 시스템은 성능 회귀 시 빌드를 실패시킬 수 있습니다. 파이프라인 단계로 `k6 run script.js`를 실행하고, 스테이징 환경을 지정하고, p95 대기 시간 및 오류율에 대한 임계값을 설정하십시오. `apidog run`의 기능 테스트와 함께 사용하면 각 커밋이 정확성 검사와 부하 검사를 모두 받게 됩니다.

결론

k6는 API에 실제 부하를 가하고 발생하는 일을 측정하는 깔끔하고 스크립트 가능한 방법을 제공합니다. 바이너리를 설치하고, 짧은 JavaScript 파일을 작성하고, VU와 단계를 설정하고, 임계값을 추가하고, 백분위수를 읽으십시오. 이것이 전체 루프입니다. 부하 테스트와 기능 테스트는 각각 다른 질문에 답하므로 분리하여 유지하고, 아무것도 놓치지 않도록 CI에서 모두 실행하십시오.

그 구분에서 정확성 측면을 위해 Apidog는 API를 한 곳에서 설계, 테스트, 모의 및 문서화한 다음, `apidog run`을 사용하여 CI에서 기능 테스트를 실행할 수 있도록 합니다. 계약 수준의 신뢰도를 k6 부하 실행과 함께 사용하려면 Apidog를 다운로드하십시오.

button

Apidog에서 API 설계-첫 번째 연습

API를 더 쉽게 구축하고 사용하는 방법을 발견하세요