파일 업로드 API 부하 테스트 (근데 이제 K6를 곁들인...)

2025. 7. 30. 14:40·Wishy (이력서 평가 프로젝트)

테스트를 하게 된 계기

이력서 프로젝트를 진행하며 지금 내 서버는 얼마나 많이 부하를 견딜 수 있을까를 테스트해보고 싶었다

많은 공고들에서 대용량 트래픽을 다루어본 경험이 있는지를 물어보기도 했고 현재 aws ec2 프리티어를 사용하면서
로컬에서 잘 되는 기능들이 프리티어에서 스펙이 딸려 잘 안되는 경험도 많이 했기에

ec2의 기능을 최대한 잘 활용하면서 코드 리팩토링이 필요한 부분을 파악해 최대한의 성능을 끌어내고 싶었기에

현재 서버는 어느 정도의 부하를 견딜 수 있는지 파악해보고 싶었다

그래서 현재 프로젝트에서는 파일 업로드가 처리 시간이 제일 오래 걸려 해당 api로 테스트를 진행했다

 

도구 선정
api 부하 테스트 도구에 대해 검색을 해보면 많은 선택지들이 나온다

gpt의 도움을 받아 내 상황에 좋은 도구는 무엇인지 파악해보았다

역시 gpt가 최고야

테스트 도구를 선정하는데 있어서 나한테 제일 중요했던 건 해당 서비스가 ec2에 설치되었을때 얼마나 가벼운가 였다. 

안 써본 기술을 공부해 보겠다고 elastic search를 썼다가 피를 봤기 때문이다. 그래서 k6로 결정했다


k6 설치

# 최신 버전 다운로드 (2025년 기준 v0.49.0 예시)
curl -L https://github.com/grafana/k6/releases/download/v0.49.0/k6-v0.49.0-linux-amd64.tar.gz -o k6.tar.gz

# 압축 해제
tar -xvzf k6.tar.gz

# 실행 파일 옮기기
sudo mv k6-v0.49.0-linux-amd64/k6 /usr/local/bin/

# 확인
k6 version

이런식으로 설치 해주고 

k6 v0.49.0 (commit/b5328aa782, go1.21.6, linux/amd64)

버전이 나오면 성공이다


k6 스크립트 

k6는 자바스크립트 파일로 구동할 수 있어 굉장히 편하다

필자는 aws ec2 ubuntu 에서 진행했다

그래서 cli 환경에서

nano upload_test.js

* nano 명령어는 텍스트를 편집하라는 뜻이다

 

이후 화면에서 아래처럼 스크립트를 구성해주면 된다

                                                                                        
{{}} 부분은 자신의 상황에 맞게 바꾸기
import http from 'k6/http';
import { check } from 'k6';
import { randomString, randomItem } from 'https://jslib.k6.io/k6-utils/1.4.0/index.js';
import encoding from 'k6/encoding';

export let options = {
  vus: 10, //10명의 사용자가
  duration: '20s', //20초 동안 동일한 api를 호출한다는 뜻이다
};

const JWT_TOKEN = '{{jwt Token 넣기}}'; />

// Base64 파일을 미리 로딩 (전역에서!)
const files = [
  {
    content: encoding.b64encode(open('복사할 파일 경로', 'b')),
    fileName: 'test',
  },
];

