부하 테스트를 위한 도구들
구글링을 통해 찾아본 테스트 도구로는 nGrinder, JMeter, k6 등이 있었습니다.
처음엔 네이버에서 제공하는 오픈소스인 nGrinder를 사용하려 했지만 JDK 11 까지만 지원해서 JMeter를 선택하게 되었습니다.
또한, 기존에 만든 레거시 프로젝트와 현재의 프로젝트를 비교하는 것이 목적이었기 때문에 일관성 측면에서 릴리즈된지 가장 오래되었으면서도 최근까지 유지보수가 이어져 오고 있어 방대한 커뮤니티가 있다는 점이 부합했습니다.
APACHE JMeter의 장점을 요약하자면
- 설치, 사용하기 쉬움(brew 설치가능)
- 커뮤니티, 레퍼런스가 방대하고 최근까지도 유지보수 됨
- HTML 형식의 보고서가 정보를 깔끔하게 제공해줌
JMeter의 설치와 실행
https://jmeter.apache.org/download_jmeter.cgi
Apache JMeter - Download Apache JMeter
Download Apache JMeter We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be ava
jmeter.apache.org
위 공식 사이트에서 다운로드를 받는 방법과 Mac 유저의 경우에는 brew를 통한 설치가 가능합니다.
설치: brew install jmeter
실행: open /opt/homebrew/bin/Jmeter
첫 테스트 만들기
! 메뉴 용어 정리 !
Apache JMeter는 서버가 제공하는 성능 및 부하를 측정할 수 있는 테스트 도구로, 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션하여 강도를 테스트하거나 다양한 부하 유형에서 전체 성능을 분석할 수 있다.
- Thread Group : 동시에 요청을 보내는 쓰레드 수
- Listener : 응답을 받았을 때 취하는 동작 (검증, 리포트, 그래프 그리기 등)
- Configuration : Sampler 또는 Listener가 사용할 설정 값 (쿠키, JDBC 커넥션 등)
- Assertion : 응답 결과의 성공 여부를 판단하는 조건 (응답 코드, 본문 내용 등)
1. Thread Group 생성

2. 이름 및 Thread Properties 을 설정해준다.
- Number of Threads : 요청을 보내는 사용자의 수
- Ramp-up period : 요청을 보내는 시간 간격
- Loop Count : 반복 횟수
이렇게 설정하면 쓰레드 100, Ramp-up 0 , 루프 카운트 10 이면 100명이 0초에 10번씩 요청해서 총 1000번의 요청이 전송됩니다.

3. 테스트할 HTTP Request를 생성해준다.

4. 사용할 속성들을 넣어준다.
- Server Name : 서버 도메인 혹은 아이피 주소(필자의 경우 로컬에서 개발중이기 때문에 localhost 를 넣어주었다.)
- Port Number : ex) 8080
- Path : 테스트할 API의 URI
- Body Data : Body에 실어보낼 요청값

5. 헤더에 정보를 추가하기 위해 HTTP Header Manager를 생성해주고, 필요한 속성들을 추가해준다.


테스트 실행결과를 보기위한 리스너 만들기

요약 보고서

- 요약 보고서 입니다.
- 총 4000번의 요청이 수행됐습니다. 평균, 최소, 최대는 ms 단위입니다.
- 따라서 평균적으로 0.16초 정도의 응답시간이 소요되었음을 알 수 있습니다.
- 오류 0%는 HTTP 응답 코드로 판단합니다. 예외에 해당하는 400번대 또는 500번대의 응답이 없었음을 예상할 수 있습니다.
- 처리량은 Throughput입니다. Transaction Per Second를 의미하는 TPS 라고도 합니다. 평균적으로 140 TPS가 측정되었네요.
결과들의 트리 보기

- 크롬의 개발자 도구의 네트워크 탭을 본다고 생각하시면 될 것 같습니다.
- 개별 요청에 대한 요청, 응답 정보를 확인할 수 있습니다.
- 응답 body까지 확인할 수 있습니다.
- 이 부분을 통해서 잘못된 JMeter의 설정에 대한 부분을 바로 잡을 수 있습니다.
결과 그래프

- 테스트 결과를 그래프 형태로 확인할 수 있습니다.
- 쓰레드 그룹에서 반복횟수를 무한으로 했을 경우, 실시간으로 그래프의 변동을 확인할 수 있습니다.
- 위의 그래프는 3Basic 플러그인을 추가해야 나오는 그래프 입니다.
쿠키 관리자를 이용한 로그인 상태 테스트 구성
토큰을 이용한 인증 인가는 헤더에, 세션을 이용한 인증 인가는 쿠키에 인증 정보를 담아 전송합니다.
따라서 HTTP 요청 샘플러를 통한 테스트 시에 이러한 정보를 전송할 수 있다면 로그인된 사용자에 대해서만 가능한 테스트를 구성할 수 있습니다.

쿠키 관리자 설정하기

