개발일지/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);
}​