스프링(Spring)

[JPA] Infinite Recursion

반응형

 

JPA Infinite Recursion

JPA를 활용하여 양방향 매핑을 선언했을 때 아래와 같은 에러가 발생할 수 있다.

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion

 

컨트롤러에서 JSON 형태로 값을 출력할 때, 타입 변환이 필요하다. 이때 변환해야하는 엔티티의 필드가 다른 엔티티와 매핑 관계로 연결되어있다면 참조를 진행한다. 그리고, 이 연결된 엔티티에서도 함께 연결된 기존의 엔티티를 다시 참조하게 되면서 Infinite Recursion에 빠지는 것이다.

 

따라서 이를 해결하기 위해선, 양방향 매핑을 선언한 필드에 직렬화와 관련된 어노테이션을 각각 선언해줘야 한다.

@JsonManagedReference // 추가한 부분
@OneToMany(mappedBy = "user")
private List<Post> posts = new ArrayList<>();
@JsonBackReference // 추가한 부분
@ManyToOne
private User user;
  • @JsonManagedReference : 정상적으로 직렬화를 수행하는 부분 → @OneToMany에 사용
  • @JsonBackReference : 직렬화를 수행하지 않는 부분 → @ManyToOne에 사용




반응형