Jmeter를 활용한 API 성능 테스트
성능을 최적화할 때는 세 가지 황금 규칙을 기억해야 한다. 첫째도 측정, 둘째도 측정, 셋째도 측정! - 모던 자바 인 액션 중
회사 업무 중, 레디스를 이용한 API 와, 몽고를 이용한 API 의 비교를 위해 Jmeter 를 한 번 써봤습니다.
Jmeter 설치
https://qjadud22.tistory.com/35 ← 설치 가이드는 이 포스팅에 잘 정리되어 있으므로 설명을 대체합니다 😊
Test Plan 추가 & Thread Group 생성
먼저 아래 버튼을 눌러서 Test Plan을 하나 생성합니다.
스레드 그룹을 생성합니다. Test Plan 우클릭 > Add > Threads (Users) > Thread Group
스레드 그룹을 여러개를 만들어서 부하 테스트를 할수도 있고, 하나의 스레드 (프로세스) 만 테스트 하고자할경우, 이 스레드의 옵션값들을 설정해주면 됩니다.
- Number of Threads (Users) : 가상의 유저를 몇 명을 설정한건지에 대한 값 (= 몇개의 스레드를 생성할 것인지) 이 값이 커질수록 서버는 많은 부하를 받을 것.
- 저는 1명의 유저가 조회 API 를 순차적으로 100만번을 호출할 것이기 때문에 1로 설정했습니다.
- Ramp-up period : 한번의 실행을 몇초 동안 완료시킬것인지에 대한 설정값, 다음 호출을 수행할때까지 기다리는 시간입니다.
- 필요없으니 1초로 설정합니다
- Loop Count : 반복하고자 하는 횟수
- 유저가 모수가 1000개가 잡혀서 1000번 호출한다고 가정했으니, 100을 넣어줍니다.
Http Request 설정
개선전 API(레디스 이용)와 개선후 API(몽고 이용)를 비교할 것이기 때문에 2개의 Http Request를 추가해줄겁니다.
Thread Group (우클릭) > Add > Sampler > HTTP Request
http 콜에 호출할 파라미터를 CSV 파일에 있는 값들로 대체할 수도 있습니다.
CSV 파일에 있는 값으로 파라미터 세팅하기
Thread Group (우클릭) > Add > Config Element > CSV Data Set Config
이렇게 하면, CSV Data Set Config 가 하나 생성되는데, 여기서 CSV 파일을 올려주고, 그 값들을 파라미터로 세팅을 하는 것입니다. CSV파일 데이터를 파라미터로 활용하기](https://guide.blazemeter.com/hc/en-us/articles/206733689-Using-CSV-DATA-SET-CONFIG-Using-CSV-DATA-SET-CONFIG)
- Variable Names : item_id 로 설정했습니다. 이 변수명을 방금 생성한 HttpRequest에 넣어주기만 하면 csv 파일의 값을 파라미터로 넘길수가 있습니다!
- Ingore First Line : True 로 설정했습니다. 엑셀의 첫번째 row 는 헤더였기 때문에!
- Recycle on EOF : 문서의 마지막에서 다시 recycle 을 하는지? (안하는 걸로 설정했습니다)
- Stop thread on EOF : 문서의 마지막에 도달하면 스레드를 중단하는지? (안하는 걸로 설정했습니다.) 왜냐하면, 모든 데이터를 다 처리한 시간을 보고 싶어서요
레디스 API 는 GET 메서드이고, 몽고API 는 POST 메서드로 설명을 하겠습니다. (GET 이랑 POST랑 설정하는게 조금 다릅니다.)
GET 메서드
GET 메서드는 조금 간단한데요, API url 설정해주고, Parameters 탭에 위에서 설정한 변수명을 넣어주기만 하면 됩니다.
POST 메서드
POST 메서드는 HTTP Header Manager
가 하나 더 추가되어야 합니다. 그래야 Body Data를 넣어서 request를 보낼 때, 오류가 나지 않습니다.
테스트할 API 들은 application/json 으로 통신하기 때문에 이를 위한 세팅을 해줘야 합니다!
Http Request (우클릭) > Add > Config Element > HTTP Header Manager
Content-Type : application/json 을 추가해줍시다
Listener 추가
Listener 은 부하테스트를 수행한 결과를 Visualize 한 그래프, 표 등을 말합니다.
- Visual Results Tree : 각 request를 상세히 볼수 있습니다.
- Summary Report : TPS 등 주요 데이터를 요약한 내용을 볼 수 있습니다.
- Response Time Graph : 각 API의 응답속도를 그래프로 볼 수 있습니다.
더 많은 Listener 에 대한 정보는 Jmeter 공식 문서(https://jmeter.apache.org/usermanual/component_reference.html#Sample_Result_Save_Configuration) 에서 확인할 수 있습니다
테스트 수행
맨위에 (누가봐도 실행버튼인) 초록 화살표 를 클릭하면, 스레드가 수행되면서 테스트가 진행됩니다!
Thread Group 하위 Http Request 순서대로 수행되는 것을 확인할 수 있으며 이 순서는 드래그로 변경할 수 있습니다. Reponse Body 를 보면, CSV에 있던 파라미터들이 제대로 테스팅 되고 있네요
저는 Kafka API 도 하나 추가해서 저 상품들을 카프카 발송하는걸 추가했는데요, QA에는 몽고 데이터 적재되지 않은것들이 있어서 추가했습니다
테스트 결과
10만건 호출결과, Redis API는 Response Time 이 불규칙적이며 1초를 넘어간 건도 있었지만 몽고API의 경우 일정하게 900ms 안으로 Response 를 가지는 것으로 확인되었습니다.
Summary Report를 보면, Redis API는 최대 77,970 ms reponse를 가지며, 평균은 119 ms 가 걸리는 반면, Mongo API 는 최대 1,288 ms 가 걸리며 평균 14ms의 응답속도를 가지는 것을 확인할 수 있습니다.
Conclusion
이상 Jmeter를 통해 API 성능 테스트를 해봤습니다. 개선 전/후의 차이를 볼 수 있어서 좋았던 것 같습니다.
설명드린 Jmeter 기능말고도 jdbc를 연결해서 db와 연동된 데이터를 파라미터로 넣을 수 있는 기능도 있는 것 같습니다. advanced 기능은 사용해보면서 익혀야겠습니다 😊
참고 문서
https://qjadud22.tistory.com/35
https://12bme.tistory.com/503
https://jmeter.apache.org/usermanual/component_reference.html#Sample_Result_Save_Configuration
https://guide.blazemeter.com/hc/en-us/articles/206733689-Using-CSV-DATA-SET-CONFIG-Using-CSV-DATA-SET-CONFIG
댓글남기기