[JPA] toString 무한 재귀 호출 문제 해결 방법

이다혜·2023년 12월 14일

연관된 엔티티 간의 순환 참조로 인해 무한 재귀 호출이 발생할 수 있다.
예를 들어

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<>();

0개의 댓글