[Spring] JMeter로 동시성 성능 테스트

이지연·2026년 2월 3일

JMeter란?

JMeter는 오픈 소스 소프트웨어로, 웹 애플리케이션을 포함한 다양한 서비스의 성능 테스트를 위한 툴이다.
요청을 동시에 여러 개 발생시키고, 응답 시간/처리량/성공 여부 같은 지표를 통해 시스템이 버티는 한계를 확인할 수 있다.


JMeter 설치(바이너리 설치)

  1. Apache JMeter 공식 웹사이트에서 JMeter를 다운로드한다.
    https://jmeter.apache.org/download_jmeter.cgi

  2. “Binaries” 섹션에서 .zip 파일을 선택해 다운로드한다.

  3. 다운로드한 .zip 파일을 압축 해제한다.

  4. 압축 해제된 폴더로 이동해서 bin 디렉토리를 찾는다.

  5. jmeter.bat 파일을 실행해서 JMeter를 시작한다.
    (Mac/Linux라면 jmeter 실행 파일을 사용한다)


테스트 계획(Test Plan) 생성

테스트 계획 추가

  • 메뉴에서 File > New를 선택해서 새 테스트 계획을 만든다.
  • 테스트 계획은 저장할 때 별도의 폴더를 만들어서 산출물(jmx, 결과 파일 등)을 한 곳에 모아두는 게 좋다.


스레드 그룹(Thread Group) 추가

동시에 요청을 보내는 “가상의 사용자 수”를 스레드로 설정한다.

  • 테스트 계획 우클릭
  • Add > Threads (Users) > Thread Group

  • 주요 설정
    • Number of Threads (users): 동시에 요청 보낼 사용자 수
    • (필요 시) Ramp-up Period: 사용자가 증가하는 시간
    • (필요 시) Loop Count: 반복 횟수


HTTP 요청(샘플러) 추가

스레드 그룹 안에 실제 요청을 추가한다.

  • 스레드 그룹 우클릭
  • Add > Sampler > HTTP Request

공통 설정 예시

  • Server Name or IP: localhost
  • Port Number: 8080

GET 요청 추가

  • Method: GET
  • Path: 테스트할 API 경로 입력 (예: /api/products/1)

POST 요청 추가

  • Method: POST
  • Path: 테스트할 API 경로 입력 (예: /api/orders)
  • Body(Data)는 보통 JSON이므로, 아래 “헤더 매니저” 및 바디 설정을 같이 잡아준다.


Header 설정(HTTP Header Manager)

JSON 요청/인증 토큰이 필요한 경우가 많아서 헤더를 반드시 설정한다.

  • 해당 HTTP Request 우클릭
  • Add > Config Element > HTTP Header Manager

추가할 항목 예시

  • Content-Type: application/json
  • Authorization: Bearer {토큰}


리스너(Listener) 추가

테스트 결과를 확인하기 위해 리스너를 추가한다.

  • 스레드 그룹 우클릭
  • Add > Listener
  • 자주 쓰는 리스너
    • View Results Tree: 요청/응답 상세 확인(디버깅용)
    • View Results in Table: 결과 표로 확인
    • Graph Results: 그래프 기반 확인

주의할 점이 있다.
리스너를 많이 달면 JMeter 자체가 무거워져서 테스트가 왜곡될 수 있다.
실제 부하 테스트에서는 필요한 최소 리스너만 두고, 결과는 파일로 저장해서 분석하는 방식이 흔하다.


주요 지표(꼭 봐야 하는 것)

Throughput(처리량)

일정 시간 동안 시스템이 처리할 수 있는 작업의 양이다.
보통 초당 처리 요청 수로 해석하고, Throughput이 높다는 것은 많은 요청을 더 잘 처리한다는 의미다.

Latency(지연 시간)

요청이 시스템에 도착해서 응답이 돌아올 때까지 걸리는 시간이다.
Latency가 낮으면 사용자 요청이 더 빠르게 처리된다고 볼 수 있다.


테스트 시나리오(재고 차감 동시성)

이번 목표는 “동시에 100명이 주문해서 재고가 정확히 100만큼 차감되는가”를 보는 것이다.

시나리오 조건

  • RDB 재고를 1000개 정도로 세팅한다.
  • JMeter에서 사용자 100명이 동시에 1개씩 차감하는 update 요청(또는 주문 생성 요청)을 실행한다.
  • 상단 툴바에서 시작 버튼(녹색 삼각형)을 눌러 테스트를 실행한다.
  • 리스너에서 성공 여부, 응답 시간, 에러(409/500 등) 발생 여부를 확인한다.
  • 기대 결과: 재고가 100 감소하고, 주문이 100개 생성된다.

여기서 핵심은 “동시성 문제가 없으면” 결과가 정확히 떨어져야 한다는 것이다.
만약 재고가 900이 아니라 901~905처럼 애매하게 남거나, 주문 수가 100이 아닌 값이 나오면 동시성 제어(락/트랜잭션/격리수준/원자적 업데이트)가 제대로 되지 않았을 가능성이 높다.


실무에서 체크할 포인트

  • 요청이 실패한 케이스가 있다면, 실패 이유가 “정상적인 충돌 처리(예: 재고 부족)”인지 “시스템 에러(예: 500, 타임아웃)”인지 분리해서 봐야 한다.
  • 재고 차감 API는 동시성에 매우 민감하므로, DB에서 update ... set stock = stock - 1 where stock > 0 같은 원자적 업데이트 방식이나, 비관 락/낙관 락 등을 고려해야 한다.
  • JMeter 스레드 수만 올리는 게 끝이 아니라, 서버 CPU/메모리/DB 커넥션 풀/락 경합 같은 병목을 같이 봐야 “왜 느려지는지”가 나온다.
profile
Eazy하게

0개의 댓글