AWS S3 멀티파트 업로드

멀티파트 업로드
멀티파트 업로드(Multipart Upload는 보통 대용량 파일을 업로드할 때, 파일을 여러 개의 작은 조각(‘파트(part)’)으로 나누어 동시에 혹은 순차적으로 업로드한 뒤, 서버 측에서 이 작은 조각들을 결합하여 원본 파일로 복원하는 방식입니다. 이 기법은 특히 클라우드 스토리지(AWS S3, Azure Blob Storage, Google Cloud Storage 등)나 대형 파일 전송 시스템에서 널리 사용됩니다.
멀티파트 업로드의 주요 특징
1. 대용량 파일 전송 최적화
큰 파일을 한 번에 업로드하려면, 전송 중 네트워크가 끊기거나 에러가 발생했을 때 전체 과정을 처음부터 다시 시도해야 하는 비효율이 발생합니다. 멀티파트 업로드는 파일을 여러 파트로 나누어 업로드하므로, 특정 파트에서만 문제가 생기면 그 파트만 재전송하면 됩니다.
2. 업로드 실패 시 재시도(Resumable Upload)
예를 들어 1GB 파일을 5개 파트로 나누어(각 파트 200MB) 업로드하던 중 4번째 파트에서 에러가 발생했다면, 전체 업로드를 다시 시작할 필요 없이 4번째 파트만 재전송하면 됩니다. 이로써 네트워크 트래픽과 시간 낭비를 크게 줄일 수 있습니다.
3. 병렬 업로드(Parallel Upload)
여러 파트를 병렬로 전송함으로써 업로드 시간을 단축할 수 있습니다. 특히 대역폭이 크거나 서버가 분산 환경으로 구성되어 있는 경우, 업로드 속도가 크게 향상됩니다.
4. 유연성(Flexibility)
일부 시스템(예: AWS S3)은 업로드할 파트의 개수나 크기를 유연하게 조정할 수 있도록 허용합니다. 상황과 요구사항에 따라 파트 크기를 최적화하면, 보다 안정적이면서 빠른 업로드를 기대할 수 있습니다.
멀티파트 업로드 절차
AWS S3 Multipart Upload 개념과 4단계 프로세스 대용량 파일을 업로드할 때, 하나의 큰 파일을 여러 개의 작은 부분(Part)으로 나누어 업로드하는 방식을 Multipart Upload라고 합니다. 이 방식은 네트워크 장애가 발생해도 개별 부분만 다시 업로드하면 되므로 보다 안정적인 업로드가 가능합니다. 또한 여러 부분을 병렬로 업로드할 수 있어 성능도 향상됩니다.
Multipart Upload는 총 4단계로 구성되며, 특정 상황에서는 업로드를 취소해야 할 수도 있습니다.
1. Multipart Upload 시작 (Initiate Upload)
클라이언트가 Multipart Upload를 시작하는 요청을 보내면, 서버는 이 업로드를 식별할 수 있는 Upload ID를 응답합니다. 이 Upload ID는 이후의 모든 단계(부분 업로드, 업로드 완료, 업로드 취소)에서 반드시 필요하므로 클라이언트는 이를 저장해야 합니다.
2. Presigned URL 발급
파일을 업로드하려면 AWS S3에서 서명된 URL (Presigned URL) 을 발급받아야 합니다. 이때 요청에는 Upload ID와 함께 업로드할 조각을 구분할 PartNumber(1~10,000 사이의 숫자)를 포함해야 합니다.
파트 번호는 반드시 연속적일 필요는 없으며, 예를 들어 1, 5, 14와 같이 선택할 수도 있습니다. 하지만 동일한 파트 번호로 새 데이터를 업로드하면 기존 데이터가 덮어쓰기 되므로 주의해야 합니다.
3. Presigned URL을 이용한 Part 업로드
발급받은 Presigned URL을 사용해 PUT 요청으로 각 파트를 업로드합니다.
개별 파트의 크기는 최소 5MB에서 최대 5GB 사이여야 합니다. 단, 마지막 파트는 5MB 이하도 허용됩니다. 파일 크기가 5MB 이하라면, 전체 파일을 하나의 파트로 업로드하면 됩니다. 최대 10,000개의 파트를 업로드할 수 있으므로 최대 5TB 크기의 파일까지 업로드 가능합니다. 각 파트 업로드가 완료되면 서버는 응답 헤더에 ETag (MD5 체크섬 값) 을 포함해 반환합니다. 클라이언트는 각 PartNumber와 해당 ETag 값을 매칭하여 저장해야 합니다. 이는 이후 최종적으로 업로드를 완료할 때 필요합니다.
4. Multipart Upload 완료
업로드한 모든 파트가 정상적으로 처리되었다면, 클라이언트는 업로드 완료 요청을 서버에 보냅니다.
이때 요청에는 다음 정보를 포함해야 합니다.
Upload ID 각 PartNumber와 해당 ETag 값 리스트 S3는 이 정보를 바탕으로 모든 파트를 합쳐 최종 객체를 생성합니다. 파일 크기가 클 경우, 이 과정에서 몇 분 정도의 시간이 소요될 수 있습니다.
Note: ⚠ 업로드 완료 요청을 하지 않으면 파일이 S3에 저장되지 않습니다.
예외: Multipart Upload 취소 업로드 도중 오류가 발생하거나 업로드를 중단하고 싶다면, 업로드 취소 요청을 보내야 합니다.
이미 업로드된 파트라도 업로드 완료 또는 취소 요청이 없으면 S3에 저장된 채로 스토리지 비용이 청구됩니다. 따라서 예상치 못한 오류가 발생하면 업로드를 완료하지 않을 경우, 업로드 취소를 수행하는 것이 필수입니다. 한 번 취소된 Upload ID는 다시 사용할 수 없으므로, 업로드를 재시도하려면 새로운 Multipart Upload를 시작해야 합니다.
Presigned URL과 멀티파트 업로드
AWS S3의 경우, 멀티파트 업로드 방식으로도 Presigned URL을 생성할 수 있습니다. 즉, 각 파트(part)에 대해 Presigned URL을 생성하고, 이를 통해 병렬 업로드를 진행할 수 있습니다.
멀티파트 업로드 절차 서버에서 “멀티파트 업로드”를 시작(Initiate)하고, 해당 업로드를 식별할 수 있는 UploadId를 받아옵니다. 각 파트에 대해 Presigned URL을 생성합니다(파트 번호 등 메타데이터 포함). 클라이언트는 이 URL을 활용해 각 파트를 S3로 바로 업로드합니다. 모든 파트를 업로드한 뒤, “Complete Multipart Upload” 요청으로 파일 업로드를 마무리합니다. 이 방식을 사용하면 대용량 파일 전송에도 서버 자원 부담을 줄이면서, 동시에(병렬로) 각 파트를 전송하여 업로드 시간을 단축할 수 있습니다.
Presigned URL을 사용하는 이유 및 장점
1. 보안 및 권한 제어
S3에 직접 접근하기 위한 자격 증명(AWS Access Key, Secret Key)을 클라이언트에게 노출할 필요가 없습니다. Presigned URL은 유효 기간이 제한적이므로, 만료 후에는 더 이상 사용될 수 없습니다. 버킷 정책(IAM Policy)과 결합하면 더욱 정교하게 접근 제어가 가능합니다.
2. 서버 부하 감소
파일 업로드/다운로드 트래픽이 서버를 거치지 않고 클라우드 스토리지(S3 등)로 바로 전달됩니다. 대용량 파일 전송 시, 서버의 네트워크 대역폭과 처리 비용을 아낄 수 있습니다.
3. 편리한 연동
웹 브라우저, 모바일 앱 등 다양한 클라이언트 환경에서 쉽게 사용 가능합니다. 클라이언트는 단순히 HTTP 요청으로 S3에 업로드/다운로드를 수행할 수 있으므로, 추가 SDK 설치나 복잡한 인증 로직이 필요 없습니다.
동시성(Concurrency) 개념
동시성(Concurrency) 이란,
여러 작업(task)이나 프로세스가 ‘논리적으로 동시에(동시에 실행되는 것처럼)’ 진행되는 것을 의미합니다. 꼭 물리적으로 여러 CPU 코어나 프로세스를 활용해야만 동시성이 생기는 것은 아니며, 단일 CPU에서도 스케줄링 방식을 통해 여러 작업이 번갈아가며 실행됨으로써 동시성 효과를 낼 수 있습니다.
병렬성(Parallelism) 과 종종 혼동되는데,
병렬성은 물리적으로 여러 CPU 코어가 동시에 여러 작업을 수행하는 것을 의미합니다.
반면 동시성은 단 하나의 CPU 코어라도 여러 작업을 빠르게 전환(Switching)하며 실행하여, “동시에 수행되는 것처럼” 보이게 하는 개념을 포함합니다.
결과적으로, 프로세스/스레드/코루틴 등이 서로 간섭 없이 혹은 최소한의 간섭(경쟁 조건, 교착 상태 등)으로 효율적으로 처리될 수 있도록 관리하는 기법과 이론을 통틀어 ‘동시성 프로그래밍(Concurrency Programming)’이라 부릅니다.
멀티파트 업로드에서의 동시성
멀티파트 업로드(Multipart Upload)와 동시성은 밀접한 관련이 있습니다. 대용량 파일을 여러 파트(part)로 나눈 뒤, 이 파트들을 병렬적으로(Parallel) 업로드함으로써 업로드 시간을 크게 단축할 수 있기 때문입니다. 이 과정을 “멀티파트 업로드의 동시성”이라고 볼 수 있습니다.
1. 병렬 업로드(Parallel Upload)
- 파일을 여러 조각(예: 5MB, 10MB 등)으로 쪼개어, 각 조각을 여러 스레드(혹은 프로세스)에서 동시에 업로드합니다.
- 동시성을 통해 네트워크 대역폭을 최대한 활용하고, 전체 업로드 시간을 크게 줄일 수 있습니다.
2. 동시성 제어(Concurrency Control)
- 여러 스레드가 동시에 업로드를 진행하기 때문에, 공유 자원(예: 업로드 큐, 진행률 정보 등)에 접근할 때는 동시성 제어가 필요합니다.
- 특정 자원에 대한 동시 수정(Write)이 발생할 경우, 스레드 간에 충돌이나 데이터 훼손이 일어나지 않도록 주의해야 합니다(락(lock), 뮤텍스(mutex), 세마포어(semaphore) 등을 적절히 활용).
3. 네트워크와 자원 할당(Throughput & Resource Allocation)
- 동시에 여러 파트를 업로드한다면, 네트워크 대역폭이 충분하지 않을 경우 오히려 성능이 떨어질 수 있습니다.
- 스레드가 너무 많아지면 문맥 전환(Context Switching) 비용이 커져서 비효율이 발생할 수도 있습니다.
- 따라서 최적의 파트 크기와 스레드 수를 결정하는 것이 중요합니다.
4. 실패 시 재시도(Resumable Upload)
- 멀티파트 업로드 도중 일부 파트가 업로드 실패할 경우, 해당 파트만 재전송하면 되므로 동시성(병렬성) 관점에서 에러 처리도 유연하게 할 수 있습니다.
- 여러 스레드 중 하나가 실패해도, 다른 스레드는 성공적으로 진행될 수 있기 때문에, 전체 업로드가 모두 무효화되지 않습니다.
멀티파트 업로드가 유용한 경우
1. 초대용량 파일을 업로드할 때
동영상, 백업 파일, 로그 아카이브 등 파일 크기가 몇 기가바이트(GB) 이상이라면 멀티파트 업로드가 권장됩니다.
2. 네트워크 상태가 불안정하거나 변동이 심할 때
한 번에 큰 파일을 업로드하다가 실패하면 많은 시간을 소모합니다. 멀티파트 업로드는 재전송해야 하는 부담이 훨씬 줄어듭니다.
3. 업로드 시간 단축이 필요한 경우
업로드 시간 단축이 필요한 경우(병렬 전송)
여러 파트를 동시에 업로드하여 전송 시간을 절약할 수 있습니다.
댓글 로딩 중...