1. K6란?
개발을 하다 보면, "우리 서비스에 갑자기 수백 명, 수천 명이 몰리면 서버가 과연 잘 버틸까?"라는 고민을 하게 됩니다. 특히 API 서버나 웹 서비스는 예기치 못한 트래픽 상황에서 무너질 수 있기 때문에, 사전에 성능을 점검하고 튜닝하는 작업이 필요하죠. 그럴 때 유용하게 쓸 수 있는 도구 중 하나가 바로 K6입니다.
K6는 JavaScript 기반의 스크립트로 테스트 시나리오를 작성할 수 있는 오픈소스 부하 테스트 도구입니다. 기존의 부하 테스트 도구들이 XML 설정이나 복잡한 UI를 요구했다면, K6는 코드로 직접 작성하기 때문에 개발자 입장에서 훨씬 자연스럽고 편리하게 사용할 수 있습니다.
지금부터는 k6를 설치하고 부하테스트를 진행한 후, Grafana로 시각화하는 방법까지 단계별로 정리해보도록 하겠습니다.
2. K6 + Grafana + InfluxDB 구성하기
K6로 부하 테스트를 실행하면, 단순히 요청을 보내고 끝나는 것이 아니라 다양한 지표들이 수집됩니다. (ex 요청 성공률, 응답 시간, 처리 속도, 에러율) 이 데이터를 단순히 콘솔에 출력해서 확인할 수도 있지만, 수백 수천 건의 요청 데이터를 눈으로 보면서 분석하기는 쉽지 않습니다.
여기서 중요한 역할을 하는 것이 바로 InfluxDB입니다.
InfluxDB는 시계열 데이터를 저장하는 데 특화된 데이터베이스입니다. 시계열 데이터란 말 그대로 시간에 따라 변화하는 데이터를 말하는데, 부하 테스트 결과 역시 시간 축을 따라 변화하는 메트릭이기 때문에 InfluxDB와 매우 잘 맞습니다.
K6는 실행 시 K6_OUT 환경변수를 통해 InfluxDB를 출력 대상으로 지정할 수 있습니다. 이렇게 설정해두면 K6는 테스트 도중 발생하는 모든 메트릭 데이터를 실시간으로 InfluxDB에 기록하게 됩니다. 이후에 Grafana가 InfluxDB를 데이터 소스로 삼아,그래프 형태로 시각화하면서 시간에 따른 성능 변화, 에러 발생 시점, 병목 구간 등 다양한 인사이트를 얻을 수 있습니다.
지금부터는 본격적으로 이 3가지 요소를 docker 환경에 구성해보도록 하겠습니다.
docker-compose.yml 만들기
version: '3.8'
services:
influxdb:
image: influxdb:1.8
ports:
- "8086:8086"
volumes:
- influxdb:/var/lib/influxdb
environment:
- INFLUXDB_DB=k6
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana:/var/lib/grafana
k6:
image: grafana/k6
volumes:
- ./k6:/scripts
depends_on:
- influxdb
environment:
- K6_OUT=influxdb=http://influxdb:8086/k6
volumes:
influxdb:
grafana:
docker-compose up -d를 명령어를 통해 컨테이너를 생성해줍니다.
이 후 테스트 스크립트를 작성해 줍니다. (10명의 유저가 10초동안 해당 경로로 요청을 보낼 경우)
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 10,
duration: '10s',
};
export default function () {
const res = http.get('http://host.docker.internal:8081/api/v1/tickets/1');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}
아래 명령어를 통해 스크립트를 실행하면 테스트 결과를 확인할 수 있습니다.
docker-compose run k6 run /scripts/script.js

3. 그라파나를 통한 시각화
다음으로는 그라파나를 통해 시각화 하는 과정을 진행해보겠습니다.
localhost:3000 포트를 통해 그라파나에 접속합니다. (아이디, 비밀번호 초기값은 admin)

Data sources에 들어가 InfluxDB 를 추가해줍니다.


URL에 InfluxDB 경로를 넣어주고, Database 칸에 k6를 입력해 준 후 Save & Test 버튼을 눌러줍니다.


데이터 소스 추가가 완료되었다면 대시보드를 생성해줍니다. 그라파나는 다양한 대시보드 템플릿을 제공해주는데 그 중 2587 템플릿을 사용해보았습니다.
Load 버튼을 누르면 완성된 대시보드의 모습을 확인할 수 있습니다.

4. 부하테스트를 통한 성능 개선하기
지금까지 K6, InfluxDB, Grafana를 활용한 부하 테스트 환경을 구성해보았습니다. 이렇게 구축한 테스트 환경은 단순한 시나리오 테스트를 넘어, 실제 서비스에서 발생할 수 있는 병목 구간을 미리 파악하고 성능을 개선하는 데에도 유용하게 활용됩니다.
이제 이러한 환경을 바탕으로, 실제로 성능 이슈가 발생할 수 있는 구간에 대한 테스트를 진행해보겠습니다.
그중 하나로, 티켓 상세 조회 API는 사용자 트래픽이 집중될 때 성능 저하가 발생하기 쉬운 대표적인 구간입니다. 특히 예매가 시작되는 시간이나 인기 공연의 경우, 수많은 사용자가 동시에 동일한 데이터를 요청하게 되므로 빠르고 안정적인 응답이 필수적입니다. 따라서 해당 API에 대해 부하 테스트를 진행하고, 그 결과를 기반으로 성능을 개선해보는 과정을 살펴보겠습니다.
1000명의 가상 사용자(VUs)가 1분 동안 동시에 유지되며 해당 함수를 반복해서 실행하는 스크립트를 작성하고 실행해줍니다.
docker-compose run k6 run /scripts/script.js
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 1000,
duration: '1m',
};
export default function () {
const res = http.get('http://host.docker.internal:8081/api/v1/tickets/1');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}

해당 테스트 결과, 평균 응답 시간은 520.12ms, 실패한 요청은 총 9건으로 확인되었습니다. 이는 트래픽이 몰릴 경우 성능 저하가 발생할 수 있음을 의미합니다.
이러한 문제를 해결하기 위해, Redis 기반 캐시를 도입하였습니다. 자주 조회되는 티켓 상세 데이터를 Redis에 저장하고, 일정 시간 동안 동일한 요청에 대해서는 데이터베이스가 아닌 캐시에서 빠르게 응답하도록 처리했습니다.


