개발꿀팁
AWS SDK V1 or V2 개발자 가이드, s3영상 업로드 / 삭제
최근 영상관련 서비스를 준비하면서 aws의 s3를 많이 사용한다. 관련해서 몇가지 새로 알게된 내용이나 관련된 글을 작성해볼려고 한다.
s3관련해서 기능 구현을 하는데 어떤 글에서는 com.amazonaws를 사용하고 다른 글에서는 software.amazon.awssdk를 사용하여 의존성을 주입하는 것을 확인할 수 있다. 공식문서를 찾아보니 com.amazonaws는 v1, software.amazon.awssdk는 v2로 구분되어 있고 샘플코드도 잘 정리되어 있었다
v1과 v2에 차이점에 대해 찾아보니 고수준 라이브러리는 버전 v2에서 아직 사용할 수 없다고 나온다. 처음에는 이 말만 듣고 v1이 안정적이겠다 생각해서 v1으로 구현했다가 이후에 v2로 변경하였다. 내가 사용하는 기능들은 그렇게 고수준의 라이브러리도 아니고 장기적인 관점에서 v1이 지원이 종료될 수도 있기 때문이다. 또한 v1과 v2를 같이 사용할 수도 있어 최종적으로는 v2를 사용하는 게 좋을 것 같다는 판단을 했다
아래에서 v1과 v2의 차이점은 공식문서에 정리가 잘 되어 있으니 링크로 대신하고
v2로 내가 사용했던 객체 업로드, 복사, 삭제 코드를 작성해볼려고한다.
1. AWS SDK for Java 1.x vs 2.x
1. 새로워진 내용
2. AWS SDK for Java 1.x와 2.x의 차이점
2. v2객체작업
dependency
implementation "software.amazon.awssdk:s3:2.13.0"
v2에 해당하는 dependency 추가
s3Config
@Configuration
public class s3Config {
@Value("${cloud.aws.credentials.accessKey}")
private String accessKey;
@Value("${cloud.aws.credentials.secretKey}")
private String secretKey;
@Value("${cloud.aws.region.static}")
private String region;
@Bean
public S3Client s3Client() { // 자격 증명
AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey);
return S3Client.builder()
.region(Region.of(region))
.credentialsProvider(StaticCredentialsProvider.create(credentials))
.build();
}
- 액세스키, 시크릿키, 리젼은 yml에서 가지고 왔다
- 자격증명은 임시 자격 증명을 사용했는데 임시자격증명은 단기로 사용할 수 있는 자격 증명이다. 만료기간이 정해져 있어 만료 이후에는 어떤 종류의 액세스도 허용되지 않는다. 필요한 시점에서 바로바로 생성해서 활용하고 이후 필요에 따라 재 발급도 가능하다. 그래서 임시 자격 증명은 보안이 뛰어나다고 한다.
- 자격증명에 대해서는 다른 분이 잘 정리해주신 포스팅이 있어 링크 남깁니다!
S3Uploader
@Component
@RequiredArgsConstructor
public class S3Uploader {
private final S3Client s3Client;
private final S3Presigner presigner;
@Value("${cloud.aws.s3.bucket}")
private String BUCKET_NAME;
/**
* s3 업로드
* @param multipartFile multipartFile
* @param fileName fileName
*/
public void upload(MultipartFile multipartFile, String fileName) {
try {
PutObjectRequest objectRequest = PutObjectRequest.builder()
.bucket(BUCKET_NAME)
.key(fileName)
.contentType(multipartFile.getContentType())
.contentLength(multipartFile.getSize())
.build();
s3Client.putObject(putObjectRequest, RequestBody.fromBytes(multipartFile.getBytes())); // s3에 업로드
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 객체복사
* @param objectPath 복제대상
* @param renewObjectPath 변경할 객체주소
*/
public void copyBucketObject(String objectPath, String renewObjectPath) {
CopyObjectRequest copyReq = CopyObjectRequest.builder()
.sourceBucket(BUCKET_NAME)
.sourceKey(objectPath)
.destinationBucket(BUCKET_NAME)
.destinationKey(renewObjectPath)
.build();
try {
s3Client.copyObject(copyReq);
} catch (S3Exception e) {
e.printStackTrace();
}
}
/**
* 단일 객체 삭제
* @param objectPath objectPath
*/
public void deleteObject(String objectPath) {
try {
DeleteObjectRequest deleteObjectRequest = DeleteObjectRequest.builder()
.bucket(BUCKET_NAME)
.key(objectPath)
.build();
s3Client.deleteObject(deleteObjectRequest);
} catch (AwsServiceException | SdkClientException e) {
e.printStackTrace();
}
}
/**
* 다중객체 삭제
* @param objectsPath s3 폴더 경로
*/
public void deleteObjects(String objectsPath) {
try {
ListObjectsRequest listObjects = ListObjectsRequest
.builder()
.bucket(BUCKET_NAME)
.prefix(objectsPath) // 해당 폴더의 key값(s3는 폴더의 개념이 없지만 간편하게 폴더라 지칭함)
.build();
ListObjectsResponse res = s3Client.listObjects(listObjects);
List<S3Object> objects = res.contents();
for (S3Object object : objects) { // v1은 다중객체를 한번에 삭제할 수 있지만 v2에는 제공하고 있지 않아 for문으로 삭제해주었다
deleteObject(object.key());
}
} catch (AwsServiceException | SdkClientException e) {
e.printStackTrace();
}
}
}
- 해당 기능들은 특별한 내용 없이 공식문서의 샘플코드를 구현하였다.
- 기타 다른 기능의 샘플코드나 자세한 내용을 AWS의 매뉴얼을 참고하면 좋다.
- Controller나 Service는 따로 작성하지 않으려 한다.
3. 정리 및 느낀점
- 꽤 오래전에 작성한 부분인데 미루고 미루다 이제야 정리하고 작성하게 되었다. 과거 부트캠프에서 프로젝트할 때는 완성에 급급해 단순 복붙으로 구현했었는데 눈이 트이고 나니 조금씩 더 보이기 시작한다.(알고쓰냐 모르고 쓰냐의 차이) 알아가는 성취감이 기분이 꽤 좋다. 살짝 무릎을 탁! 치게 되는 느낌!
- 구분해서 작성하고 싶어 단순 기능만 정리해 봤는데 다음에는 멀티파트 업로드와 미리서명된 url에 대해서도 정리해보려고 한다. 성능과 보안을 위해 고민하다 보니 나도 단계적으로 알게 되었기 때문!
< References >
https://docs.aws.amazon.com/ko_kr/credref/latest/refdocs/maint-policy.html
https://docs.aws.amazon.com/ko_kr/credref/latest/refdocs/version-support-matrix.html
https://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/home.html
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
Redis를 활용한 효율적인 조회수 관리 방법 (2) | 2024.01.04 |
---|---|
Java 'MultipartFile'에서 파일 이름 가져오기 문제와 해결방법, 유니코드 (0) | 2023.12.21 |
TeamCity로 CI/CD 적용하기 (0) | 2022.11.10 |
Docker 알아보기! Dockerfile 만들기, 이미지와 컨테이너 빌드하기 (1) | 2022.09.16 |
SpringBoot 슬랙 Slack알림보내기 ChatPostMessageRequest (0) | 2022.06.15 |