현재 내 프로젝트에서는 AWS S3 를 이용하여 image를 업로드 하였다.
이에 대해 코드가 굉장히 더러웠고, 패키지간 의존성이 분리가 안되어 이번 기회에 리팩토링을 진행하게 되었다.
aws 버킷 설정법은 넘어갈 생각이다. 이는 이미 앞서 구현을 했기 때문이다.
기존에는 S3의 access key와 secret key 를 aws의 secret manager를 이용하여 관리를 했었다. 이를 지웠기 때문에 환경 변수를 주입하는 방식으로 바꾸었다.
간단히 말하자면 enjoytrip-aws.env
export S3_ACCESS_KEY 1234
export S3_SECRET_KEY 2345
~./zshrc 파일에 저장해놓고, source ~/.zshrc 명령어를 이용하면, 간단히 환경 변수 주입이 완료된다.
그전에 .gitignore를 통해 관리하다가 잘못올려서 사망할 뻔한 적이 있었기 때문에 다음과 같은 방식으로 바꾸게 되었다.
현재 파일 업로드를 담당하는 media 패키지와 일반적인 것들을 다루는 global 패키지가 존재한다.
즉, 외부 서비스는 transaction과 분리 되어야 한다. 커넥션을 외부 서비스 때문에 많이 먹고 있으면 안되기 때문이다. 따라서, 서비스를 분리하고, 이를 진행시켜 주는 mediaService 를 만들었다.
fileService에서는 fileUrl을 저장하고 transaction을 먹고 있고, uploadService는 이미지를 업로드 하는 서비스로 transaction을 먹고 있지 않는다.
또한, fileService 에서 fileUrl이 실패될 경우에는 uploadService에서 올렸던 이를 복구하는 로직 또한 작성하였다.
private final FileService fileService;
private final UploadService uploadService;
public void insertMedias(
final Long boardId,
final List<MultipartFile> imageFiles,
final String folderName
) {
final List<String> fileUrls = uploadService.uploadMedias(imageFiles, folderName)
.stream()
.map(FileUrlResponse::getUrl)
.collect(Collectors.toList());
try {
fileService.insertFile(boardId, fileUrls);
} catch (final Exception e) {
uploadService.deleteMedias(fileUrls);
throw new MediaException("파일 업로드에 실패했습니다.");
}
}