HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)] with root cause - json 순환 참조 오류

RACOONMAN98·2022년 12월 21일
0

삽질일기

목록 보기
2/5
post-thumbnail

12-21일 삽질회고..

댓글기능을 만들고나서 착실히 브랜치에 풀리퀘스트도 걸고,

팀원분들이 만들어놓은 게시판 기능들도 Pull해서 댓글기능을 마무리하였는데,

혹시 내 로직이 팀원분코드에 안좋은 영향을끼칠까봐 로컬에서 몰래 테스트하려고 했었는데,

Json 순환참조가 일어나서 이 상황을 해결하는방법을 까먹기 전에 블로그에 남겨두려고 한다..

원인

  • JPA연관관계에서 양방향 매핑을 한경우에 발생한다.!
  • jacksonlib의 objectMapper 객체가 컨트롤러에서 JSON타입을 변환하는 도중에,
    변환되는 Entity(List<comment'>)의 필드가 다른 entity(post)를 참조(양방향),또 post는 List<comment'> 를 참조... 반복반복 StackOverFlow를 만난다 ..

빠르게 해결방법으로 넘어가보자

문제의 부분 보시겠습니다

Post.java

ㄴ>> 해당 Entity에서 양방향 관계는 List<Comment'>가 있다.

Comment.java

Comment Entity 에서도 Post와 연관관계를 가지고있다.

Controller
컨트롤러의 코드를 보게되면 여기서 문제가 발생하게된다.

해당 컨트롤러에는 @RestController어노테이션이 붙어있는데 이 어노테이션이 붙어있는 컨트롤러는 값을 반환하면 objectmapper가 값을 Json으로 변환시켜주는데 이 과정에서 순환참조가 발생하게되고 Stackoverflow가 발생하게된다.

그래서 해결방법이 뭐냐구요 !!!

양방향매핑을 한 두개의 필드에 어노테이션을 추가적으로 붙여주면된다.

  • @JsonManagedReference
    - 참조하는 앞부분에 해당하는 필드, 정상적인 json직렬화를 수행한다!
    - Collection 형태의 자료구조에 붙여주면 된다.
    -@JsonBackReference
    - 참조되는 뒷부분, json직렬화를 수행하지 않는다(순환참조하지말라고!!).

그래서 위 코드를 바꾸면
Post.java

Comment.java

를 붙여주면

와 ! 정상작동한다!

다음 삽질 게시물에서 .. 봅시다

profile
공부일기

0개의 댓글