댓글 기능 생성 중 무한참조에 대해 고민하게 되었습니다. DB구조상 Board를 Select하면 Reply도 함께 Eager전략으로 불러오는데, Reply에서 다시 Board를 불러오는 구조로 형성되어 있었습니다.

public class Board {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false, length = 100)
    private String title;

    @Lob
    private String content;
    private int count;

    @ManyToOne(fetch = FetchType.EAGER) // board (N) : user (1)
    @JoinColumn(name = "userId")
    private User user; 

    @OneToMany(mappedBy = "board", fetch = FetchType.EAGER) 
    private List<Reply> replies;

    @CreationTimestamp
    private Timestamp createDate;
}
public class Reply {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(nullable = false, length = 200)
    private String content;

    @ManyToOne
    @JoinColumn(name = "boardId")
    private Board board;

    @ManyToOne
    @JoinColumn(name = "userId")
    private User user;

    @CreationTimestamp
    private Timestamp createDate;

}

Board 정보를 불러오는 테스트 요청과 응답을 생성하고 테스트해보면

@GetMapping("/reply/board/{id}")
public Board replyTest(@PathVariable int id){
    return boardRepository.findById(id).get();
}

이렇게 무한참조가 발생하여 스택오버플로우가 발생하는 것을 확인할 수 있습니다.

Untitled


@JsonIgnoreProperties어노테이션을 사용하여 무한 참조를 방지해줍니다.

@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
@JsonIgnoreProperties({"board"})
private List<Reply> replies;

이제 Reply에서 Board를 호출해야하는 경우 무시해버립니다.