연관된 엔티티 간의 순환 참조로 인해 무한 재귀 호출이 발생할 수 있다.
예를 들어
public class Article {
@ManyToOne(fetch = FetchType.LAZY)
private Member author;
private String title;
private String body;
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<ArticleComment> comments = new ArrayList<>();
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<ArticleTag> tags = new ArrayList<>();
Article의 toString 메서드를 호출하면 Member와 ArticleComment의 toString도 호출되고 ArticleComment의 toString에서 Member의 toString이 또 호출된다.
이런식으로 서로가 서로를 참조하면서 무한 재귀 호출이 발생할 수 있다.
이러한 문제를 해결하기 위해 롬복의 @ToString.Exclude 어노테이션을 사용한다.
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
@ToString.Exclude
private List<ArticleComment> comments = new ArrayList<>();
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
@ToString.Exclude
private List<ArticleTag> tags = new ArrayList<>();