개발일지/2023_한이음
[spring boot] S3 게시판(이미지 처리) delete 기능 완성
기억지기 개발자
2023. 8. 29. 15:37
🏕️상황
처음에는 아래의 코드만 있으면 바로 삭제가 될 줄 알았다.
public void deleteFile(String fileName) {
DeleteObjectRequest request = new DeleteObjectRequest(bucket, fileName);
amazonS3Client.deleteObject(request);
}
- 그런데 나는 기존에 임시경로는 "temporary/"로 정식경로는 "final/"로 설정했기 때문에 이에 맞게 코드를 구성하려고 했다.
- 위의 코드는 루트 디렉터리 기준이고 나는 키(key) 구조를 활용해서 폴더 같은 형식으로 진행하고 싶었기 때문에 추가적인 코드 작업을 할 계획이었다. 하지만....
Amazon S3에서는 특정 폴더 내에 있는 파일을 삭제하기 위해 해당 폴더 내 모든 객체를 열거하고 각 객체를 하나씩 삭제해야 합니다. 따라서 반복문 없이는 특정 파일을 삭제하기가 어려울 수 있습니다.
라는 정보를 접하게 되었다.
게시글이 점점 많아지면 final이라는 객체의 키(폴더) 안에도 굉장히 많은 이미지들이 쌓일 텐데 그걸 일일이 다 꺼내서 삭제작업을 하는 것은 너무나 비효율적일 것이라는 판단을 하게 되었다.
그래서 정식경로는 루트 경로를 사용하기로 하였다. (폴더구조를 가지지 않는)

🗝️해결
아래의 코드는 완성된 코드이다.
굉장히 단순해 보이지만 생각보다 까다로웠다... 모두 나의 피땀눈물...
// imageService 클래스
// 게시글 삭제 메소드로, 게시글 + 그 안에 포함된 이미지들도 전부 삭제하는 메소드
@Transactional
public void deleteImages(Long boardId) {
List<Image> imageList = repository.findAllByBoardId(boardId);
for (Image image : imageList) {
String imageName = getImageNameFromUrl(image.getImageUrl());
deleteFile(imageName);
}
repository.deleteAllByBoardId(boardId);
}
public void deleteFile(String fileName) {
DeleteObjectRequest request = new DeleteObjectRequest(bucket, fileName);
amazonS3Client.deleteObject(request);
}
- boardId를 매개변수로 받아서 그 값을 가진 모든 레코드를 조회하고
- 그 중에서도 모든 필드가 아닌 imageUrl이라는 필드만 뽑아서 imageList에 저장하여
- 그 값을 s3에 있는 이미지들을 지워줄 메서드로 넘긴다.
- boardId를 매개변수로 받아서 그 boardId 값을 가진 필드들은 DB에서 다 삭제를 한다.
//boardService의 update 메소드.
// update
@Transactional
public List<BoardWithImageDTO> update(final BoardDTO dto) {
Board board = boardRepository.findById(dto.getId())
.orElseThrow(() -> new IllegalArgumentException("게시글이 존재하지 않습니다."));
validate(board);
board.updateBoard(dto);
imageService.updateImages(dto.getImageList(), dto.getId());
return getBoardList(board.getSchool().getId(), board.getCategory());
}
- 매개변수에 있는 BoardDTO에는 게시글 + 이미지 list들이 있다.
- dto 안에 들어있는 id로 게시글을 찾고, 없으면 예외처리
- 게시글에 대한 유효성 검사를 실시하고
- 게시글에 대한 update 메소드를 호출한다.
- dto에 담겨있던 이미지 리스트와 id 값을 이미지 update 쪽으로 넘긴다.