ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 연관관계 사이의 무한 호출
    프로젝트/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을 하는 것이 개발에 있어서 엄청 중요하다는 것을 깨닫게 되었다.

Designed by Tistory.