NCP Object Storage 파일 업로드
DEXTUploadX5는 NCP(NAVER CLOUD PLATFORM) Object Storage 서비스를 이용하여 파일을 업로드할 수 있는 기능을 제공한다.
DEXTUploadX5 제품이 NCP Object Storage의 버킷에 파일을 업로드하기 위해서는, 서로 다른 출처끼리 통신을 허용해야 하기 때문에, 버킷에 CORS 설정을 해주어야 한다. 멀티파트 업로드 기능을 사용하기 위해서 반드시 PUT 요청 메소드와 ETag 응답헤더를 허용해야 하고, 운영 시점에는 AllowedOrigins 속성을 '*' 값으로 설정하지 않도록 주의해야 한다.
# CORS configuration
{
"CORSRules": [
{
"AllowedHeaders": ["*"],
"AllowedMethods": ["HEAD", "GET", "PUT", "POST", "DELETE"],
"AllowedOrigins": ["*"],
"ExposeHeaders": ["ETag"]
}
]
}
- DEXTUploadX5와 브라우저 AWS SDK 사용하여 업로드하기
-
DEXTUploadX5는 NCP Object Service 서비스로 파일을 직접 업로드하기 위해서 내부적으로 AWS SDK를 사용한다. SDK를 사용하여 업로드를 하려면 '리전, 버킷, 엑세스키, 비밀엑세스키' 정보가 필요하다. 다음은 해당 정보를 설정하는 코드를 보여준다.
// NCPOS 방식으로 설정한다. dx.setUploadMode("NCPOS"); // 설정 객체의 type 속성을 "NON-SECRET"으로 설정한 후, 나머지 값들을 설정한다. dx.setNCPOSUploadConfig({ type: "NON-SECRET", accessKeyId: "ABCD...1234", secretAccessKey: "ABCD...1234", // kr, us, sg, jp, de region: "kr", bucket: "abc-bucket" });버킷에 올라가는 파일은 키(key)로 구분한다. 일반적으로 키 값은 파일명을 사용하지만, 이름이 같은 파일들끼리 서로 덮어쓰는 문제를 해결하기 위해서, 키 값을 좀 더 구체화할 필요가 있다. 제품은 기본적으로 키 값을 파일 이름으로 사용하며, 파일 이름이 아닌 다른 형식으로 키를 설정하기 위해서는 makeKey 속성에 키를 생성하는 함수를 설정하면 된다.
dx.setNCPOSUploadConfig({ ... // 키: 컴포넌트이름/파일이름 makeKey: item => `${item.controlId}/${item.name}` });* 키 값에 '/' 문자를 넣으면 마치 폴더 구조를 가지는 것처럼 파일을 구분할 수 있다.
NCP Object Storage 서비스로 파일을 업로드하는 것은 업로드 방식을 NCPOS로 설정하는 것과 setNCPOSUploadConfig를 사용하여 설정을 해주는 것이 전부이며, 그 외의 특징은 OROF 또는 EXTS 모드를 사용하는 방식과 동일하다.
- Presigned URL을 사용하여 업로드하기
-
AWS SDK를 사용하여 브라우저에서 직접 서비스로 파일을 업로드하는 방법은 보안상의 이유로 권장되지 않는다. '액세스키, 비밀엑세스키'와 같은 정보는 외부에 노출이 되면 안되는 정보이므로 공개된 곳에서는 사용하는 것은 위험하다. NCP의 자격증명 정보를 노출하지 않고 업로드하기 위해서는 백엔드에서 사전에 서명된 주소(presigned url)를 생성하고 그 주소를 사용하여 파일을 업로드하는 방법이 있다. 서명된 주소는 일정 시간 동안만 유효하며, 업로드를 위한 권한이 내포되어 있다. 다음은 해당 정보를 설정하는 코드를 보여준다.
// NCPOS 방식으로 설정한다. dx.setUploadMode("NCPOS"); // 설정 객체의 type 속성을 "SECRET"으로 설정하거나 생략한다. dx.setNCPOSUploadConfig({ //type: "SECRET", initURL: "https://domain/path/ncpos-upload-init", signedURL: "https://domain/path/ncpos-upload-geturl", completeURL: "https://domain/path/ncpos-upload-complete" });initURL, signedURL, completeURL 주소가 하는 일은 다음과 같으며, 직접 구현해야 한다.
- initURL: 업로드 초기화
- signedURL: Presigned URL 생성
- completeURL: 업로드 완료 처리
플랫폼에 적합한 AWS SDK를 이용하여 서버 측에서 업로드 과정에 필요한 단계를 구현하면, 자격 증명과 같은 정보를 노출하지 않고, 파일 업로드 과정만 DEXTUploadX5가 처리하도록 할 수 있다.
Java Web Application 환경에서 사용가능한 예제들이 제공되므로, 제공된 예제를 참고하여 구현하도록 한다.
-
Java 그리고 Maven을 사용하는 환경인 경우 AWS SDK를 얻는 법
<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.x.x</version> </dependency> -
Java 그리고 Gradle를 사용하는 환경인 경우 AWS SDK를 얻는 법
implementation 'software.amazon.awssdk:s3:2.x.x'
- 특징
-
- DEXTUploadX5는 NCP Object Storage서비스에서 지원하는 멀티파트 업로드 방식을 사용하므로, 대용량 파일 업로드가 가능하다.
- 브라우저 AWS SDK를 사용하는 경우, 파일을 업로드하기 시작할 때, SDK를 다운로드하는 시간이 추가로 존재할 수 있다.
- NCP Object Storage로 파일을 업로드하는 경우, 진행창에 표시되는 진행률이 타 업로드 방식들에 비해 자연스럽지 않을 수 있다.
- 메타데이터도 업로드가 된다. 다만 값은 BASE64로 인코딩된다.