[JPA] 엔티티, JSON 변환 에러

KosMos·2023년 2월 14일
0

JPA 엔티티, JSON 변환 에러

  • org.springframework.http.converter.HttpMessageNotWritableException
  • Could not write JSON
  • Infinite recursion (StackOverflowError)
  • nested exception is com.fasterxml.jackson.databind.JsonMappingException

원인

  • JPA 연관관계에서 양방향 매핑을 선언한 경우 발생
  • Jackson lib 의 ObjectMapper 객체에 의해 컨트롤러 단에서 JSON 타입을 변환하는 도중에 변환되는 엔티티의 필드가 다른 엔티티를 참조하고 그 엔티티 클래스의 필드가 또 다른 엔티티를 참조하고 ... 무한루프

문제코드

UserMember 엔티티와 Account 엔티티는 서로 양방향 관계이다. (@ManyToOne 과 @OneToMany)
컨트롤러에서는 아래와 같이 반환하고 있다.

위와 같이 RestController 어노테이션을 붙인 컨트롤러에서 값을 반환하면 객체를 JSON 타입으로 ObjectMapper 가 변환시켜준다. 여기서 JSON 타입에 대한 무한루프문제가 발생하고 스택오버플로우가 뜬다. 이렇기 때문에 해당 문제를 해결하려면 양방향 매핑을 맺은 필드에 대해서 두 개의 어노테이션을 붙여야 한다.

해결

  • @JsonManagedReference
    • 참조가 되는 앞부분을 의미하며, 정상적으로 직렬화를 수행한다.
    • Collection Type 에 적용된다.
  • @JsonBackReference
    • 참조가 되는 뒷부분을 의미하며, 직렬화를 수행하지 않는다.

위와 같이 수행하면 정상적으로 문제를 해결할 수 있다. 추가적으로 아래의 링크를 참고하면 더 많은 내용을 확인할 수 있다.

0개의 댓글