HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🛁
공부기록
/
🍀
Spring
/
🥼
S3에 이미지 업로드하기
🥼

S3에 이미지 업로드하기

 

멀티파트 업로드란?

  • Amazon S3에 파일을 업로드 하면 S3 객체로 저장됩니다.
  • 멀티파트 업로드는 객체를 더 작은 부분으로 나누고 각 부분을 개별적으로 업로드하게 됩니다. 모든 부분들이 업로드 된 경우 다시 합쳐지게 됩니다.
notion image

대용량 파일 업로드 시 멀티파트 업로드를 사용해야 하는 이유

더 높은 처리량 !

  • 부분을 병렬적으로 업로드하여 처리량을 개선할 수 있습니다.
  • EC2 서버 환경에서 S3에 1.3 GB인 동영상을 업로드 했을 시 90초가 걸렸으며 멀티파트 업로드 시 50초로 감축됐다. 약 45%의 성능 향상을 보였다.

단일 파일 최대 용량

  • S3에 단일 작업으로 올릴 수 있는 객체 크기는 최대 5GB이다.
  • 반면 멀티파트 업로드 API를 사용하면 최대 5TB 크기의 단일 객체를 업로드 할 수 있다.

업로드 일시 중지 및 재개

  • 언제든지 부분들을 업로드 할 수 있다. 전체 프로세스를 일시 중지하고 나머지 부분을 나중에 업로드 할 수 있다.
 

멀티파트 업로드 성능 테스트해보기

테스트 결과

  1. 단일파일 업로드 시간
  • 7MB인 mp4 동영상 → 1678ms, 약 1초
  • 180MB인 mp4 동영상 → 9841ms, 약 9초
  • 1.3GB인 mp4 동영상 → 90180ms, 약 90초
  1. 멀티파트 방식으로 s3에 업로드 할 때 걸린 시간
  • 7MB인 mp4 동영상 → 1754ms, 약 1초
  • 180MB인 mp4 동영상 → 4859ms, 약 4초
  • 1.3GB인 mp4 동영상 → 50540ms, 약 50초
🧐
서버 사양에 따라 다르겠지만 청크 크기보다 작은 영상은 업로드 시간에서 큰 차이가 없다. 여기서 청크는 위에서 말한 부분이랑 같은 의미이며 한 개의 파일을 특정 크기만큼 자른 일부분이다. 영상 크기가 클 수록 멀티파트 방식으로 업로드 하는게 훨씬 높은 성능을 보여줍니다. 업로드 영상 크기에 청크 사이즈를 조절해서 업로드하면 시간이 더 빨라질 것이다.
 

멀티파트 업로드 프로세스

notion image

멀티파트 업로드 시작

  • 멀티파트 업로드 시작 요청을 보내면 S3는 멀티파트 업로드에 대한 고유 식별자인 업로드 ID가 포함된 응답을 반환한다.
  • 부품을 업로드하거나, 부품을 나열하거나, 업로드를 완료하거나, 업로드를 중지할 때마다 이 업로드 ID를 포함해야 합니다.
  • 업로드되는 객체를 설명하는 메타데이터를 제공하려면 멀티파트 업로드 시작 요청에 메타데이터를 제공해야 합니다.
 

부분 업로드

  • 부분을 업로드 할 때 업로드 ID 외에 부분 번호를 지정해야 합니다. 1에서 10,000 사이의 부품 번호를 선택할 수 있습니다.
  • 부분 번호는 업로드 중인 개체에서 부분과 해당 위치를 고유하게 식별합니다.
 

멀티파트 업로드 완료

  • 멀티파트 업로드를 완료하면 Amazon S3는 부분 번호를 기준으로 오름차순으로 부분을 연결하여 객체를 생성합니다.
 

멀티파트 업로드 개발하기

[AWS] Spring Boot 와 멀티파트 업로드를 사용해 S3에 대용량 파일 업로드하기
하지만 위 방식은 크게 두 가지 문제가 있습니다. 1. 대용량 파일을 업로드할 때 시간이 많이 걸립니다. 필자가 EC2 t2.small에서 S3로 업로드 테스트할 시 1.3GB 동영상은 무려 90초가 걸렸습니다. 동일 환경에서 멀티파트 업로드 방식을 테스트 시 해당 시간을 50초로 단축되었습니다.(약 45%) 2. 최대 5GB 크기를 가진 파일만 업로드 가능합니다.
[AWS] Spring Boot 와 멀티파트 업로드를 사용해 S3에 대용량 파일 업로드하기
https://develop-writing.tistory.com/129
[AWS] Spring Boot 와 멀티파트 업로드를 사용해 S3에 대용량 파일 업로드하기