댓글기능을 만들고나서 착실히 브랜치에 풀리퀘스트도 걸고,
팀원분들이 만들어놓은 게시판 기능들도 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
를 붙여주면
와 ! 정상작동한다!
다음 삽질 게시물에서 .. 봅시다