본문 바로가기

공부/트러블슈팅

[Spring] Could not write JSON: Infinite recursion (StackOverflowError)

짧게 짤라놨지만.. 오류가 정~~~말 길게 나온다.

 

으악 이거 뜨면 좀 멘붕이다. 왜냐면 오류난 로그를 올리면 진짜 끝도 없이 계~~속 올라가야 한다.

이 에러의 이유는!!

바로 재귀 호출이다. 내 프로젝트에서 발생한 이유는 다음과 같다.

나는 카드 Entity와 댓글Entity 를 연관관계를 맺어 사용하고 있엇다.

카드 1 : N 댓글의 관계를 맺었다.

따라서

댓글 클래스에는 Card 필드를 ManyToOne으로 가지고 있다. 외래 키의 주인은 댓글!

public class Comment extends Time{

	...
    // 카드 하나에 여러 댓글을 달아야 하니까 N의 관계
    @ManyToOne
    @JoinColumn(name = "card_id")
    private Card card;
    ...

카드 클래스에는 댓글이 List형식으로 필드로 갖는다. 

public class Card extends Time{

	...
    @OneToMany(mappedBy = "card")
    private List<Comment> comments = new ArrayList<>();
 	...

이떄 카드 Entity를 ResponseDto에 담아서 보낼 떄, 저 오류가 발생했다.

그 이유는 응답시 카드에서 댓글을 참조 한다.(JSON화 시켜야 하므로 참조해야함) 그런데 댓글에도 카드 필드가 있으므로 다시 카드 를 참조한다. 그럼 다시 카드는 댓글을 참조하고..... 이걸 무한반복하게 된다!

따라서 무한재귀에 빠져버리기 때문에 에러가 발생한다.

 

[해결방법]

내 프로젝트에서는 댓글을 따로 응답하지 않는다. 댓글은 카드에 종속 되어 있기 때문에 댓글을 작성해도 결국 카드로 응답을 한다. 따라서 댓글 클래스가 갖는 Card는 어떤 Card에 종속될지만 정해주기 위해 존재한다. 따라서 댓글클래스의 Card 필드를 JSON으로 변환시키지 않으면 된다!

    @ManyToOne
    @JoinColumn(name = "card_id")
    @JsonIgnore
    private Card card;

@JsonIgnore 어노테이션을 달아주며 해결!