개발일지/TIL
[230805] [파이널] 프로젝트 진행 (4)
ironprayer
2023. 8. 5. 19:09
S3 기능 구현
💬 아이디어 등록과 수정할 때 이미지를 S3에 업로드 및 삭제하는 기능이 필요했다. 내가 맡아서 S3를 사용하는 기능을 만들기 이전에 구현을 하기로 했다.
✔ S3 Config 코드
@Configuration
public class S3Config {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;
@Value("${cloud.aws.region.static}")
private String region;
@Bean
public AmazonS3Client amazonS3Client() {
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return (AmazonS3Client) AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}
✔ S3 Service 코드
@Service
@RequiredArgsConstructor
public class S3Service {
@Value("${cloud.aws.s3.bucket}")
private String bucket;
private final AmazonS3Client amazonS3Client;
public void delete(String filePath) {
try {
amazonS3Client.deleteObject(bucket, filePath);
} catch (SdkClientException ex) {
throw new FileWriteException(FileWriteErrorCode.S3_NOT_DELETE);
}
}
public void upload(String basePath, String fileName, MultipartFile multipartFile) {
ObjectMetadata metadata= getObjectMetadataOf(multipartFile);
String savePath = basePath + "/" + fileName;
try {
amazonS3Client.putObject(bucket, savePath, multipartFile.getInputStream(), metadata);
} catch (IOException | SdkClientException ex){
throw new FileWriteException(FileWriteErrorCode.S3_NOT_WRITE);
}
}
private ObjectMetadata getObjectMetadataOf(MultipartFile multipartFile){
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(multipartFile.getContentType());
objectMetadata.setContentLength(multipartFile.getSize());
return objectMetadata;
}
}
✔ S3 적용하면서 든 생각
💢 AmazonS3Client 클래스의 메서드에서 발생하는 예외들이 있다. 우리 로직과 별개로 생기는 외부 라이브러리 예외들을 어떻게 처리해 주는 것이 좋을까 문득 생각이 들었다.
✅ 외부 라이브러리에서 우리의 로직과 별개로 외부 요인에 의해서 발생하는 예외들이 있다. 이러한 예외들은 우리가 정의한 예외들로 변환을 해서 전달을 해줄 필요가 있는 것 같다. 우리가 해줄 수 있는 최소의 예방은 해줘야 하기 때문이다.
➡ deleteObject의 SdkClientException, AmazonServiceException
public void deleteObject(String bucketName, String key) throws SdkClientException, AmazonServiceException
➡ S3 서버 상태에 따라 실패가 일어날 수 있기 때문에 이 예외를 받아서 우리가 정의한 예외로 다시 던져줘봤다.try { amazonS3Client.deleteObject(bucket, filePath); } catch (SdkClientException ex) { throw new FileWriteException(FileWriteErrorCode.S3_NOT_DELETE); }