API 성능 측정? 개선? nGrinder? 그거 어떻게 하는건데?

2.5*2 하빈·2024년 6월 6일
3
post-thumbnail

프로젝트를 진행하는데

문득 의문이 들었다..

내가 개발한 API의 성능은 과연 좋을까? 나쁠까?

그래서 성능 측정 Tool에 대해서 알아봤고!

가장 대중적이고 쉽게 사용할 수 있는 nGrinder 를 선택하여 사용해보기로 했다!

자! 오늘도 가보자!!

후비고~!~!~!


1 - Docker Compose 작성 및 실행

  • nGrinder 디렉터리 생성
mkdir nGrinder

  • docker-compose.yml 작성
vi docker-compose.yml
version: '3.8'
services:
  controller:
    image: ngrinder/controller
    restart: always
    ports: 
      - "9001:80"
      - "16001:16001"
      - "12000-12009:12000-12009"
    volumes:
      - /ngrinder-controller:/opt/ngrinder-controller
  agent:
    image: ngrinder/agent
    restart: always
    links:    
      - controller

  • docker compose 실행
docker compose up -d

  • docker container 확인
docker ps


2 - nGrinder 접속

  • 설치한 9001 port 로 접속해보자

초기 ID, PW : admin


  • 접속하면 아래와 같은 화면이 나올 것이다!


3 - Agent Management 확인

  • admin > Agent Management
    Controller 정상적으로 있는지 확인 (서버 주소랑 초록색 동그라미 있음)


4 - 서버 연결 확인

  • 상단에 script click


  • Create > Create a script


  • 필요한 설정 입력

    Script Name : 사용자 임의 지정 script 이름
    URL to be tested : 테스트하려는 API HTTP 메소드 & URL


  • 저는 JWT 토큰 검증이 필요하지 않은 API로 서버 연결을 확인했습니다!

기본으로 작성되는 Script 에서 변경하지 않고,
Validate 클릭 시 아래 Error가 없고, test 결과가 나온다면 성공입니다!


오..... 나도 이제 API 성능 측정을 할 수 있는 것인가..??!!!

그렇다..

우리는 이제 성능 측정을 통해서 내 API 성능을 확인할 수 있다!!!


하지만,, 아직 이정도로 할 수 있다고 말할 수 있겠는가?

nGrinder의 가장 큰 장점으로

Groovy script를 커스텀으로 직접 코드를 작성해서
API 성능 측정을 유연하게 할 수 있다는 것인데!!!

script 작성법과 요령에 관해서는 다른 자료를 찾아봐서 성능 측정을 해야할터!

하지만,
단순히 Get 요청 API 측정은 아래 text 메소드에
HTTPResponse를 여러 개 작성해서 성능 측정을 하면된다!

@Test
public void testMultipleAPIs() {
    // 첫 번째 API 호출
    HTTPResponse response1 = request.GET("https://서버주소/api/health-check", params);
    checkResponse(response1);

    // 두 번째 API 호출
    HTTPResponse response2 = request.GET("https://서버주소/api/another-endpoint", params);
    checkResponse(response2);

    // 추가적인 API 호출이 필요한 경우 여기에 더 추가
}

private void checkResponse(HTTPResponse response) {
    if (response.statusCode == 301 || response.statusCode == 302) {
        grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode);
    } else {
        assertThat(response.statusCode, is(200));
    }
}

5 - 성능 테스트 만들기

  • 그럼 심도있는 script를 작성하기 전에 성능테스트를 만들어볼까?
    Performance Test > Create Test

Agent : 방금 생성한 한 개의 script가 있기 때문에 1 입력
(적용할 script 개수)

Vuser per agent : 테스트할 사용자 수 입력하시면 됩니다.
(실행하는 controller 서버 사양에 따라 잘 조절하며 진행)

Duration : 테스트할 시간을 지정합니다.
(보통 저는 5-10분으로 측정합니다)

Save and Start : 오른쪽 위 파란 버튼 클릭 후 바로 실행하면 됩니다.


6 - 성능 테스트 모니터링 & 결과 확인

  • TPS Graph 와 세부 결과를 확인할 수 있다!


  • Detailed Report 에 들어가서 확인을 하면 ?
    더 세부적으로 테스트 내용을 확인할 수 있다!


이렇게 nGrinder 를 사용해서 간단하게 API 성능 측정을 해보았다!

이제 진짜 내가 작성한 API 성능 측정을 하러가자!

근데, 테스트를 진행할 때 어떤 방법으로 해야할까?

뭐.... 자신의 상황에 따라서 테스트 하는 방법을 선택해야한다.

첫 번째 방법 : 단일 스크립트 내에서 여러 요청 처리

다른 API 엔드포인트를 순차적으로 호출하는 것은
코드를 간단하게 유지하고
한 세션 내에서 여러 요청을 테스트하고 싶을 때 유용하다.

두 번째 방법 : 별도의 스크립트로 분리

테스트를 독립적으로 실행하고자 할 때 좋은 방법이다!
이 방법은 병렬 실행을 용이하게 하고,
각 API 테스트의 관리를 단순화할 수 있습니다.

nGrinder에서는 테스트 스크립트마다
다른 설정(예: VUser 수, 파라미터 등)을 적용할 수 있으므로,
각 테스트 케이스의 요구 사항에 맞게 조정할 수 있습니다.


!! 결론 !!
테스트의 목적에 따라 적절한 방법을 선택해서 하면 될 듯..

간단한 API 성능 검증이 목적이라면 ?

한 스크립트에서 여러 요청을 처리하는 것이 좋을 수 있고!

더 복잡하거나 분리된 테스트가 필요하다면 ?

각 API에 대해 별도의 스크립트를 작성하고
에이전트를 조정하는 것이 효과적일 수 있겠다!


이제 API 성능에 대해서도 고려하면서 개발하는 개발자로
한층 더 성장할 수 있다는 것에 매우 기쁘다!!!


이제 프로젝트에서 JPA N+1 문제와 DB 접근을 최소화하여 성능을 개선시켰을 때,
실제로 수치로 확인을 하여 기록을 할 수 있다는 사실이 매우 신이난다!


빨리 개발하러 가야겠다!!

쓩~

profile
끝내주는 남자

0개의 댓글