이번 글에서는 부하 테스트란 무엇인지, 그리고 왜 필요한지에 대한 개념부터 시작해 직접 k6를 활용해 부하 테스트를 진행한 과정과 테스트 결과를 Grafana로 시각화해 모니터링한 방식을 정리하려고 한다.
또한 단순한 부타 테스트 뿐 아니라 실제 서비스가 정상적으로 운영되고 있는지에 대한 상태 정보도 함께 모니터링 하기 위해 Spring Actuator와 Prometheus를 연동한 방식도 함께 두려려고 한다.
부하 테스트는 시스템에 점진적으로 부하를 증가시켜 임계점까지 도달하게 해 시스템이 얼마나 많은 트래픽이나 요청을 처리할 수 있는지 평가하는 테스트이다.
정리하자면, SLO: 목표, SLI: 지표, SLA: 계약으로 이해하면 쉽다!
(1) application.yml 설정
management:
endpoints:
web:
exposure:
include: "prometheus"
metrics:
export:
prometheus:
enabled: true
(2) build.gradle 의존성 추가
implementation("org.springframework.boot:spring-boot-starter-actuator:3.4.3")
implementation("io.micrometer:micrometer-registry-prometheus:1.14.5")
(3) 실행 확인
http://localhost:8080/actuator/prometheus

(1) prometheus.yml 설정
global:
scrape_interval: 15s # 메트릭 수집 주기 (기본 15초)
scrape_configs:
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']
(2) docker-compose.yml에 서비스 추가
prometheus:
image: prom/prometheus:v2.47.0
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana:10.1.2
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
(3) Prometheus 접속 및 상태 확인
http://localhost:9090/targets
Status > Targets에서 Spring Boot 앱이 UP 상태인지 확인
- [데이터 소스 등록]
1. 로그인 (admin/admin)
2. 왼쪽 메뉴에서 Data sources > Add data source > Prometheus
3. URL 칸에 Prometheus 서버 주소 입력 (http://host.docker.internal:9090)
4. Save & Test 클릭 -> "Successfully queried the Prometheus API." 메시지 확인

- [대시보드 생성]
1. Dashbboard > New > import
2. Dashboard ID 입력 : 4701
3. import 후 grafana 대시보드 확인

이 시점까지는 Actuator에서 제공하는 JVM, Tomcat, 메모리 등의 기본 시스템 메트릭만 확인할 수 있다. 아래는 k6로 실제 부하 테스트 결과를 시각화한 내용이다.
(1) k6 스크립트 생성
➡️ user-k6-script.js
(2) docker-compose.yml (k6 추가 및 기존 설정 수정)
prometheus:
image: prom/prometheus:v2.47.0
command:
- --web.enable-remote-write-receiver ✅ Prometheus가 외부에서 데이터를 remote write 방식으로 받을 수 있게 해주는 옵션 -> k6 결과를 Prometheus로 보내려면 필요함
- --enable-feature=native-histograms ✅ native histograms 기능 활성화 (정확하고 고해상도 지표 분석에 유용)
- --config.file=/etc/prometheus/prometheus.yml
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
k6:
image: grafana/k6:latest
command: run -o experimental-prometheus-rw /scripts/user-k6-script.js
volumes:
- ./src/main/java/kr/hhplus/be/server/support/k6:/scripts
environment:
- K6_PROMETHEUS_RW_SERVER_URL=http://prometheus:9090/api/v1/write
- K6_PROMETHEUS_RW_TREND_AS_NATIVE_HISTOGRAM=true
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
- prometheus
networks:
k6:
(3) docker-compose 실행
docker-compose up -d
- 대시보드 생성
1. Dashboard > New > import : 아래 json 파일 import
https://github.com/grafana/xk6-output-prometheus-remote/blob/main/grafana/dashboards/k6-prometheus-native-histogram.json
2. 아래처럼 k6 결과가 grafana로 시각화된 것을 확인할 수 있다.
이번 글에서는 Spring Actuator를 활용해 서비스 자체의 상태(CPU, 메모리 사용량, 애플리케이션 기동 시간 등)를 모니터링하는 방법과 k6를 통해 수행한 부하 테스트 결과를 Grafana로 시각화하는 과정을 직접 구성해보았다.
이렇게 시각화된 데이터를 통해 실제로 어느 구간에서 부하가 많이 발생했는지, 응답 시간이 급격히 늘어나는 시점은 언제인지등을 한 눈에 파악할 수 있었다.
이러한 환경을 바탕으로 실제 서비스에서 부하 테스트를 수행했고 아래 링크에는 그에 따른 부하 테스트 시나리오 문서 예시를 첨부했다.