캐시 적용 후 동일한 부하 테스트를 다시 수행한 결과, 평균 응답 시간은 17.44ms로 대폭 감소하였고, 에러율 또한 0%로 줄어든 것을 확인할 수 있습니다.
참고
https://grafana.com/blog/2023/04/11/how-to-visualize-load-testing-results/
How to visualize k6 results: guidelines for choosing the right metrics | Grafana Labs
Llandy Riveron Del Risco · 20 Mar 2025 · 7 min read An open source app for easily building performance tests: Grafana k6 Studio is generally available
grafana.com
https://grafana.com/docs/k6/latest/using-k6/
Using k6 | Grafana k6 documentation
User-centered observability: load testing, real user monitoring, and synthetics Learn how to use load testing, synthetic monitoring, and real user monitoring (RUM) to understand end users' experience of your apps. Watch on demand.
grafana.com
'Backend > 프로젝트' 카테고리의 다른 글
Elasticsearch 활용한 검색서비스 만들기 4편 (Elasticsearch Testcontainers 활용한 테스트) (0) | 2025.03.20 |
---|---|
Elasticsearch 활용한 검색서비스 만들기 3편(검색어 자동완성 기능 + 검색 고도화하기) (0) | 2025.03.14 |
Elasticsearch 활용한 검색서비스 만들기 2편(feat. Spring Boot) (0) | 2025.03.12 |
Elasticsearch 활용한 검색 서비스 만들기 1편 (Docker로 Elasticsearch + Kibana 구축) (0) | 2025.03.10 |
무중단 배포 적용하기 (1) | 2025.01.01 |
1. K6란?
개발을 하다 보면, "우리 서비스에 갑자기 수백 명, 수천 명이 몰리면 서버가 과연 잘 버틸까?"라는 고민을 하게 됩니다. 특히 API 서버나 웹 서비스는 예기치 못한 트래픽 상황에서 무너질 수 있기 때문에, 사전에 성능을 점검하고 튜닝하는 작업이 필요하죠. 그럴 때 유용하게 쓸 수 있는 도구 중 하나가 바로 K6입니다.
K6는 JavaScript 기반의 스크립트로 테스트 시나리오를 작성할 수 있는 오픈소스 부하 테스트 도구입니다. 기존의 부하 테스트 도구들이 XML 설정이나 복잡한 UI를 요구했다면, K6는 코드로 직접 작성하기 때문에 개발자 입장에서 훨씬 자연스럽고 편리하게 사용할 수 있습니다.
지금부터는 k6를 설치하고 부하테스트를 진행한 후, Grafana로 시각화하는 방법까지 단계별로 정리해보도록 하겠습니다.
2. K6 + Grafana + InfluxDB 구성하기
K6로 부하 테스트를 실행하면, 단순히 요청을 보내고 끝나는 것이 아니라 다양한 지표들이 수집됩니다. (ex 요청 성공률, 응답 시간, 처리 속도, 에러율) 이 데이터를 단순히 콘솔에 출력해서 확인할 수도 있지만, 수백 수천 건의 요청 데이터를 눈으로 보면서 분석하기는 쉽지 않습니다.
여기서 중요한 역할을 하는 것이 바로 InfluxDB입니다.
InfluxDB는 시계열 데이터를 저장하는 데 특화된 데이터베이스입니다. 시계열 데이터란 말 그대로 시간에 따라 변화하는 데이터를 말하는데, 부하 테스트 결과 역시 시간 축을 따라 변화하는 메트릭이기 때문에 InfluxDB와 매우 잘 맞습니다.
K6는 실행 시 K6_OUT 환경변수를 통해 InfluxDB를 출력 대상으로 지정할 수 있습니다. 이렇게 설정해두면 K6는 테스트 도중 발생하는 모든 메트릭 데이터를 실시간으로 InfluxDB에 기록하게 됩니다. 이후에 Grafana가 InfluxDB를 데이터 소스로 삼아,그래프 형태로 시각화하면서 시간에 따른 성능 변화, 에러 발생 시점, 병목 구간 등 다양한 인사이트를 얻을 수 있습니다.
지금부터는 본격적으로 이 3가지 요소를 docker 환경에 구성해보도록 하겠습니다.
docker-compose.yml 만들기
version: '3.8'
services:
influxdb:
image: influxdb:1.8
ports:
- "8086:8086"
volumes:
- influxdb:/var/lib/influxdb
environment:
- INFLUXDB_DB=k6
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana:/var/lib/grafana
k6:
image: grafana/k6
volumes:
- ./k6:/scripts
depends_on:
- influxdb
environment:
- K6_OUT=influxdb=http://influxdb:8086/k6
volumes:
influxdb:
grafana:
docker-compose up -d를 명령어를 통해 컨테이너를 생성해줍니다.
이 후 테스트 스크립트를 작성해 줍니다. (10명의 유저가 10초동안 해당 경로로 요청을 보낼 경우)
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 10,
duration: '10s',
};
export default function () {
const res = http.get('http://host.docker.internal:8081/api/v1/tickets/1');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}
아래 명령어를 통해 스크립트를 실행하면 테스트 결과를 확인할 수 있습니다.
docker-compose run k6 run /scripts/script.js

3. 그라파나를 통한 시각화
다음으로는 그라파나를 통해 시각화 하는 과정을 진행해보겠습니다.
localhost:3000 포트를 통해 그라파나에 접속합니다. (아이디, 비밀번호 초기값은 admin)

Data sources에 들어가 InfluxDB 를 추가해줍니다.


