Backend 개발/Backend 성능 개선

[Artillery로 간단한 백엔드 API 성능 측정하기]

수달리즘 2025. 4. 1. 09:32
반응형

Artillery로 백엔드 API 성능 측정하기

생성(DB insert) API 성능 측정 예제

내 로컬 pc에서 구동시킨 스프링 기반 어플리케이션을 대상으로 데이터 생성 API 성능 측정을 해보았다.

제대로 성능 테스트를 하고 싶다면 AWS나 vultr 등을 이용해서 어플리케이션을 실제로 배포/구동하는 편이 낫겠지만 난 로컬에서 하였다.

스프링 부트 프로젝트에 다음의 yml 파일을 만든다. urls.csv 파일은 테스트용 데이터 파일이다.

# create-load-test.yml
config:
  target: "http://localhost:8080"
  phases:
    - duration: 100 # 100초 동안
      arrivalRate: 10 # 1초 당 10번씩 요청
      rampTo: 100 # 요청을 점점 늘려서 초당 100번까지 늘림
  payload:
    path: "urls.csv" # 테스트용 데이터 파일
    fields:
      - "url"

scenarios:
  - name: "create shortenUrl"
    flow:
      - post:
          url: "/shortenUrl" # request url
          json:
            originalUrl: "{{ url }}" # 생성 API에 전달할 JSON 데이터

          #followRedirect: false

서버 구동 후, 해당 yml 파일이 있는 경로로 이동하여 다음의 명령어를 실행하면 성능을 측정할 수 있다.

작업이 끝나면 create-load-report.json 파일이 생성되고 여기서 결과를 확인할 수도 있다.

artillery run create-load-test.yml -o create-load-report.json

100초 동안 10초 단위의 Summary report를 확인할 수 있는데 min, max 값보다는 p95, p99가 더 유효할 수 있다.

(p95: 전체 요청 중, 95% 유저가 몇 ms만에 응답을 받았는지 나타내며, 실제 트래픽 성능 테스트 결과로서 가장 의미가 있음)

조회(DB select) API 성능 측정 예제

가짜 데이터 49,610개를 생성한 후, 위와 비슷한 방식으로 조회하는 API 성능을 측정해봤다.

artillery run read-load-test.yml -o read-load-report.json

DB에 아무런 설정 없이 성능을 측정하면 다음과 같이 나온다.(PK, UNIQUE 칼럼은 기본으로 인덱스 설정이 되어 있음)

조회 API DB 인덱스 제거하고 성능 측정

DB 조회 시, 조회 속도에 도움이 되는 인덱스를 제거하면 어떻게 될까?

다음의 명령어를 실행하여 데이터를 조회할 테이블의 인덱스를 조회하고 인덱스를 제거한 뒤, 다시 성능 측정을 해 보자.

SHOW INDEX FROM [테이블명];
ALTER TABLE shorten_url DROP INDEX [인덱스 키 이름]; -- 인덱스 제거

인덱스 하나만 제거했는데도 성능이 이렇게 차이가 나는 것을 확인할 수 있다. 응답 속도도 31배 이상 느려졌고 전에는 안보이던 타임아웃 에러도 발생했다.

이후부터는 생성 API, 조회 API 각각 성능을 조금씩 개선해나가는 작업을 할 것이다.

728x90
반응형