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
- 참조가 되는 뒷부분을 의미하며, 직렬화를 수행하지 않는다.


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