0. 들어가기 전
서비스 개발 과정에서 사전에 다양한 문제 상황을 예측하고 해결하는 것은 매우 중요합니다. 운영 중에도 여러 문제에 직면할 수 있지만, 특히 트래픽이 많은 상황에서는 예상치 못한 이슈가 발생할 가능성이 높습니다. 이러한 문제를 미리 발견하고 대비하기 위해 부하 테스트와 성능 테스트를 수행해야 합니다. 저는 JMeter를 활용하여 성능 테스트를 진행하고자 합니다.
💡선택 이유
1. 설치 및 사용이 쉬워 빠른 출시를 해야 하는 현재 저희 서비스 상황에 맞았습니다.
2. 매주 기술 세미나가 있는데 팀원 중 Ngrinder를 사용해 본 팀원이 있어 제가 JMeter를 학습하고 발표한다면 서로에게 좋은 지식 공유가 될 것이라 생각했습니다.
1. 사용법
a. 설치 방법
brew install jmeter // 설치
jmeter // 실행
위와 같이 두 개의 명령어만 입력하면 되므로 설치 방법은 매우 간단합니다.
b. 용어
- Thread Group : 테스트에 사용될 쓰레드 개수, 쓰레드 1개당 사용자 1명
- Sampler : 사용자의 액션 (로그인, 게시물 작성, 게시물 조회 등)
- Listener : 응답을 받아 리포팅, 검증, 그래프 등 다양한 처리
- Configuration : Sampler 또는 Listener가 사용할 설정 값 (쿠키, JDBC 커넥션 등)
- Assertion : 응답 확인 방법 (응답 코드, 본문 내용 비교 등)
c. Test Controller
@RestController
public class JmeterController {
@GetMapping("/posts/{postId}")
public String getPost(@PathVariable Long postId) {
return "JMeter Test postId : " + postId;
}
}
테스트할 Controller입니다. 이번 포스팅은 성능 테스트 방법에 대한 거라 최대한 간단하게 작성해 봤습니다.
d. 설정
d-1. 테스트 생성
File -> New -> Test Plan Name 설정
d-2. Thread Group
테스트할 유저 수를 설정하겠습니다.
생성한 테스트에 우클릭 -> Add -> Threads (Users) -> Thread Group


- Action to be taken after a Sampler error : Error가 리턴됐을 때 어떻게 할 건지에 대한 설정을 할 수 있습니다.
- Thread Properties
- Number of Threads : 쓰레드 개수
- Ramp-up period : 쓰레드 개수를 만드는데 소요되는 시간
- Loop Count : infinite | n으로 값을 설정할 수 있으며 설정된 값에 따라 Number of Threads X Ramp-up period 만큼 요청을 다시 보낸다.
-> 10명의 유저가 1초 만에 2번 반복해서 에러가 발생해도 계속 요청을 보낸다라는 뜻입니다.
d-3. Sampler
사용자가 해야 할 행동을 정의해 보겠습니다.
Thread Group 우클릭 -> Add -> Sampler -> HTTP Request


- Server Name or IP : localhost
- Port Number : 8080
- HTTP Request : Get/posts/10
d-4. Listener
Sampler가 받아오는 리턴 값을 바탕으로 그래프, 레포팅을 만들어주는 Listener를 만들어보겠습니다.
HTTP Request 우클릭 -> Add -> Listener -> View Results Tree, Summary Report, View Results in Table, Aggregate Report

d-5. Assertion
응답값이 제대로 왔는지 검증을 하기 위해 Assertions을 추가해 보겠습니다.
HTTP Request -> Add -> Assertions -> Response Assertions

Text Response -> Add -> Partters to Test 더블클릭 -> JMeter Test postId 입력


위와 같이 구성됩니다.
d-6. Header 설정
현재 진행중인 프로젝트에서는 HTTP 요청을 할 때 Access Token을 Header에 담아서 인가 작업을 수행하기 때문에 Header을 설정해 주겠습니다.
HTTP Request -> Add -> ConfigElement -> HTTP Header Manager


아래의 Add 버튼을 눌러 헤더를 설정해 주면 됩니다.
저는 액세스 토큰을 직접 넣어줬습니다.
d-7. Body 설정

HTTP Request에서 바디를 JSON 형태로 넣어줄 수 있습니다.
2. 실행

초록색 재생 버튼을 클릭하면 설절대로 테스트가 진행됩니다.
아까 만든 Listener들을 확인해 보겠습니다.
a. View Results Tree

요청을 20번 보내게 했기 때문에 20개의 요청 정보가 나온 걸 확인할 수 있습니다.
하나의 request의 테스트 시작 시간, 응답 속도 등 다양한 정보들이 나옵니다.
b. View Results in Table

View Results Tree를 Table 형식으로 보여줍니다. 데이터는 동일합니다.
c. Summary Report

- Label : Sampler 명
- # Samples : 샘플 실행 수 (Number of Threads X Ramp-up period)
- Average : 평균 걸린 수 (ms)
- Min : 최소
- Max : 최대
- Std. Dev : 표준 편차
- Error % : 에러율
- Throughput : 분당 처리량
- Received KB/sec : 초당 받은 데이터량
- Sent KB/sec : 초당 보낸 데이터량
- Avg. Bytes : 서버로부터 받은 데이터 평균
d. Aggregate Report

- Lable : Sampler 명
- # Sampler : 샘플 수 (Number of Threads X Ramp-up period)
- Average : 평균 응답 수
- Median : 응답 시간 중앙값
- 90% Line : 90%의 샘플은 해당 값보다 적은 시간 내에 끝나고 10%는 더 걸린다. 라는 뜻의 컬럼
- 95% Line : 95%의 샘플은 해당 값보다 적은 시간 내에 끝나고 5%는 더 걸린다. 라는 뜻의 컬럼
- 99% Line : 99%의 샘플은 해당 값보다 적은 시간 내에 끝나고 1%는 더 걸린다. 라는 뜻의 컬럼
- Min : 최솟값
- Maximum : 최댓값
- Error% : 에러율
- Throughput : 초당 처리량
- Received KB/sec : 초당 받은 KB
- Sent KB/sec : 초당 보낸 KB