- 로그인 상태 요청 샘플러를 우클릭하고, 추가 -> 설정 엘리먼트 -> HTTP 쿠키 관리자를 생성합니다.
- 하단의 추가 버튼을 누르고 쿠키 정보를 입력합니다.
- 구성이 완료 됐습니다. 이제 로그인 상태 확인 요청이 전송될 때 쿠키 정보도 함께 전송됩니다.

HTML 보고서 생성
성능 테스트를 완료 했다면, 지금까지의 결과물을 깔끔한 보고서 형식으로 받을 수 있습니다.


- 도구 -> HTML 보고서 생성 메뉴를 클릭합니다.
- 앞서 생성해둔 CSV 파일과, 현재 테스트를 구성하고 있는 설정파일(jmx)을 선택합니다.
- 출력 디렉토리는 반드시 비어있는 디렉토리를 지정해줘야만 합니다.
- 보고서 생성 버튼을 누르면 보고서가 생성됩니다.
HTML 보고서 살펴보기




CLI 테스트를 통해 일관성 있는 결과물 출력하기
JMeter는 실행될때 JVM 위에서 실행되기 때문에 자바 힙메모리의 영향을 받습니다.
때문에 GUI로 측정하는 것보다 CLI로 측정하는 것이 더 일관성있는 테스트결과를 얻을 수 있습니다.
실제로 실무에서 애플리케이션을 테스트할때 CLI로 테스트하기 때문에 이 방법으로 진행하는 것이 좋습니다.
터미널을 통해 /opt/homebrew/bin 폴더에 들어가줍니다. (jmeter가 위치한 폴더)
jmeter -Jjmeter.save.saveservice.output_format=csv -n -t /Users/jaymon/desktop/APACHE_JMeter/20240410_mi.jmx -l
/Users/jaymon/desktop/APACHE_JMeter/20240410_mi.csv -e -o
/Users/jaymon/desktop/APACHE_JMeter_Result/mi_0410/
위의 명령어 설정은 설정파일과 결과물을 저장할 파일(미리 만들어둔파일은 X), 그리고 웹보고서를 저장할 폴더(비어있어야함)을 지정합니다.
저 같은 경우는 결과물출력파일을 csv로 저장했기 때문에 output_format=csv 옵션을 부여했습니다.
jmeter -Jjmeter.save.saveservice.output_format=csv -n -t
[jmeter설정파일] -l [결과물을저장할파일] -e -o [웹보고서를저장할폴더]
이렇게 해서 실행하면 GUI로 실행했을 때보다 일관성 있는 결과물을 얻을 수 있고, 훨씬 빠르게 테스트가 종료되게 됩니다.

오류 처리 추가 !
Jmeter 5.6.3 버전 부터는 StatusConsoleListener 에러가 발생하고 있습니다.
해결하려면 log4j 파일의 package 필드를 삭제하거나 테스트 결과 구성에서 XML 체크를 해제해주어야 합니다.
하지만, 해당 에러를 무시하고 진행하셔도 HTML 보고서는 정상적으로 출력됩니다.
PS C:\Users\kiopl\OneDrive\바탕 화면\apache-jmeter-5.6.3\bin> .\jmeter -n -t 241028Test.jmx -l 241030_0101100.csv -e -o MatterhubTest
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release
오류 처리 추가 !
CLI환경에서 실행했을 때 다음과 같이 설정한 csv 파일이 not empty로 표시되면서 테스트가 완료되지 않는 일이 발생합니다.
Creating summariser <summary>
Error in NonGUIDriver java.lang.IllegalArgumentException: Results file:241030_0101100.csv is not empty
An error occurred: Error in NonGUIDriver Results file:241030_0101100.csv is not empty
Jmeter 자체에서 csv 파일이 덮어쓰기 하는것을 방지하는 매커니즘이 작동되는 것인데요.
아래와 같이 -f 를 추가해주면 정상적으로 덮어쓰기 되어 오류를 해결할 수 있고, 여러번 테스트를 해야할 때도 유용합니다.
[jmeter설정파일] -l [결과물을저장할파일] -f -e -o [웹보고서를저장할폴더]
출처
https://creampuffy.tistory.com/209
Apache JMeter를 이용한 부하 테스트 및 리포트 생성
서버의 성능을 최적화하기 위해선 어떤 작업이 필요할까요? 어떤 지표를 기준으로 성능을 측정할 것인지, 정의된 지표에 영향을 미치는 변수에는 무엇이 있는지, 해당 변수들의 변화가 성능에
creampuffy.tistory.com
https://leeggmin.tistory.com/10
[JMeter] Apache JMeter를 이용한 간단한 성능 테스트
기존에 서비스하던 코드들을 리팩토링 하면서 문득 코드 리팩토링 후 과연 성능 차이가 있을까? 궁금해졌다. 많은 성능 테스트 Tool들이 있었는데 JMeter, nGrinder, k6.. 그 중 오랜기간 릴리즈 하고
leeggmin.tistory.com