개발일지/2023_한이음

[spring boot] S3 게시판(이미지 처리) update 기능 완성

기억지기 개발자 2023. 8. 30. 10:58

🏕️상황

꽤나 긴 시간 동안 굉장히 여러 상황을 마주해서 하나하나 기억은 안 나지만 그래도 기억나는 거라도 작성해보록 하겠음.

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을 비교해서 새로운 데이터는 추가로직을 거치고, 삭제할 테이터는 삭제로직을 거친다."이다.

 

 

실제 post men - update 화면

 


💛느낀 점

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