작업 도중 S3에 데이터를 올려줄 때, 해당 문서의 확장자를 알고 싶은데, 저장 시에는 이름을 uuid 형태로 이름을 변경해 저장해 key로는 알 수 없는 상태였다. 기존 서비스라면 가능할 수 있지만 다른 서비스에서 해당문서를 다운로드 했을 때, 해당 확장자에 대한 정보를 알 수가 없는 상황이었다.
그럼 이제 업로드 할 때, 메타데이터를 이용하자 라는 생각을 하게 되었다.
기존 업로드 방식은 단순히 File, BucketName, Key 를 이용한 데이터 저장이었다.
BasicAWSCredentials awsCredentials = new BasicAWSCredentials("your-access-key", "your-secret-key");
AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
.withRegion(Regions.AP_NORTHEAST_2)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
// 객체 업로드
s3Client.putObject(ucketName, keyName, new File(filePath)));
업로드를 할 때, PutObjectRequest 객체를 이용해서 요청을 전달하는 것으로 변경하고, 해당 Request에 메타데이터를 포함시켰다.
///기존과 s3Client는 동일
// 메타데이터 설정
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata("custom-key", "custom-value");
// PutObjectRequest 생성
PutObjectRequest request = new PutObjectRequest(bucketName, keyName, new File(filePath));
request.setMetadata(metadata);
// 객체 업로드
s3Client.putObject(request);
위와 같은 방식으로 내가 원하는 메타데이터 값을 넣어 저장하였다.
현재 aws sdk 2.0 버전에서 메타데이터 확인 방식이 기존과 변경 되었다. ObjectMetaData 클래스가 삭제가 되었기 때문에 Map형태로 데이터를 전달받아 처리한다.
// 메타데이터 가져오기
HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
.bucket(sourceBucketName)
.key(sourceKey)
.build();
HeadObjectResponse headObjectResponse = s3.headObject(headObjectRequest);
// 메타데이터 파싱
Map<String, String> metaData = new HashMap<>(headObjectResponse.metadata());
위와 같은형태로 metaData를 가져올 수 있으며, 이를 활용하여 메타데이터 기준으로 이후 작업을 처리할 수 있었다.