업로드 방식
。백엔드 프록시,Pre-Signed URL
백엔드 프록시( Backend Proxy )
。클라이언트가백엔드에게파일 업로드를 명령 시백엔드가Object Storage에 저장
。구현이 간단하지만,파일이백엔드와S3을 거치므로,서버부하가 크고네트워크 비용이 2배로 발생
Pre-Signed URL
Presigned URL: 제한시간동안만 유효한서명된 URL
。클라이언트가백엔드로URL을요청시백엔드가Presigned URL을 발급하는 방식
。클라이언트가Presigned URL을 통해Object Storage에 직접업로드
▶백엔드 프록시방식에 비해클라이언트에서 직접Presigned URL을 통해업로드를 수행하므로서버 부하를 줄이고,네트워크 비용을 절감
업로드 유형
。단일 업로드/멀티파트 업로드
단일 업로드
。보통50 MB 미만수준의작은 파일에 적합한업로드 방식
▶파일 용량이 큰 경우, 중간에 실패 시 처음부터 다시업로드하는 단점이 존재
Presigned URL을 통한단일 업로드 순서
1.클라이언트가8 MB 이하 파일을업로드하기 위해백엔드에init POST API를 호출
。Init 상태의Media 객체가 생성
2.백엔드는Object Storage에Pre-signed URL을 요청 및 수신한Pre-signed URL을클라이언트에게 응답
3. 수신한Pre-signed URL을 통해클라이언트가Object Storage에 직접파일 업로드
4.업로드 완료시클라이언트가백엔드에UPLOADED POST API를 호출
。해당Media 객체는UPLOADED 상태로 전환
멀티파트 업로드
。50 MB를 초과하는대용량 파일에수 MB 단위의 작은여러 파트로 분할하여개별 업로드를 수행하는업로드 방식
멀티파트 업로드를 수행 시 장점
。신뢰성확보 :파일 업로드중네트워크가 끊겨도실패 파트만 재시도
。병렬 업로드:여러 파트를 동시에파일 업로드하여 속도를 증진
。진행률 추적: 각파트의업로드 상태를 추적하여,사용자에게진행률을 지시 가능
이미지 크기 임계값:8 MB가 적합한 이유?
。임계값이 작은 경우 ( ex.1 MB)
안정성은 높지만,멀티파트 업로드를 통해 여러요청을 보내야하므로,요청 오버헤드가 높게 발생
▶ 모든이미지를1 MB 단위로 쪼개야하는 만큼Object Storage에 전송할요청도 증가
。임계값이 높은 경우 ( ex.100 MB)
단일 업로드와 유사하므로 단순하지만,안정성이 낮은 단점이 존재
▶큰 파일을 전송하므로네트워크 전송시 중간에 끊길 위험이 존재
。임계값이균형인 경우 ( ex.8 MB)
일반 스마트폰 사진은단일 업로드,동영상은멀티파트로 처리
▶데이터 특성에 따라서임계값을 설정
멀티파트 업로드 순서
클라이언트가8 MB 이상 파일을업로드하기 위해init POST API를백엔드로요청
。Request Body에 포함된파일 크기에 따라서단일업로드 / 멀티파트 업로드로 구분
。Init 상태의Media 객체가 생성
백엔드에서createMultiPartUpload()를호출해서Object Storage으로부터uploadId를 수신 및 저장
。해당Media 객체의uploadId 필드에 해당값 지정
- 여러
Presigned URL로 구성된배열을클라이언트에게 전달
클라이언트는 각파트를8 MB씩 분할 및각 파트마다Presigend URL을 통해Object Storage로미디어파일 업로드
。각파트의파일이Object Storage에업로드 완료시 해당파트의ETag를 반환Part1 업로드 ↓ HTTP 200 OK / ETag: "ab123" Part2 업로드 ↓ HTTP 200 OK / ETag: "cd456" ...▶
클라이언트에서파트 별Presigned URL에 각파트를 업로드하면S3은응답 헤더에ETag을 전달
ETag:멀티파트 업로드에서 각파트의업로드 결과
5.모든 파일 업로드가 완료 시클라이언트는uploaded POST API를 통해 각파트의ETag들을 포함하여백엔드로 요청
6.백엔드는completeMultipartUpload()를 호출 시Object Storage모든파트를 하나의파일로병합후OK를 반환
7.백엔드는 해당파일 정보를DB에 저장 및200 OK를클라이언트에게 반환
API 유형
Init API(POST)
。해당API를 통해파일 업로드 요청시mediaType과fileSize를 함께 전달 시단일 / 멀티파트 업로드를 결정하여응답값을 반환
업로드 파일이8 MB보다 작아서단일 업로드를 수행하는 경우
。2MB는임계값( =8MB)보다 작으므로,Presigned URL하나만 반납
▶uploadId/presignedUrlParts와 같은멀티파트 용 필드는 비어있음.
업로드 파일이8 MB를 초과해서멀티파트업로드를 수행하는 경우
。16 MB는임계값( =8MB)보다 크므로, 여러Presigned URL를 반납
▶단일 업로드용presignedUrl은 비어있고,uploadId/presignedUrlParts와 같은멀티파트 용 필드가 제공
Uploaded API(POST)
。단일 업로드:mediaId만 전달 시백엔드는 해당파일 업로드를완료처리
。멀티파트 업로드:mediaId와 함께parts에 각작업완료된파트의partNumber와ETag쌍을 전달하여백엔드는Object Storage에완료를 알려준 후완료 처리