이미지 업로드를 고민하며...

jungnoeun·2023년 2월 13일
0

kiri

목록 보기
11/13

게시글 관련 기능을 구현하면서, 이미지를 설정하는데 있어서 많은 고민을 했다.
바로 게시글이 수정될때마다 이미지 또한 수정되는 버전이 다르다는 것이 문제였다.
내가 생각하여 도출해낸 경우의 수는 다음과 같다.

게시물 삭제되는 경우를 고려하여...

경우 1
이미지 이미 존재 -> 다른 이미지로 대체

경우 2
이미지 없음 -> 이미지 새로 추가해서 게시물 저장

경우 3
이미지 이미 존재 -> 이미지는 수정 안함 -> 이미 저장되어 있던 거 보여줌

경우 4
이미지 존재 -> 이미지 삭제하고 싶음 -> 수정후 이미지 없음




게시글에서의 이미지 수정 방법들....

경우 1에서는
새로 등록하고 싶은 이미지의 id를 받아서 DB에서 조회하고, post와의 연관관계 (연관관계 편의 메서드)를 새로 설정해주고, 이미지의 s3의 url 리스트를 반환해주면 되었다.

경우 2는 1과 똑같이 수행하면 된다.

경우 3에서는 DB에 저장되어 있던 이미지의 s3의 url 리스트들을 반환해주면 되었다.

하지만 경우 4가 문제였다.
이미지는 이미지 존재하고 있었고, 이 게시물을 수정할때 따로 이미지를 삭제하는 api로 이미지를 삭제한 후 게시글을 수정하는 로직을 가진다.
하지만 이미지를 삭제하려 하니, image와 post는 이미 관계가 설정되어 있었고, image를 바로 삭제해주는 것은 불가능하였다.

그래서 post의 List<image> 에서 해당 이미지를 삭제해주고 이미지 자체를 삭제해주어야겠다고 생각하게 되었다.

그래서 image에 대한 로직이 실행되는 imageService에서 postRepository에서 image로 post 객체를 찾는 Optional<Post> findAllByImage(Image image); 를 이용해서 post를 찾고 , 아래와 같은 코드로 image를 지워주려고 하였다.

public void deleteImage(Image image) {
        this.imageList.remove(image);
    }

하지만 아래와 같은 에러가 발생을 하였고, querydsl로 더 구체적으로 sql문을 짜야 하나 생각을 했지만, 그전에 더 괜찮은 방법이 있을거라 생각해 더 도전해보았다.
failed to create query for method public abstract java.util.optional post.postrepository.findpostbyimage(com.ssu.kiri.image.image)! no property 'image' found for type 'post'

그리고 나서 나는 다음의 코드를 이용해서 image에 저장된 post를 불러오고, post의 imageList를 가져와서 거기에서 해당 이미지를 지워주도록 만들었다.

public void deleteImageInPost() {
        this.getPost().getImageList().remove(this);
    } 

실행 결과, 연관되어있는 psot와의 관계는 성공적으로 해제되었고, 해제된 후, image는 독립적으로 잘 삭제되었다.




느낀점

jpa의 연관관계는 코드를 짜면서 매우 편하다는 것을 느끼고 있었지만, 이렇게 명확하게 설정해주어야 하는 부분도 있다는 것을 다시 한번 깨달았다.
그리고 위에서 만든 image는 post와만 관계가 있지만, scrap 엔티티의 경우, member와 post 둘다와 관계를 맺고 있어, scrap을 취소하는 경우, scrap 객체만 삭제하는 것이 아니라, member의 List<scrap> 과 post의 List<scrap>에서 먼저 scrap과의 관게를 해제해준 후 scrap 객체 자체를 삭제해주어야 겠다고 생각했다.
얼른 수정하러 가야 겠다!!!

전체코드는 아래와 같다.

public void deleteUpdateImage(Long image_id) {

        Image image = imageRepository.findById(image_id)
                .orElseThrow(() -> new RuntimeException("삭제하려는 이미지를 찾을 수 없습니다."));

        // 이미지를 삭제하기 앞서 post 의 imageList 에서 삭제하려는 이미지를 remove해준다.
        image.deleteImageInPost();
        System.out.println("image.getPost().getImageList() = " + image.getPost().getImageList());

        String filepath = image.getFilepath();
        // S3에서 파일 삭제
        amazonS3.deleteObject(bucket, filepath);
        // DB에서 파일 정보 삭제
        imageRepository.delete(image);
    }




참고
https://velog.io/@jsb100800/spring-12#-%ED%99%9C%EC%9A%A9-%ED%85%8C%EC%9D%B4%EB%B8%94-%EA%B5%AC%EC%A1%B0
https://blog.naver.com/PostView.nhn?blogId=rorean&logNo=221466846173&parentCategoryNo=&categoryNo=18&viewDate=&isShowPopularPosts=true&from=search

profile
개발자

0개의 댓글