Signed Url로 파일 업로드 45.8% 성능 개선하기

ideafy·2025년 11월 19일

프로젝트

목록 보기
22/25

현재 플로우

  1. 사용자가 IdeaPost를 업로드
  2. 유저 검증
  3. ideaPost DB 저장
  4. 파일 N개 업로드
    1. GCS 파일 업로드 API 호출
    2. IdeaAttachments DB 저장
  5. 텍스트 임베딩 API 호출 및 저장

문제점

파일을 업로드하고 텍스트 임베딩하는 API /api/ideas의 시간이 매우 지연됨

문제의 원인

/api/ideas 요청이 오래 걸리는데는 주로 아래 외부 API 호출로 인해 발생한다.

1. 파일 업로드 API 호출 시간에 지연 발생

서버에서 파일을 받아 직접 업로드 API를 호출하면 파일 I/O가 여러 번 발생하는데 이게 API 호출 속도가 지연되는 주된 이유가 된다.

파일의 크기가 10MB라고 할 때 서버의 입장에서 아래와 같은 파일 I/O가 발생한다.

[클라이언트로부터 read] 10MB
[버퍼/메모리에서 다시 read] 10MB
[GCS로 write] 10MB

더해서 파일을 전송할 때 네트워크도 파일 크기만큼의 부하를 받는다.

2. 텍스트 임베딩 API 호출 시간에 지연 발생

문제 해결 방법

  1. 서버에서 pre signed url 발급하고 프론트에서 직접 업로드
  2. 외부 API 비동기 호출

이번 포스팅에서는 1번만 구현해볼 예정이다.


개선 플로우

  1. 사용자가 IdeaPost를 업로드
  2. 업로드할 파일의 개수만큼 /api/issue-signedurl로 서버에 signed url 발급 요청
  3. 프론트에서 signed url을 활용해 파일을 직접 업로드
  4. 업로드가 완료되면 서버에 IdeaPost의 데이터 및 파일 관련 데이터 (url, description)과 함께 /api/ideas를 호출해 IdeaPost를 등록 요청

개선 결과


개선 후 IdeaPost 업로드 시 사용자 기준 약 5초 정도 소요(133ms + 비동기 fetch 650ms + 4.3s)
이로써 약 45% 성능 개선을 달성했다.

주의점

signed url을 활용한 업로드는 단순 파일 업로드에서는 성능적인 이점을 가져올 수 있지만, 파일 검증/파싱/악성 데이터 확인 등 별도의 처리가 필요하다면 서버에서 직접 업로드하는 것이 더 나은 방식일 수도 있다.

profile
재밌게 공부하고 싶어요

0개의 댓글