export default function () {
  const file = randomItem(files);
  //본인의 상황에 맞게 선택
const mimeType = file.fileName.endsWith('.pdf') ? 'application/pdf' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; // .docx

const contentWithPrefix = `data:${mimeType};base64,${file.content}`;
  const title = '자동 테스트';
  const comment = '성능 테스트 업로드입니다.';


  const body = JSON.stringify({
    fileName: file.fileName,
    content: contentWithPrefix,
    title: title,
    comment: comment,
  });

//토큰을 사용한 인증을 거쳐야 한다면 이렇게 추가
  const headers = {
    Authorization: JWT_TOKEN,
    'Content-Type': 'application/json',
  };

  const res = http.post('{{해당하는 api}}', body, { headers });
 //console.log도 추가할 수 있어 원하는 정보를 볼수 있다
  check(res, {
    'status is 200': (r) => {
      if (r.status !== 200) {
        console.log(`❌ 실패: status=${r.status}, body=${r.body}`);
      }
      return r.status === 200;

 

ctrl+o  누른 후 엔터를 누르고 ctrl+x를 누르면 저장된다(윈도우 기준)

맥은 ctrl에 매칭되는 다른 키를 누르면 될것이다

 

k6 실행

k6 run uploads_test.js

이 명령어로 k6를 구동하자

 

결과화면

Test 1. 5명이서 10초동안 api를 호출

 

성공하면 이런 식으로 status 200 이라고 뜬다

해당 로그에 대해 설명하자면

역시 gpt가 최고야 222

 

나는 총 3번의 테스트를 진행했다. 어디까지 부하를 견딜까 궁금했다

 

Test 2. 5명이서 20초 동안 api를 호출

 

Test 3. 10명이서 20초동안 api를 호출

 

테스트 호출 수는 나의 경우 파일의 크기에 따라 조금씩 달랐고 사용자가 많아진다고 해서 호출수가 기하급수적으로 늘지는 않았다
1번의 api를 호출할 때 시간이 오래걸렸다면 그만큼 서버에 부하가 걸려 사용자가 많아지고 지속시간이 길어도 비례해서 호출수가 늘지는 않았다


결론

이 test를 통해 나는 현재 내 서버의 부하에 어느 정도 안정성을 갖추고 있다고 안심할 수 있었다.
개인 프로젝트 특성상 20초간 353번 이상의 트래픽이 아직은 생기지 않을 것이기 때문이다

만약 생긴다면 더 나은 서버 설계를 하려고 하는 고민과 동시에 그만큼의 트래픽이 발생한 것에 대해 내가 배워나갈 것들에 행복할 거 같다는 이중적인 생각도 들었다. 

 

여담으로 최근에 영화표 할인 대상이 450만명이여서 영화사 홈페이지가 터졌다던데 그런 트래픽도 한번 다뤄보면 얼마나 재밌을까 싶다. 

 

또한 이렇게 백엔드의 응답시간은 오래 걸리지 않고 안정적인데

내가 프론트로 사용하고 있는 appsmith에서

무슨 짓을 하는거야 appsmith


이런 무지막지한 시간을 보고 아 appsmith 상에서 개선이 필요하겠구나를 느꼈다.
그래 백엔드 문제는 아니니까 최대한 해보고 안되면 리액트를 배우든 바이브 코딩을 해서 옮겨야겠다

'Wishy (이력서 평가 프로젝트)' 카테고리의 다른 글

Appsmith 에서 PDF 띄우기  (1) 2025.06.17
Aws EC2, Docker 사용하여 AppSmith 배포하기  (0) 2025.05.16
'Wishy (이력서 평가 프로젝트)' 카테고리의 다른 글
  • Appsmith 에서 PDF 띄우기
  • Aws EC2, Docker 사용하여 AppSmith 배포하기
코딩숙
코딩숙
개발이라는 끝이 없는 바다 묵묵히 꾸준히 항해하기
  • 코딩숙
    코딩숙
    코딩숙
  • 전체
    오늘
    어제
    • 분류 전체보기 (63)
      • CS 공부 (17)
        • 클라우드 (3)
        • 네트워크 (3)
      • 개발 공부 (40)
        • 오류 해결 (4)
        • 알고리즘 (12)
        • Spring (3)
        • JPA (2)
        • TIL(오늘 내가 배운 것) (9)
        • 코드복습 (1)
        • 디자인 패턴 (1)
      • IT 관련 영상 메모 (1)
      • 데일리피드백 (0)
      • Tools (1)
      • Wishy (이력서 평가 프로젝트) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    개발자
    키 페어 변경
    java
    isAfter()
    개발공부
    백준
    programmers #정수 내림차순으로 배치하기
    게임 맵 최단거리 자바
    JPA
    인프런
    setter method
    도메인설계
    마이크로서비스
    프로그래머스
    appsmith
    isBefore()
    innodb
    변수
    데이터베이스 백업
    프로그래머스 네트워크 자바
    데이터베이스 손상
    데이터 타입
    getter method
    404 Not Found
    302 Found
    HTTP BODY
    키 페어 분실
    http
    자바
    user mode
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
코딩숙
파일 업로드 API 부하 테스트 (근데 이제 K6를 곁들인...)
상단으로

티스토리툴바