-
연관관계 사이의 무한 호출프로젝트/Trend-Pick 2023. 7. 11. 22:52
댓글 리스트를 출력하려고 했는데 무한 루프를 돌면서 쿼리가 계속해서 나가는 오류가 나왔다.
Post와 Comment 사이의 연관관계가 이렇게 맺어져있다.
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List<Comment> commentList = new ArrayList<>();
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post;
@GetMapping("/post/{postId}") // 3번의 게시글 하나 클릭해서 들어가는 것 public PostWithCommentDto createPost(@PathVariable ("postId") Long postId) { Post post = postService.findOne(postId); List<Comment> commentList = commentService.post_comment(postId); List<CommentDtoContent> commentDtoContents = commentList.stream() .map(c -> new CommentDtoContent(c.getContent())) .collect((Collectors.toList())); return new PostWithCommentDto(post, commentDtoContents); }
이 상태에서 게시글을 하나 클릭해서 들어가는 매핑을 하게 된다면 에러가 발생한다. 왜냐하면 post에서 comment를 호출할 때 comment에서 post를 호출하게 되고 이어서 post가 또 comment를 호출 하는 등 무한으로 호출되는 쿼리가 나가게 된다.
@JsonIgnore
@JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post;
@JsonIgnore을 One쪽에 넣어줌으로써 One쪽에서 Many를 호출하는 쿼리를 날리지 않게 변경해주었다.
이렇게 하게 된다면 위의 상황처럼 post가 commentlist를 호출하고 comment가 post를 호출하고 계속 반복 되는 무한 루프가 일어나지 않을 것이다.
@JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member like_member; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member picture_member; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member post_member;
물론 member와 다른 엔티티도 일대다 매핑이기 때문에 @JsonIgnore을 추가해서 서로 무한으로 조회되지 않도록 수정해두었다.
갑자기 오류가 발생해서 내가 코드를 잘못 설계했나? 하는 생각이 들어서 이전 포스팅을 찾아보면서 고민이 많았다.
오랜 시간동안 해결을 못했는데, 콘솔창에 뜬 오류 메시지를 바탕으로 검색을 해보니 @JsonIgnore을 알게 되어서 해결할 수 있었다.
처음에는 Post와 Comment에만 @JsonIgnore을 추가해 주었는데 되지 않아서 member와 관련된 연관관계 매핑에도 추가해주었더니 문제가 해결 되었다.
에러가 났을 때에는 에러 코드를 잘 읽는 것이 중요하고
무엇보다 인터넷 검색을 잘 활용하고 키워드를 잘 활용해서 올바른 searching을 하는 것이 개발에 있어서 엄청 중요하다는 것을 깨닫게 되었다.
'프로젝트 > Trend-Pick' 카테고리의 다른 글
AWS S3를 이용한 사진 저장 (0) 2023.07.31 자바 코드로 정렬 vs db에서 특정 값을 정렬해서 select (0) 2023.07.28 비어있을 수도 있는 객체의 조회 -> Optional 사용 (0) 2023.07.27 @RequestParam과 @RequestBody의 차이점 (0) 2023.07.22 로그인 세션으로 자동 CRUD (0) 2023.07.12