동시성 문제 또는 성능 문제를 테스트 하기 위해서 JMeter로 부하테스트를 진행하였다.
다양한 테스트 도구가 있지만 동시접속자에 대한 테스트를 하기 적합하여 JMeter를 선택했다.
100명의 사용자가 동시에 송금 버튼을 누르는 상황을 테스트 해보고 싶었는데
JMeter는 스크립트를 사용하여 이러한 환경을 구축하고 그 결과를 간편하게 볼 수 있는 기능을 제공한다.
성능 테스트(Performance Testing)는 소프트웨어, 애플리케이션 또는 시스템이 특정 부하 조건 하에서 얼마나 효과적으로 작동하는지 평가하는 테스트 과정이다.
성능 테스트를 통해서 응답시간, 처리량, 병목지점 등을 파악할 수 있고 이를 통해서 얻은 정보로 문제를 확인하고 이를 개선하거나 보완할 수 있다.
여기서 나는 추가로 동시성 문제 파악을 위한 동시성 테스트의 목적으로도 진행하였다.
부하 테스트는 성능 테스트와 성능 튜닝이 어느 정도 완성되면 해당 소프트웨어 혹은 서비스를 대표할 수 있는 기능을 선정하여 해당 하드웨어 및 네트워크 환경에서 얼마나 많은 사용자가 동시에 사용할 수 있는지 테스트하는 것이다.
부하테스트는 성능테스트의 일부로 시스템의 처리량과 최대 성능 한계를 결정하는 데 초점을 맞춘다고 생각하면 된다.
// brew 로 jmeter 설치
$ brew search jmeter
// jmeter 실행.
$ open /opt/homebrew/bin/Jmeter
🧭 Test Plan → Add → Threads (Users) → Thread Group
- Number of Thread(유저수) : 100명
- Ramp-up period(스레드당 생성시간) : 0.1초
- Loop Count(반복 횟수) : 1번
먼저 Thread Group을 생성해주어야 하는데 나는 다음과 같이 설정하였다.
이렇게 하면 100명의 유저가 0.1초안에 요청을 보낸다는 것이다.
나는 동시접속자 100명에 대한 성능을 측정하고 싶었기 때문에 이렇게 설정하였다.
🧭 Thread Group → Add → Config Element → HTTP Request Defaults
Protocol : http 또는 https 입력
Server Name or IP : Host 또는 IP 입력
Port Number : Port 번호 입력
Http Method : 요청 메소드
Path : Path 입력
Parameter , Body : Parmeter, Body 값 입력
다음 항목들을 입력하여 Http Request를 생성한다.
🧭 Http Request → Add → Config → Config Element → Http Header Manager
JWT 토큰을 위해 헤더를 설정해주었다.
POST 요청의 경우 content-type : application/json 헤더를 추가해주어야 한다.
🧭 Thread Group → Add → Listener → View Result Tree
결과를 확인할 수 있는 Listener를 생성한다.
나는 Summary Report와 View Result를 추가해주었다.
상단에 화살표를 클릭하여 실행할 수 있다.
Sampler Result에는 성공/실패 여부와 응답시간, Size, Response code 등을 볼 수 있다.
Summary Report 구성
이렇게 100번의 동시요청 테스트를 진행해봤는데 DB에는 다음과 같이 저장되어 있었다.
전부다 성공적으로 처리되었지만 2 에서 1로 100번의 1원 송금이 정상적으로 이루어지지 않은걸 볼 수 있다.
동시성 문제에 대한 해결이 필요할 것으로 보인다.