🏕️상황
꽤나 긴 시간 동안 굉장히 여러 상황을 마주해서 하나하나 기억은 안 나지만 그래도 기억나는 거라도 작성해보록 하겠음.
public void updateImages(List<String> newImageList, List<String> existingImageList) {
// 새로 추가된 이미지 찾기
List<String> addedImages = new ArrayList<>(newImageList);
addedImages.removeAll(existingImageList);
// 삭제된 이미지 찾기
List<String> deletedImages = new ArrayList<>(existingImageList);
deletedImages.removeAll(newImageList);
// 새 이미지 업로드 로직
for (String newImage : addedImages) {
// 이미지를 업로드하고 필요한 처리 수행
uploadImage(newImage);
}
// 삭제된 이미지 처리 로직
for (String deletedImage : deletedImages) {
// 이미지 삭제 및 데이터베이스 정보 삭제
deleteImage(deletedImage);
}
}
- 위의 코드가 기초가 되는, 기본이 되는 코드임. 이 코드의 논리에서 점점 더 파생되고 추가해서 최종 코드를 만들었다.
- 기존에 DB에 있는 내용이 existingImageList이고, 새로 요청을 보낸 데이터의 imageurl 부분이 newImageList이다.
- existingImageList과 newImageList 내부의 요소들을 비교하여 이미지를 추가시킬지, 삭제시킬지 정한다.
🔜과정
새로운 이미지를 추가하여 update 요청을 하면 기존에 이미지는 그대로 남아있고, 새로운 이미지만 '추가' 되어야 하는데
기존에 있던 이미지는 지워버리고 새로운 이미지만 저장이 되었다😂😂😂

원인 : 이미지를 추가하는 로직은 정상적으로 작동했는데, 그 아래에 있던 이미지를 삭제하는 부분에서 의도대로 작동하지 않아 쓸데없는 삭제과정이 발생한 것이었다. 하지만 난 이 원인을 발견하기까지 몇 시간은 걸린 거 같다....
🗝️해결
// imageService 클래스의 함수 중 하나
@Transactional
public void updateImages(List<String> newImageList, Long boardId) {
try {
List<Image> imageList = repository.findAllByBoardId(boardId);
List<String> existingImageList = imageList.stream()
.map(image -> getImageNameFromUrl(image.getImageUrl()))
.collect(Collectors.toList());
List<String> addedImages = new ArrayList<>();
List<String> deletedImages = new ArrayList<>();
// 새로 추가된 이미지와 삭제된 이미지 찾기
for (String imageUrl : newImageList) {
String imageName = getImageNameFromUrl(imageUrl);
if (!existingImageList.contains(imageName)) {
addedImages.add(imageName);
}
}
for (String existingImage : existingImageList) {
String imageName = getImageNameFromUrl(existingImage);
boolean shouldDelete = true;
for (String newImage : newImageList) {
if (getImageNameFromUrl(newImage).equals(imageName)) {
shouldDelete = false;
break;
}
}
if (shouldDelete) {
deletedImages.add(imageName);
}
}
// 추가된 이미지 업로드 로직
moveImagesToFinalLocation(addedImages, boardId);
// 삭제된 이미지 처리 로직
if (!addedImages.containsAll(deletedImages)) {
deleteImagesForUpdate(deletedImages, boardId);
}
} catch (Exception e) {
e.printStackTrace();
}
}
🔜이 코드를 한줄요약 하자면 "새로 들어온 url과 기존 db에 있는 url을 비교해서 새로운 데이터는 추가로직을 거치고, 삭제할 테이터는 삭제로직을 거친다."이다.

💛느낀 점
- 이번에는 내용이 update다 보니 테스트를 진행하기가 좀 번거로웠다... 놀랍게도 나는 아직 test 코드를 잘 작성할 줄 모르고, 사용을 안 한다. 정확히 어떤 이점이 있는지 모르지만 확실히 test 코드를 작성하면 이 보다는 편하지 않을까... 싶었다.
- 이 이미지 작업 CRUD를 완전히 끝내기까지 거의 1달...? 이 걸린 거 같다.
물론 모든 시간을 24시간 동안 여기에 쏟아부은 건 아니지만 프런트 팀원이 느끼기에는 너무 느린 시간인 거 같아서 뭔가 미안하기도 했고, 내 실력에 대해서 자괴감이 드는.... 과정이었다. - 물론 많이 더디기는 해도 끝까지 물고 늘어져서 깔끔하게 성공시킨(중간에 대충 넘어갈까... 하는 충동도 느꼈다) 코드이기 때문에 엄청나게 뿌듯하고 애착이 간다.
- 그리고 이 과정이 남들이 보기에 그렇게까지 어려운 작업이 아닌 것처럼 보일 수 있다.... 그런데 시간을 오래 까먹은 게 스스로에 대해 의심을 들게 만들었다.

'개발일지 > 2023_한이음' 카테고리의 다른 글
[aws] ec2 build - 오류 100개 발생 (⭐중요한 팁 포함) (0) | 2023.09.01 |
---|---|
[spring boot] branch merge시 대충돌 (0) | 2023.08.31 |
[spring boot] S3 게시판(이미지 처리) delete 기능 완성 (0) | 2023.08.29 |
[post men] 415 error - Content-Type (0) | 2023.08.27 |
[spring boot] S3 이미지 처리_업로드 구조 변경(api 분리) (0) | 2023.08.26 |