[NCloud] Spring에 Object Storage 파일업로드 Api 적용
쇼핑몰 개인프로젝트를 구현하려면 파일업로드가 많은데, 일일히 콘솔에 이미지를 업로드해서 버켓에 저장을 할순 없다.
그래서 Rest요청을 보내 파일을 저장하려고 한다.
따라서 AWS S3에서 제공하는 Java용 SDK를 이용해 네이버 클라우드 플랫폼의 Object Storage를 사용해보자.
dependencies {
//클라우드 사용 의존성
implementation platform('software.amazon.awssdk:bom:2.20.56')
implementation 'software.amazon.awssdk:s3:'
implementation 'software.amazon.awssdk:sso'
implementation 'software.amazon.awssdk:ssooidc'
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.13'
}
먼저 build.gradle에 의존성을 추가시켜줬다. 그리고 S3Config라는 클래스를 만들어 설정정보를 따로 빼줬다.
public class S3Config {
private String endPoint = "https://kr.object.ncloudstorage.com";
final String regionName = "kr-standard"; //region
final String accessKey = ""; // 버켓의 접근키
final String secretKey = ""; // NCP의 시크릿키
private String bucketName = "clozet"; //버켓 이름
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
}
프로젝트에서 프론트에서 파일업로드를 하면 axios 요청을 보내 서버에서 파일데이터를 받아 Rest요청을 하려고한다.
버킷에 저장하고 해당파일의 Url을 리턴받아 프론트에 넘겨줄것이다.
public String tempFileUpload(MultipartFile multipartFile) throws IOException {
// axios로 받은 file의 정보를 사용해 NCP의 Object Storage에 저장
String originalFilename = multipartFile.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());
s3Config.getS3().putObject(s3Config.getBucketName(), originalFilename, multipartFile.getInputStream(), metadata);
setObjectACL(s3Config.getBucketName(), originalFilename); // 저장하고 Access 권한까지 업데이트 해줘야함
return s3Config.getS3().getUrl(s3Config.getBucketName(), originalFilename).toString();
}
Access 권한을 설정해주지 않으면 이미지에 접근이 불가하다. ACL의 설정을 변경해줘 업로드한 파일의 접근권한을 설정하자.
- Access Control List (ACL)·접근 제어 목록
- 특정 객체 또는 버킷에 대한 접근이 허가된 주체들과 이들 주체가 허가받은 접근 항목이 기록된 목록
public void setObjectACL(String bucketName,String objectName){
try {
// 현재 ACL의 정보를 가져온다
AccessControlList accessControlList = s3Config.getS3().getObjectAcl(bucketName, objectName);
// 읽기권한을 모든 유저에게 줌
accessControlList.grantPermission(GroupGrantee.AllUsers, Permission.Read);
//설정을 버킷에 적용시킨다.
s3Config.getS3().setObjectAcl(bucketName, objectName, accessControlList);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
}
Rest 요청을 보낸 파일들이다. 성공적으로 버킷에 저장된 모습이다.
전부터 아마존 S3를 사용해보고싶었는데 비슷한 서비스인 Object Storage를 이용해봤다.
확실히 로컬에 파일을 저장하는것보다 접근성이 좋은것 같다. 아래문서를 참고하여 코드를 작성했다.
네이버 클라우드 플랫폼의 Object Storage의 공식문서이다.
https://guide.ncloud-docs.com/docs/storage-storage-6-1
Object Storage 개요
guide.ncloud-docs.com
https://guide.ncloud-docs.com/docs/storage-storage-8-1
Java용 AWS SDK
guide.ncloud-docs.com