Spring

[Test] 부하 테스트(Load Test)란?

montmer27 2026. 4. 1. 22:34

무엇인가? 

특정 수준의 트래픽을 시스템이 안정적으로 처리할 수 있는지 검증하는 과정

왜 해야 하는가?

1. 다음 상황을 방지하기 위해

  • CPU 100%
  • DB Connection 부족
  • Redis 요청 지연
  • Kafka Consumer Lag 증가
  • API 실패율 증가
  • 서비스 전체 장애

2. 기능 테스트로 발견되지 않는 문제 조기 발견

  • Consumer 처리 속도 부족
  • DB insert 병목
  • Redis ZSET 업데이트 지연
  • Thread pool 부족
  • Memory leak으로 장기 요청 지연

3. 병목 지점을 찾아 성능 개선의 단서를 얻기 위해

병목 지점 원인
API 레이어 Tomcat 스레드 부족
서비스 레이어 동기 처리 지연
Kafka Consumer 처리 속도 부족
DB connection pool 부족
Redis 명령 처리 지연

 

무엇이 있는가

  • Stress Test : 언제까지 트래픽을 견딜 수 있는가
  • Spike Test : 순간적으로 폭발적인 부하를 견딜 수 있는가
  • Soak Test : 얼마나 오래 부하를 견딜 수 있는가

 

어떻게 해야 하는가?

대표적인 도구 : K6

특징

  • 빠르다
  • 가볍다
  • JavaScript로 테스트 코드를 작성한다
  • 실무에서 많이 사용한다
  • Grafana와 연동 가능하다

활용 방법

1. 루트/k6에 다음 파일 작성 (simple-test.js)
(예시로 actuator/health 엔드포인트를 테스트, actuator 의존성 주입 필요)

import http from 'k6/http';

export const options = {
    vus: 5, // 몇명이서 내 서비스에 들어올 것인지
    duration: '10s', // 얼마나 오랫동안 계속해서 들어올 것인지
};

// 어디에 부하를 줄 것인가
export default function () {
    http.get("http://host.docker.internal:8080/actuator/health");
}

// K6를 도커로 실행할 것임
// localhost는 k6 컨테이너를 의미
// 따라서 내 컴퓨터 (진짜 localhost)로 요청을 보내려면 host.docker.internal로 써줘야 함

2. Spring Boot 서버 실행하기

3. 터미널에 다음 입력하여 docker로 실행
(해당 파일이 있는 디렉터리 ./k6에서 실행해야 함)

docker run --rm -i grafana/k6 run - < simple-test.js

4. 지표 분석하기

가장 중요한 지표는 다음과 같음

  • http_req_duration (API 응답 시간)
  • http_req_failed (실패율)
  • http_reqs (초당 요청 처리량, RPS)
  • p90 / p95 (상위 지연 시간) : 실무에선 p95 이상으로 측정한다.
  • max latency (가장 느린 요청 시간, 평균을 악화시키지 않는다면 큰 문제는 아님)

*다음 요인들은 필연적으로 발생하기 때문에 1% 이내 실패율에서 용인할 수 있다.

  • Docker -> host 연결 순간 지연
  • 초기 warm-up 단계에서 발생
  • 일시적인 네트워크 패킷 손실

그러나, 실패율이 1% 이상이면 원인 분석이 필요하다.

API 문제인지, DB/Redis connection 부족 때문인지, Consumer 처리 지연 때문인지 가설을 세우고 검증하는 과정을 거쳐야 한다.

 

*일반 웹 서비스의 요청 처리량(RPS) 평가 기준

RPS 평가
50~100 일반적인 API 수준
100~300 적당한 부하 처리 가능
300~500 안정성 높은 API
500~1000 고성능 API
1000 이상 고도 튜닝된 시스템

RPS가 떨어지면 처리량 저하 의심

  • API 서버의 동시 처리 한계 도달
  • Kafka Producer가 메시지를 제때 전송하지 못함
  • Consumer가 Backlog를 모두 처리하지 못함

*max latency 병목 의심

  • p(95)가 큰 폭으로 증가할 때는 실제로 병목이 발생하고 있는지 확인 필요
  • p(95) 부하를 늘릴수록 값이 선형적으로 늘어나면 병목이 발생하고 있는 것.

병목 발생 가능 원인 

  • DB insert 속도 저하
  • Kafka Consumer Lag wmdrk
  • Redis latency 증가
  • CPU 부족 또는 Thread Pool 포화

 

부하를 늘릴수록 http_req_failed가 증가하면 안정성 문제를 의심해 봐야

  • Connection Timeout 발생
  • Kafka Producer 전송 지연
  • DB Connection Pool 불안정
  • Redis Connection 오류