백엔드

성능테스트를 위한 K6 사용법

do_hyuk 2025. 2. 24. 18:45
728x90
반응형

k6란 성능 테스트 및 부하 테스트를 위한 오픈 소스 도구이다.

웹 어플리케이션의 API 성능을 측정하는데 사용된다.

동시 접속, 가상의 유저, 반복 횟수 등을 설정해서 서버 응답 시간, 처리량 등을 확인 할 수 있습니다.

또한 가장 큰 장접은 Javascript 코드를 통해 테스트 시나리오를 작성 할 수 있다는 것이고 Grafana 진영에서 개발되어 연동이 수월해진다.

 

정리하자면

  • grafana에서 제공
  • javascript로 테스트 작성
  • 가상 유저, 반복, 서버 응답 시간, 처리량 등 확인 가능

Docker를 통해 k6를 사용해보겠다.

그냥 인텔리제이 터미널에서 진행했다.


1. 설치

docker image 다운로드
docker pull grafana/k6

 

 

2. 스크립트 작성

초기 생성 시 존재하는 기본 코드
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  vus: 10, // 1
  duration: '30s', // 2
};

export default function() {
  http.get('https://test.k6.io');
  sleep(1);
}

 

여기서는 k6의 scenarios라는 개념을 사용한다.

다양한 방법의 테스트를 할 수 있지만, scenarios 방식이 가장 적절해 보여서 이것을 사용했다.

 

먼저 options를 보겠다.

scenarios는 가상 사용자(VUs) 및 반복(Iterations)을 상세하게 구성하는 것이다.

시나리오를 사용하면 다양한 워크로드나 부하 테스트에서의 트래픽 패턴을 모델링할 수 있다.

maxDuration은 부하 테스트의 timeout 정도로 보면 된다.

만약 부하 테스트에 걸리는 시간이 30초를 초과하게 된다면 도중 테스트를 종료하고 나머지 작업은 drop으로 간주한다

 

3. Docker Compose 설정

version: '3.7'

services:
  k6:
    image: grafana/k6:latest
    volumes:
      - ./scripts:/scripts
    command: run /scripts/test.js
    networks:
      - k6-network

networks:
  k6-network:

 

4. Docker 에서 실행

docker compose --env-file .env up

 

그리고 아래부분은 실제 javascript 코드로

로컬환경의 8080포트에 띄워진 서버에 GET(/apitest)요청을 하게 된다.

docker로 localhost를 호출할 때에는 host.docker.internal:{port} 형식으로 기입해주면 된다.

로드 테스트가 외부 환경이라면 그에 맞는 Host를 기입하여 준다.

 

check는 k6 모듈에서 제공하는 기능이다.

위 코드에선 HTTP 상태 코드가 200일 때 성공으로 보고 처리율을 계산하게 된다.

그 외에 유용한 기능은 공식 문서에서 확인 가능하다.

 

import http from 'k6/http';
import { check, sleep } from 'k6';
import {encode} from "./util.js";


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

export default function() {

    const data = {
        "sub" : "abc@naver.com",
        "auth" : "손님,회원",
        "exp" : Date.now() + 1800000
    }

    const acc = encode(data, SECRETE_KEY);
    console.log(acc);

    const response = http.get("http://host.docker.internal:8080/v1/api/auth/test", {
        headers: {
            'Content-Type': 'application/json',
            'Authorization' : `Bearer ${acc}`
        }
    });
    check(response, {
        "is status 200" :(r) => r.status === 200
    })
    sleep(1);
}

 

 

쉽고 빠르게 K6 성능 분석표 이해하기

728x90
반응형