무엇인가?
특정 수준의 트래픽을 시스템이 안정적으로 처리할 수 있는지 검증하는 과정
왜 해야 하는가?
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 오류
'Spring' 카테고리의 다른 글
| [Spring] The importance of index in DB queries (0) | 2026.02.26 |
|---|---|
| [Spring] DB 조회에서 인덱스의 효과 (0) | 2026.02.26 |
| [Spring AI] LLM, call(), stream(), 모델의 확률성 (0) | 2026.02.26 |
| [Spring] Redis as a cache memory (0) | 2026.02.26 |
| [Spring] Java와 Redis를 연결해주는 RedisTemplate (0) | 2026.02.26 |