본문 바로가기
개발/Spring

[JPA] 스프링부트 Could not write JSON: Infinite recursion 에러 해결

by 윤호 2021. 12. 31.

 

 

에러 내용

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.example.jpashopkotlin.domain.Member["orders"]->org.hibernate.collection.internal.PersistentBag[0]->com.example.jpashopkotlin.domain.Order["member"]->com.example.jpashopkotlin.domain.Member["orders"]->org.hibernate.collection.internal.PersistentBag[0]->com.example.jpashopkotlin.domain.Order["member"]->com.example.jpashopkotlin.domain.Member["orders"]->org.hibernate.collection.internal.PersistentBag[0]->com.example.jpashopkotlin.domain.Order["member"]->com.example.jpashopkotlin.domain.Member["orders"]->org.hibernate.collection.internal.PersistentBag[0]->

 

설명

Member 엔티티와 Order 엔티티간 연관관계가 있는데, Restcontroller에서  Member엔티티를 JSON으로 반환하는 과정에서 recursion 에러가 발생했다.

원인

Order엔티티에서 Fetch.Lazy를 적용해도 엔티티를 JSON으로 변경하는 중 serialize(직렬화) 과정을 거치는데, 이때 member에 order가 있으니까 order를 참조하고, order에 있는 member를 참조하면서 무한 재귀가 발생한다.

 

해결

방법1. 참조하는 엔티티에서 재귀를 일으키는 필드에 @JsonIgnore를 붙여준다.

방법2. RestController에서 엔티티를 바로 반환하지 않고, DTO를 사용한다.

-해당 에러는 엔티티를 바로 반환하지 않고 DTO를 사용하는 이유이기도 함.

댓글