부하 테스트 가이드

Apache JMeter 완전 가이드

👥 방문자 수

Apache JMeter는 Java 기반의 오픈소스 부하 테스트 도구로, GUI를 통한 직관적인 테스트 설계와 강력한 분산 테스트 기능을 제공합니다. 다양한 프로토콜(HTTP, FTP, JDBC, JMS 등)을 지원합니다.

오픈소스 Java 기반 GUI 지원 분산 테스트 다양한 프로토콜
🧪 실전 예제 보기 → ← TestForge 홈으로

JMeter란?

Apache JMeter는 1998년 처음 출시된 검증된 오픈소스 부하 테스트 도구입니다. GUI 기반의 Test Plan 설계, 다양한 프로토콜 지원, 플러그인 생태계, 내장 분산 테스트 기능으로 엔터프라이즈 환경에서 널리 사용됩니다.

지원 프로토콜

설치

1. Java 설치 (필수)

JMeter는 Java 11+ 이 필요합니다.

# macOS
brew install openjdk@17

# Ubuntu/Debian
sudo apt install openjdk-17-jdk

# 버전 확인
java -versionbash

2. JMeter 다운로드 & 실행

# 공식 다운로드 (Apache 미러)
wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz
tar -xzf apache-jmeter-5.6.3.tgz
cd apache-jmeter-5.6.3/bin

# GUI 실행
./jmeter          # macOS/Linux
jmeter.bat        # Windowsbash
환경 변수 설정: JMETER_HOME을 설정하고 $JMETER_HOME/bin을 PATH에 추가하면 어디서든 jmeter 명령을 실행할 수 있습니다.

GUI 기본 사용법

Test Plan

Test Plan은 JMeter 테스트의 최상위 컨테이너입니다. 모든 테스트 요소(Thread Group, Sampler, Listener 등)는 Test Plan 아래에 위치합니다.

Thread Group

실제 가상 사용자(VU)를 시뮬레이션하는 핵심 요소입니다.

설정설명예시
Number of Threads동시 사용자 수 (VU)100
Ramp-Up Period모든 스레드가 시작되기까지 걸리는 시간(초)60 (1분에 걸쳐 100명 시작)
Loop Count각 스레드의 반복 횟수10 또는 Infinite
Duration테스트 지속 시간 (Loop=Infinite와 함께 사용)300초

Sampler — 요청 정의

실제 서버로 전송되는 요청을 정의합니다. HTTP Request Sampler가 가장 많이 사용됩니다.

HTTP Request Sampler 주요 설정

HTTP Header Manager 예시

# Header Manager에 추가할 헤더
Content-Type: application/json
Authorization: Bearer ${TOKEN}
Accept: application/jsontext

Listener — 결과 분석

Listener용도
View Results Tree요청/응답 상세 확인 (디버깅용)
Summary Report집계 통계 (처리량, 에러율, 응답시간)
Aggregate Report퍼센타일(P90, P95, P99) 포함 통계
Response Time Graph시간별 응답시간 그래프
Active Threads Over Time시간별 활성 스레드 수 (플러그인)
⚠️
주의: GUI 모드에서 Listener를 많이 활성화하면 JMeter 자체 성능이 저하될 수 있습니다. 실제 부하 테스트는 CLI 모드로 실행하고, Listener는 결과 분석 시에만 사용하세요.

Assertions — 응답 검증

Response Assertion

JSON Assertion

# JSON Path Expression 예시
$.data[0].id          # 첫 번째 항목의 id 필드
$.status              # status 필드
$.users.length()      # 배열 길이text

Duration Assertion

응답이 지정된 시간(ms) 내에 완료되지 않으면 실패 처리합니다.

Duration: 2000ms  # 2초 초과 시 실패text

변수 & 파라미터

User Defined Variables

BASE_URL = https://api.example.com
API_TOKEN = your-secret-token
THREAD_COUNT = 100text

CSV Data Set Config — 데이터 드리븐 테스트

외부 CSV 파일에서 사용자, 상품 ID 등 동적 데이터를 읽어 테스트합니다.

# users.csv
user1@example.com,password1
user2@example.com,password2
user3@example.com,password3csv

정규식 추출 (Regex Extractor)

# 응답에서 토큰 추출
Reference Name: auth_token
Regular Expression: "token":"([^"]+)"
Template: $1$text

