⏰💡 JMeter 구성 요소 해석해보기

2026. 2. 15. 13:16·프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트

1️⃣ 내가 만든 JMeter 트리는 무엇을 의미할까?

내 JMeter 구조는 이렇게 해석하면 된다.

가상 사용자 300명이 동시에 접속해서

  1. 대기열 등록을 한 번 하고
  2. 1초마다 30번 ‘내 순번 조회’를 반복한다.

즉, 실제 사용자 시나리오를 자동으로 재현한 실험이다.


2️⃣ JMeter 구성 요소 하나씩 해석하기

✅ HTTP Request Defaults

여기에 설정한 값:

  • Protocol: http
  • Server: localhost
  • Port: 8080

이건 “모든 요청의 기본 서버 주소”를 설정한 것이다.

그래서 개별 요청에서는 경로(Path)만 쓰면 된다:

  • /api/lectures/1/queue
  • /api/lectures/1/queue/me

✅ 01_enqueue (POST /queue)

이 요청은 “대기열에 줄 서기” 행동을 의미한다.

실제 동작:

  • userKey(UUID) 생성
  • Redis ZSET에 등록
  • position 반환

즉, JMeter의 가상 사용자가
“줄 서기 버튼”을 한 번 누른 상황이다.

✅ JSON Extractor (userKey 추출)

enqueue 응답 예시:

{
  "status": "QUEUED",
  "userKey": "8a55-....",
  "position": 3
}

설정:

  • 변수 이름: userKey
  • JSON Path: $.userKey

의미:

응답 JSON에서 userKey 값을 추출해서
JMeter 변수 ${userKey}에 저장한다.

왜 필요할까?

다음 폴링 요청에서 “내 상태”를 조회하려면
userKey가 필요하기 때문이다.

즉,

  • 01_enqueue에서 userKey를 뽑고
  • 02_poll_me에서 그 userKey를 사용한다.

✅ Loop Controller (30)

Loop Count = 30

의미:

한 명의 가상 사용자가 “내 순번 조회”를 30번 반복한다.

✅ 02_poll_me (GET /queue/me)

이건 “폴링” 행동이다.

폴링이란?

기다리는 동안 계속 서버에 물어보는 것
“나 이제 입장 가능해?”
“내 순번 몇 번이야?”

요청 파라미터:

  • name: userKey
  • value: ${userKey}

즉, 방금 발급받은 userKey로 내 상태를 조회하는 것이다.

✅ Constant Timer (1000ms)

1000ms = 1초

의미:

반복 요청을 연속으로 보내지 않고
1초 간격으로 실행한다.

실제 서비스에서 폴링을 1초마다 하는 것과 동일한 환경이다.

✅ Summary Report / View Results

  • View Results in Table → 각 요청 성공/실패 상세
  • Summary Report → 평균 응답시간, 최대값, 에러율, 처리량

3️⃣ 내가 실제로 무엇을 테스트했는가?

한 문장으로 요약하면:

동시 사용자 300명이
“줄서기 1번 + 1초마다 30번 폴링” 했을 때
서버가 안정적으로 응답하는지 테스트했다.

이것이 바로 “폴링 부하 테스트”다.


4️⃣ 테스트 결과 해석

결과 요약

  • enqueue: Samples 401, Avg 3ms, Max 11ms, Error 0%
  • poll_me: Samples 12003, Avg 1ms, Max 31ms, Error 0%
  • TOTAL: Samples 12404, Avg 1ms, Max 31ms, Error 0%

✅ #Samples (총 호출 횟수)

poll_me가 12003번 호출되었다.

 

300명 × 30번 ≈ 9000번이 기본 계산이지만,
Ramp-up, 실행 시간 차이 등으로 조금 늘어날 수 있다.

 

핵심은:

수천~만 단위 요청을 처리했다는 점이다.

✅ Average / Max 응답 시간

  • 평균: 1ms
  • 최대: 31ms

의미:

요청이 매우 많았는데도
대부분 1ms 수준으로 빠르게 응답했고
최악의 경우도 31ms에 불과했다.

Redis 기반 폴링 구조가
충분히 빠르게 동작한다는 증거다.

✅ Error %

0%

즉, 1만 건 이상의 요청에서도:

  • 500 (서버 오류)
  • 429 (요청 제한)
  • 404 (경로 오류)

등이 전혀 발생하지 않았다.

서버가 안정적으로 동작했다는 의미다.

✅ Throughput (TPS)

TOTAL Throughput ≈ 19~20 req/sec

 

이 수치는 전체 테스트 구간 평균이기 때문에
순간 피크 TPS보다 낮게 나올 수 있다.

 

Ramp-up, Timer, Loop 구조의 영향을 받는다.

 

📌 자소서나 포트폴리오에서는
TPS보다 다음이 더 중요하다:

  • Error 0%
  • 최대 지연시간 낮음
  • 응답시간 안정성

5️⃣ 이 테스트가 증명한 것

✅ (1) 폴링 구조가 실제로 동작한다

  • enqueue에서 userKey 추출
  • 그 userKey로 반복 폴링
  • 시나리오 기반 테스트 완료

✅ (2) 동시 사용자 300명 폴링에도 서버는 안정적이다

  • Error 0%
  • Max 31ms
  • 평균 1ms 응답

즉,

“폴링 때문에 서버가 터질까?”라는 우려를 실험으로 검증했다.


🔥 최종 결론

선착순 시스템에서 가장 우려했던 부분은
“폴링 트래픽 폭증”이었다.

하지만 JMeter 실험 결과:

  • 대량 폴링 요청에서도
  • Redis 기반 조회는 매우 빠르고
  • 서버는 안정적으로 응답했다.

이 테스트를 통해
설계에 대한 확신을 얻었다.

'프로젝트 > 스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트' 카테고리의 다른 글

⏰💡 Enroll 동시성 테스트 + 폴링 API 부하테스트 진행 방법(JMeter)  (0) 2026.02.15
⏰💡 폴링 API 부하 테스트 (500명 실험)  (0) 2026.02.15
⏰💡 폴링 API 부하테스트 진행 방법 (JMeter)  (0) 2026.02.15
⏰💡 선착순 강의에서 비관적 락(PESSIMISTIC LOCK)을 사용한 이유?  (0) 2026.02.15
⏰ 선착순 강의 대규모 트래픽 처리 – Redis 2차 설계  (0) 2026.02.15
'프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트' 카테고리의 다른 글
  • ⏰💡 Enroll 동시성 테스트 + 폴링 API 부하테스트 진행 방법(JMeter)
  • ⏰💡 폴링 API 부하 테스트 (500명 실험)
  • ⏰💡 폴링 API 부하테스트 진행 방법 (JMeter)
  • ⏰💡 선착순 강의에서 비관적 락(PESSIMISTIC LOCK)을 사용한 이유?
hak0622
hak0622
개발하면서 “이게 뭐지?”라는 순간마다 궁금한 점을 바탕으로 정리한 개발 블로그입니다.
  • hak0622
    궁금한 개발 이야기 Why?
    hak0622
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 공부 (36)
        • 1. 자바 ORM 표준 JPA 프로그래밍 - 기본.. (35)
        • 시험 (1)
      • 프로젝트 (32)
        • 스프링 부트 3 백엔드 개발자 되기 Blog + .. (32)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
hak0622
⏰💡 JMeter 구성 요소 해석해보기
상단으로

티스토리툴바