에러 내용
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를 사용하는 이유이기도 함.
'개발 > Spring' 카테고리의 다른 글
[스프링 캠프 2024] MSA 실전 가이드 (0) | 2024.05.26 |
---|---|
[스프링] 스프링 핵심원리 - 빈 생명주기 콜백 (0) | 2021.12.10 |
[스프링] 스프링 핵심원리 - 의존관계 자동주입 (0) | 2021.12.06 |
[스프링] 스프링 핵심원리 - 싱글톤 컨테이너 (0) | 2021.12.06 |
[스프링] 스프링 핵심원리 - 스프링 컨테이너와 빈 (0) | 2021.12.05 |
댓글