Apache JMeter란? + 부하 테스트, 사용법
Apache Jmeter를 접하게 된 이유
4개월 정도 진행해오던 복쟉복쟉이라는 프로젝트가 이제 배포를 앞두고 있다. 배포를 앞두기 전에 성능 저하 (ex. JPA N+1문제를 일으키는 것들, 현재 EC2가 어느정도까지 수용가능한지) 를 체크하기 위해서 접하게 되었다.
제대로 체크해보기전 Apache Jmeter의 설치 과정과 사용법을 알아보려고 한다.
Apache Jmeter
Apache Jmeter는 서버가 제공하는 성능 및 부하를 측정할 수 있는 테스트 도구이다. JMeter는 순수 Java 애플리케이션 오픈 소스이며 서버나 네트워크 또는 개체에 대해 과부하를 시뮬레이션하여 강도를 테스트하거나 다양한 부하 유형에서 전체 성능을 분석하는 데 사용할 수 있다.
비슷한 부하테스트 도구로는 Apache Benchmark, Ngrinderm Pinpoint, Gatling 등이 있다.
Apache JMeter의 특징
- 다양한 프로토콜/서버를 테스트할 수 있다.
- 웹 - HTTP/HTTPS
- FTP
- 데이터베이스 (JDBC 사용)
- Mail 등
- CLI 지원
- CI 또는 CD 툴과 연동할 때 편리하다.
- 시나리오 기반 테스트가 가능하다
- 다양한 외부 플러그인을 사용하여 기능 확장이 가능하다.
사용법
- 아래에 있는 JMeter 홈페이지에서 JMeter를 다운로드 받는다.(사진과 같이 Java 8 이상의 버전이 컴퓨터에 깔려 있어야 한다) 노란색 부분을 클릭하면 된다!
https://jmeter.apache.org/download_jmeter.cgi
- 다운받은 JMeter 파일 압축을 해제한다.
- 압축해제한 JMeter 파일에서 bin 폴더에 있는 jmeter.bat 파일을 더블클릭하여 실행해준다.
설치 방법은 여기까지이다. 간단하다!
JMeter의 주요 개념
- Thred Group
모든 테스트 플랜 작성의 시작 지점으로 Thread Group 아래에 모든 컨트롤러와 샘플러가 위치한다. Thread Group에는 실행하는 스레드 수, 램프업 시간, 테스트 수행 시간을 지정한다. 하나의 테스트 플랜에는 여러개의 Thread Group을 지정할 수 있다.
- Sampler
JMeter가 대상 시스템에 요청해야 하는 정보를 설정한다. 예를 들어 HTTP 프로토콜을 이용해서 테스트한다면 "HTTP Request Sampler"를 추가하고 여기에 연결한 URL 정보와 파라미터 값을 설정한다. 각각의 샘플러는 해당 프로토콜에 맞는 속성값들을 정하게 되어 있으며 테스트시 해당 프로토콜에 대한 이해없이는 설정이 거의 불가능 하다.
- Listener
JMeter를 통해 테스트하는 결과 정보 및 진행 상태 정보를 표시한다. 일반적으로 [Graph Result]를 이용해서 진행되는 추이를 그래픽하게 확인한다. 또한 수집된 정보는 XML 혹은 CSV로 저장이 가능하다.
- Configuration
Configuration Elements는 샘플러와 밀접한 관련이 있다. 비록 직접적으로 요청을 수해하지는 않지만 샘플러의 요청 정보를 관리할 수 있다. 예를 들어 테스트 플랜이 복잡해서 HTTP Request Sampler 작성을 많이 해야 하는데, 서버 IP나 포트 등 공통적으로 많이 사용되는 부분이 있다면 Configuration Elements의 "HTTP Request Defaults"에 설정하면 된다. 그러면 해당 설정 정보가 관련된 HTTP Request에 모두 적용된다.
- Assertion
JMeter의 HTTP 프로토콜을 이용해서 성능 테스트를 할 경우 요청별 성공/실패 여부는 HTTP 응답 코드의 값을 이용해서 판단한다. HTTP 응답 코드가 200이면 성공을, 그외에 다른 코드 값은 실패로 규약되어 있다. JMeter에서도 이를 그대로 사용하며 200번 코드가 리턴되면 테스트는 성공으로 인식한다.
하지만 업무적으로 200번 코드가 리턴되더라도 실패로 판단해야 하는 경우도 많이 있다. 이 경우 Assertion를 이용해서 응답 정보에 특정한 메시지를 필터링해서 성공/실패 여부를 판단할 수 있다.
- Pre-Processor Elements
샘플러를 실행하기 전에 수행해야 할 내용을 정의한다. 예를 들어 요청을 하기 전에 파라미터 값을 초기화하는 등의 작업에 사용한다.
- Post-Processor Elements
샘플러를 실행한 후에 수행해야 할 내용을 정의한다.
위 항목들은 JMeter 실행시 우선순위가 존재하는데, 다음과 같다.
Configuration -> Pre-Processor -> Timer -> Sampler -> Post-Processor -> Assertions -> Listener
테스트하기
1. Test Plan 마우스 우 클릭 → Add → Threads → Thread Group 클릭
이 것을 하면 아래와 같은 화면이 나온다.
여기서 중요한 부분은
- Number of Threads(테스트 사용 수) : 1000명
- Ramp-up period(실행 시간): 50초
- Loop Count(반복 수): 2회 접속
2. Thread Group 우클릭 → Add → Sampler → HTTP Request 클릭
이와같은 화면이 나온다.
- Protocol: http or https 입력
- Server Name or Ip : 테스트하려는 도메인 또는 IP : 필자는 localhost로 테스트를 진행하였다.
- Path: 테스트하려는 서버의 path : 보통 스프링은 8080이지만 필자는 개인사정으로 8090으로 진행
- Content encoding : UTF-8
3. Thread Group → Http Request → Advanced → Implementation에서 ‘HttpClient4’ 선택
4. 만약 본인이 Token을 통해서 Authorization을 header에 추가해야한다면
Http Request 우클릭 → Add → Config Element → Http Header Manager 선택
위의 그림과 같이 값을 추가해주면 된다.
5. Thread Request 우클릭 → Add → Listener → Summary Report 클릭하고 상단의 실행 버튼 클릭
테스트되는동안 서버 콘솔창을 확인해보면 로그가 쭉쭉 올라가는 것을 확인할 수 있다.
이처럼 간단하게 부하테스트를 진행해보았다. 다음에는 더 복잡한 시나리오로 테스트를 진행해보도록 하겠다.
참고: