Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

엘라의 개발 스케치 Note

[TIL] 내일배움캠프 45일차(23.06.28.) - 과제 작성 중 문제 해결, JPA 1:N 관계에서 부모 엔티티를 삭제할 때 자식 엔티티도 삭제되게 만들기 본문

내일배움캠프/TIL

[TIL] 내일배움캠프 45일차(23.06.28.) - 과제 작성 중 문제 해결, JPA 1:N 관계에서 부모 엔티티를 삭제할 때 자식 엔티티도 삭제되게 만들기

엘라랑이 2023. 7. 11. 09:40

To-do

  • 알고리즘 공부 및 그룹스터디
  • 스프링 보충 강의
  • 스프링 개인과제 lv.2 확인 및 제출
  • 스프링 개인과제 lv.3 작성

 

TIL

  • 선택한 게시글과 함께 모든 댓글 조회하기
? 선택한 게시글과 함께 관련된 모든 댓글을 ResponseBody에 반환해야하는데 어떤식으로 반환하는게 좋을지 고민이 많았음
Try 1. Dto를 하나로 합쳐서 만들기 위해 시도 -> 이미 만들어진 게시글과 댓글 dto가 있는데 반복을 위해 하나 더 만드는 것은 중복된 코드를 하나 더 만든다는 생각이 들어 다른 방법을 고민함
! Try 2. 서비스 단에서 해당 게시글에 대한 댓글을 List<CommentResponseDto>로 담은 뒤 List<Object>를 만들어 해당 게시글(PostResponseDto)과 댓글들(List<CommentResponseDto>)을 Response 하는 것으로 처리함
// 1. 선택한 게시글에 대한 댓글 전체 조회
    public List<CommentResponseDto> getCommentsByPostId(Long postId) {
	    return commentRepository.findAllByPostOrderByCreatedAtDesc(findPost(postId)).stream().map(CommentResponseDto::new).toList();
    }
    
    
// 2. 선택한 게시글 및 댓글 조회
    public List<Object> getPostById(Long id) {
        List<Object> postAndComments = new ArrayList<>();
        postAndComments.add(new PostResponseDto(findPost(id)));
        postAndComments.add(commentService.getCommentsByPostId(id));
        return postAndComments;
    }

 

  • 전체 게시글과 함께 모든 댓글 조회하기
? 선택한 게시글과 모든 댓글을 조회하는 것을 해결하고 나니 전체 게시글 및 댓글 목록 조회를 게시글 별로 어떤 식으로 반환하는게 좋을지 고민이 생겼음
! Try. List(전체 조회) 안에 List(선택한 게시글 조회에서 만든 List)를 넣고 for문으로 선택한 게시글 리스트를 반복해서 리스트에 담는 방식으로 해결
    // 전체 게시글 및 댓글 목록 조회
    public List<List<Object>> getPosts() {
        List<Post> postList = postRepository.findAllByOrderByCreatedAtDesc();

        List<List<Object>> postAndCommentsList = new ArrayList<>();

        for (int i = 0; i < postList.size(); i++) {
            postAndCommentsList.add(getPostById(postList.get(i).getId()));
        }
        return postAndCommentsList;
    }

 

  • JPA 1:N 관계에서 부모 엔티티를 삭제할 때 자식 엔티티도 삭제되게 만들기
? 게시글 삭제 시 관련 댓글이 함께 삭제되도록 만들고자 함
방법1. CascadeType.REMOVE
방법2. orphanRemoval = true
- 방법 1, 2 모두 부모 엔티티를 삭제하면 자식 엔티티도 삭제한다.
- 부모 엔티티에서 자식 엔티티를 제거할 경우, CascadeType.REMOVE는 자식 엔티티가 그대로 남아있는 반면, orphanRemoval = true는 자식 엔티티를 제거한다.
- 자식 엔티티에 두 개의 부모 엔티티가 있는 경우, 위의 방법 1, 2 사용을 조심해야 한다. 자식 엔티티를 삭제할 상황이 아닌데도 어느 한쪽의 부모 엔티티를 삭제했거나 부모 엔티티로부터 제거됐다고 자식이 삭제되는 잘못된 상황이 생길 수 있다...
- @OneToMany에서 사용 시 주의하고, @ManyToMany에서는 사용을 지양하기
! 게시글 삭제 시 관련 댓글은 모두 사라져야하고, 부모 엔티티에서 자식 엔티티를 제거할 경우의 수가 존재하지 않아 해당 문제에서는 두 방법이 크게 차이가 없다고 판단함 -> 고아 객체를 모두 삭제하는 orphanRemoval = true를 선택해 사용
=> 두 방법의 중점이 다르고, 수행하는 동작도 다르기 때문에 다음 사용 시에는 목적에 조금 더 적합한 방법을 고를 수 있도록  공부가 필요함!

 

Next...

  • 개인과제 lv.3 확인 및 제출
  • 알고리즘 공부
Comments