오류발생
이미지 변경 메서드에서 살리고싶은 이미지, 기존에 있던 이미지에서 삭제하고 싶은 이미지, 추가로 넣고싶은 이미지 전부 S3에 업로드 잘되고 반영이 잘되는데, 추가하고싶은 이미지가 없을때 빈이미지가 업로드 되는 현상이 발견
게시글 생성

이미지 수정

위에서 보이듯이 살리고 싶은 이미지는 남았고 지우고싶은 이미지도 지웠으나 이미지를 새로 삽입안했는데 빈url 이생성 되버리는 오류가 발생한다.
@Transactional
public BoardUpdateImageDto updateImages(Long userId,
Long id,
List<MultipartFile> imageList,
List<String> remainingImages) {
//유저 확인
User user = userService.findUser(userId);
//게시글 찾기
Board board = getBoardById(id);
//게시글 본인 확인
if (!board.getUser().equals(user)) {
throw new NotUserOfBoardException();
}
// 기존 BoardImages 삭제 (DB 및 S3에서)
List<BoardImages> existingImages = board.getImageUrls();
for (BoardImages boardImage : existingImages) {
if (!remainingImages.contains(boardImage.getImageUrl())) {
s3Service.deleteObject(s3Service.bucket, boardImage.getImageUrl()); // S3에서 이미지 삭제
}
}
//boardImages에 해당 보드 id를 가진 항목 삭제
boardImagesRepository.deleteByBoardId(id);
// 기존 이미지 이름을 유지하고, 새 이미지만 업로드
List<String> updatedImageList = new ArrayList<>(remainingImages);
for (MultipartFile image : imageList) {
String originalFileName = image.getOriginalFilename();
// 이미 존재하는 파일 이름을 유지
if (!updatedImageList.contains(originalFileName)) {
String newImageUrl = s3Service.uploadImageToS3(image, s3Service.bucket);
updatedImageList.add(newImageUrl);
}
}
// BoardImages로 변환 후 저장
List<BoardImages> newBoardImages = updatedImageList.stream()
.map(imageUrl -> new BoardImages(imageUrl, board)) // 필요한 경우 추가 필드 설정
.toList();
//게시글 수정
boardImagesRepository.saveAll(newBoardImages);
//responseDto 반환
return new BoardUpdateImageDto(updatedImageList);
}
오류 원인
- 빈 MultipartFile 객체 포함: imageList가 비어 있지 않더라도, 리스트 안에 내용이 없는 MultipartFile 객체가 포함될 수 있습니다. 즉, 파일 데이터가 없는데도 MultipartFile 객체는 존재하는 경우
- S3 업로드 메서드의 처리 방식: S3 업로드 메서드가 빈 파일이나 null 파일에 대해 URL을 반환하는 방식으로 구현되어 있다면, 빈 URL이 생성될 수 있습니다. 예를 들어, 파일이 없는 경우라도 기본적으로 URL 형식의 문자열을 반환하도록 구현되어 있다면 빈 URL이 추가될 수 있다.
해결
for (MultipartFile image : imageList) {
String originalFileName = image.getOriginalFilename();
if (!image.isEmpty()) {
// 이미 존재하는 파일 이름을 유지
if (!updatedImageList.contains(originalFileName)) {
String newImageUrl = s3Service.uploadImageToS3(image, s3Service.bucket);
updatedImageList.add(newImageUrl);
}
}
}
조건부에 빈칸이 아닐때만 업로드가 이루어지도록 하여 새로추가하고싶은 이미지가 없을때는 그냥 넘어가도록 설정하여 해결하였다

삽입 이미지가 없어도 빈 url 이 생성되지 않는다.
'java 배우기 > TIL' 카테고리의 다른 글
| 게시물 검색 최적화 작업 1 (기본 검색기능 구현) (0) | 2024.11.07 |
|---|---|
| 뉴스피드 구현 전에 알아보기 (5) | 2024.11.04 |
| S3 사용하면서 RequestPart 로 인한 에러 (0) | 2024.10.24 |
| 게시판 사진등록에 S3 써보기 (0) | 2024.10.24 |
| 게시글 조회시 페이지 사용할때 생기는 경고 문구 (0) | 2024.10.23 |