URL에 InfluxDB 경로를 넣어주고, Database 칸에 k6를 입력해 준 후 Save & Test 버튼을 눌러줍니다.


데이터 소스 추가가 완료되었다면 대시보드를 생성해줍니다. 그라파나는 다양한 대시보드 템플릿을 제공해주는데 그 중 2587 템플릿을 사용해보았습니다.
Load 버튼을 누르면 완성된 대시보드의 모습을 확인할 수 있습니다.

4. 부하테스트를 통한 성능 개선하기
지금까지 K6, InfluxDB, Grafana를 활용한 부하 테스트 환경을 구성해보았습니다. 이렇게 구축한 테스트 환경은 단순한 시나리오 테스트를 넘어, 실제 서비스에서 발생할 수 있는 병목 구간을 미리 파악하고 성능을 개선하는 데에도 유용하게 활용됩니다.
이제 이러한 환경을 바탕으로, 실제로 성능 이슈가 발생할 수 있는 구간에 대한 테스트를 진행해보겠습니다.
그중 하나로, 티켓 상세 조회 API는 사용자 트래픽이 집중될 때 성능 저하가 발생하기 쉬운 대표적인 구간입니다. 특히 예매가 시작되는 시간이나 인기 공연의 경우, 수많은 사용자가 동시에 동일한 데이터를 요청하게 되므로 빠르고 안정적인 응답이 필수적입니다. 따라서 해당 API에 대해 부하 테스트를 진행하고, 그 결과를 기반으로 성능을 개선해보는 과정을 살펴보겠습니다.
1000명의 가상 사용자(VUs)가 1분 동안 동시에 유지되며 해당 함수를 반복해서 실행하는 스크립트를 작성하고 실행해줍니다.
docker-compose run k6 run /scripts/script.js
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 1000,
duration: '1m',
};
export default function () {
const res = http.get('http://host.docker.internal:8081/api/v1/tickets/1');
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(1);
}

해당 테스트 결과, 평균 응답 시간은 520.12ms, 실패한 요청은 총 9건으로 확인되었습니다. 이는 트래픽이 몰릴 경우 성능 저하가 발생할 수 있음을 의미합니다.
이러한 문제를 해결하기 위해, Redis 기반 캐시를 도입하였습니다. 자주 조회되는 티켓 상세 데이터를 Redis에 저장하고, 일정 시간 동안 동일한 요청에 대해서는 데이터베이스가 아닌 캐시에서 빠르게 응답하도록 처리했습니다.


캐시 적용 후 동일한 부하 테스트를 다시 수행한 결과, 평균 응답 시간은 17.44ms로 대폭 감소하였고, 에러율 또한 0%로 줄어든 것을 확인할 수 있습니다.
참고
https://grafana.com/blog/2023/04/11/how-to-visualize-load-testing-results/
How to visualize k6 results: guidelines for choosing the right metrics | Grafana Labs
Llandy Riveron Del Risco · 20 Mar 2025 · 7 min read An open source app for easily building performance tests: Grafana k6 Studio is generally available
grafana.com
https://grafana.com/docs/k6/latest/using-k6/
Using k6 | Grafana k6 documentation
User-centered observability: load testing, real user monitoring, and synthetics Learn how to use load testing, synthetic monitoring, and real user monitoring (RUM) to understand end users' experience of your apps. Watch on demand.
grafana.com
'Backend > 프로젝트' 카테고리의 다른 글
Elasticsearch 활용한 검색서비스 만들기 4편 (Elasticsearch Testcontainers 활용한 테스트) (0) | 2025.03.20 |
---|---|
Elasticsearch 활용한 검색서비스 만들기 3편(검색어 자동완성 기능 + 검색 고도화하기) (0) | 2025.03.14 |
Elasticsearch 활용한 검색서비스 만들기 2편(feat. Spring Boot) (0) | 2025.03.12 |
Elasticsearch 활용한 검색 서비스 만들기 1편 (Docker로 Elasticsearch + Kibana 구축) (0) | 2025.03.10 |
무중단 배포 적용하기 (1) | 2025.01.01 |