플러그인

JMeter Plugin Manager를 통해 기능을 확장할 수 있습니다.

# Plugin Manager JAR 다운로드 후 lib/ext에 복사
wget https://jmeter-plugins.org/get/ -O JMeterPlugins-Extras.jar
cp JMeterPlugins-Extras.jar $JMETER_HOME/lib/ext/bash

주요 플러그인

플러그인기능
3 Basic GraphsResponse Times Over Time, Hits/s, Active Threads
5 Additional GraphsConnect Times, Latency, Bytes Throughput
WebSocket SamplerWebSocket 부하 테스트
Custom Thread GroupsUltimate Thread Group (상세 단계 제어)
Throughput Shaping Timer정확한 RPS(초당 요청수) 제어

CLI (Non-GUI) 실행

실제 부하 테스트는 GUI가 없는 CLI 모드로 실행해야 정확한 결과를 얻을 수 있습니다.

# 기본 CLI 실행
jmeter -n -t test-plan.jmx -l results.jtl

# 옵션 설명
# -n  : Non-GUI 모드
# -t  : .jmx 파일 경로
# -l  : 결과 파일 (.jtl 또는 .csv)
# -e  : HTML 리포트 생성
# -o  : HTML 리포트 출력 디렉토리

# 완전한 명령어 (HTML 리포트 포함)
jmeter -n -t test-plan.jmx -l results/results.jtl -e -o results/html-report

# JVM 메모리 설정 (대규모 테스트)
JAVA_OPTS="-Xms1g -Xmx4g" jmeter -n -t test-plan.jmx -l results.jtlbash

커맨드라인 변수 오버라이드

jmeter -n -t test-plan.jmx \
  -JBASE_URL=https://staging.example.com \
  -JTHREAD_COUNT=200 \
  -JRAMP_UP=60 \
  -l results.jtlbash

분산 테스트

단일 머신으로 충분한 부하를 생성하기 어려울 때 여러 JMeter 인스턴스를 사용합니다.

구성

Agent 서버 설정

# Agent 서버에서 실행
$JMETER_HOME/bin/jmeter-server

# jmeter.properties 설정 (Agent)
server.rmi.localport=4000
server_port=1099bash

Controller에서 분산 실행

# jmeter.properties (Controller)
remote_hosts=192.168.1.10:1099,192.168.1.11:1099,192.168.1.12:1099

# 분산 실행 명령어
jmeter -n -t test-plan.jmx -r -l results.jtl
# -r : remote_hosts에 정의된 모든 Agent 사용

# 특정 Agent만 사용
jmeter -n -t test-plan.jmx -R 192.168.1.10,192.168.1.11 -l results.jtlbash

HTML 리포트 생성

# .jtl 파일에서 HTML 리포트 생성
jmeter -g results.jtl -o html-report/

# 리포트에 포함되는 내용:
# - 요청/응답 통계 (처리량, 에러율)
# - 응답 시간 분포 (히스토그램)
# - 퍼센타일 차트 (P50, P90, P95, P99)
# - 시간별 활성 스레드 수
# - 에러 요약bash
팁: -o 디렉토리는 비어 있어야 합니다. 이미 존재하면 오류가 발생합니다. rm -rf html-report && mkdir html-report로 초기화하세요.

CI/CD 통합

GitHub Actions

name: JMeter Load Test

on:
  push:
    branches: [main]

jobs:
  jmeter:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Download JMeter
        run: |
          wget -q https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz
          tar -xzf apache-jmeter-5.6.3.tgz
          echo "JMETER_HOME=$(pwd)/apache-jmeter-5.6.3" >> $GITHUB_ENV

      - name: Run JMeter Test
        run: |
          $JMETER_HOME/bin/jmeter -n \
            -t tests/load-test.jmx \
            -JBASE_URL=${{ secrets.STAGING_URL }} \
            -l results.jtl \
            -e -o html-report

      - name: Upload Report
        uses: actions/upload-artifact@v3
        with:
          name: jmeter-report
          path: html-report/yaml
💡
더 자세한 성능 테스트 가이드는 TestForge DocsJMeter 시나리오 가이드를 참고하세요. k6와의 자세한 비교는 k6 가이드에서 확인할 수 있습니다.