댓글 기능 생성 중 무한참조에 대해 고민하게 되었습니다. 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();
}
이렇게 무한참조가 발생하여 스택오버플로우가 발생하는 것을 확인할 수 있습니다.
@JsonIgnoreProperties
어노테이션을 사용하여 무한 참조를 방지해줍니다.
@OneToMany(mappedBy = "board", fetch = FetchType.EAGER)
@JsonIgnoreProperties({"board"})
private List<Reply> replies;
이제 Reply에서 Board를 호출해야하는 경우 무시해버립니다.