반응형
amazonS3 클래스내 deleteObject 라는 메소드가 선언되어 있다. 그것으 활용해서 로직을 구현해보았다.
1️⃣ Problem 엔티티 내에서 해당 메소드 추가 ( DB 내에서 초기화 )
// 이미지 초기화
public void clearImages() {
this.imageUrl.clear();
}
해당하는 Problem의 DB 내에서 imageUrl을 초기화 해주는 로직이다. → AWS S3 내 에서 영향 X
2️⃣ S3Uploader 클래스 내 delete 로직 추가
// 이미지 삭제
public void delete(String imageUrl) {
try {
String fileName = extractKeyFromProblemUrl(imageUrl);
amazonS3.deleteObject(bucket, fileName); // S3 내 이미지 객체 제거.
log.info("S3에서 이미지 삭제 완료: {}", fileName);
} catch (Exception e) {
log.error("S3 이미지 삭제 실패: {}", imageUrl, e);
throw new S3Exception(S3ExceptionCode.S3_DELETE_FAILED);
}
}
// 문제 이미지 URL 가져오기
private String extractKeyFromProblemUrl(String fileUrl) {
// S3 주소 포맷 기준으로 잘라내기
return fileUrl.substring(fileUrl.indexOf("problem/"));
}
extarctKey~ 메소드로 problem/ 으로 시작하는 파일로부터 이미지 파일 URL 을 가져오는 로직을 만들어주고, 이에 delete 메소드내에서 사용을 해준다.
그래서 처음에 언급했던 amazonS3 클래스 내 deleteObject를 활용해서 지금 사용하고 있는 버킷과, 이미지 파일 URL을 가져와서 실행해주는 로직으로 구현을 하였다. ( 실패시, 커스텀 예외 처리 적용 )
3️⃣ ProblemService 적용
// 문제 수정 ( 관리자 )
@Transactional
public void modifyProblem(Long problemId, ProblemUpdateRequest request, MultipartFile newImage) {
Problem findProblem = problemDomainService.getProblem(problemId);
findProblem.update(
findProblem.getCreator(),
request.title(),
request.description(),
request.difficulty(),
request.memoryLimit(),
request.timeLimit(),
request.reference()
);
// 이미지 수정 처리
if (newImage != null && !newImage.isEmpty()) {
updateProblemImage(findProblem, newImage);
}
problemDomainService.updateCategoryAndSearchEngine(findProblem, request.categories());
}
// 문제 삭제 ( 관리자 )
@Transactional
public void removeProblem(Long problemId) {
Problem findProblem = problemDomainService.getProblem(problemId);
// 문제 이미지가 있으면 삭제
if (!findProblem.getImageUrl().isEmpty()) {
for(String fileUrl : findProblem.getImageUrl()) {
s3Uploader.delete(fileUrl); // <----- 적용
}
}
// Soft Delete
problemDomainService.removeProblem(findProblem);
}
S3Uploader에 선언된 메소드들을 활용해서, 서비스 로직에 적용한다. ( 수정, 삭제 )
// 이미지 수정
private void updateProblemImage(Problem problem, MultipartFile newImage) {
// 기존 이미지가 있다면 삭제 처리
if (!problem.getImageUrl().isEmpty()) {
for(String fileUrl : problem.getImageUrl()) {
s3Uploader.delete(fileUrl);
}
problem.clearImages();
}
String newImageUrl = uploadImageAfterTransaction(newImage, problem.getId());
problem.addImage(newImageUrl);
}

이렇게 로직을 추가하게 되면서, 이제 DB내에서 뿐만아니라 AWS S3 버킷 내에서도 파일이 수정되거나 삭제처리가 되는 것을 볼수 있었다.
반응형