엘라의 개발 스케치 Note
[TIL] 내일배움캠프 45일차(23.06.28.) - 과제 작성 중 문제 해결, JPA 1:N 관계에서 부모 엔티티를 삭제할 때 자식 엔티티도 삭제되게 만들기 본문
내일배움캠프/TIL
[TIL] 내일배움캠프 45일차(23.06.28.) - 과제 작성 중 문제 해결, JPA 1:N 관계에서 부모 엔티티를 삭제할 때 자식 엔티티도 삭제되게 만들기
엘라랑이 2023. 7. 11. 09:40To-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 확인 및 제출
- 알고리즘 공부