Spring boot + JPA 사용중 무한재귀(recursion infinite loop) 방지로 @JsonIdentityInfo 사용하신분 계신가요??

2,230 views
Skip to first unread message

SungKyung Kim

unread,
Dec 17, 2015, 9:36:39 PM12/17/15
to Korea Spring User Group Q&A
안녕하세요 

현재 Spring boot + JPA 를 사용해보려고 이것저것 하고 있는데... 

많은분들이 경험하셨던 것처럼 저도 무한재귀 현상을 겪었습니다.

물론 무한재귀를 해결하는 방법은 간단하게  cycle 을 끊어버리면 되지만 (@JsonIgnore 를 사용한다던가 뭐..)

@OneToMany , @ManyToOne 같은 양방향 상황에서 

어느쪽에서 요청하든 값을 가져와야 하는... 그런 짜증나는 상황이 발생하게 된겁니다... 

예를들어서.... 

BBS 테이블이 있고 Tail 이 있는데 말 그대로 게시판과 댓글 테이블입니다. 

1개의 게시글에는 N 개의 댓글이 달릴 수 있는 그런 1:N 관계형 테이블인거죠 

JPA 객체로 본다면 BBS 객체를 조회하면 Tail 배열을 갖고올 수 있어야 하고 , Tail 객체를 조회하면 해당 댓글이 포함된 BBS(게시글) 객체를 갖고올 수 있어야 하죠 

Bi-directional 으로 값을 갖고와야 하는데... Json 은 이럴경우 객체 양쪽에 참조가 있으니까 무한재귀를 타게됩니다. 

무한재귀를 @JsonIgnore 또는 @JsonManagedReference, @JsonBackReference 를 사용해서 끊을 수 있겠지만 

이건 말 그대로 단방향만 지원합니다. 그러므로 위와 같이 양방향을 다 참조해야된다 라는 전제가 붙으면 Json Serialize 위배됩니다. 


그러면서 찾은것이 바로 @JsonIdentityInfo 인데요... 이놈이 reference 를 봐도 도통 이해가 안됩니다.... 

여러 테스트를 해봤는데도 이해가 안되고... 더 짜증나는건 deserialize 에서도 문제가 발생한다는겁니다....

property에 설정한 값이 존재하지 않을경우 절대 deserialize 되지 않는데... 혹시 이런저런 문제를 경험하신 분이 계신가 궁금합니다.

보통 어떻게 해결하시는지요??

참고로 저는 Entity(VO) 객체를 @RequestBody 값으로 받고 싶고 @ResponseBody 값으로 내보내고 싶습니다... 다른 VO객체를 만들기는 싫어서;;;







KwonNam Son

unread,
Dec 17, 2015, 10:54:02 PM12/17/15
to ks...@googlegroups.com
저는 @Json* annotation을 사용하면 코드상에 고정이돼 버려서 그건 거의 사용하지 않습니다.

보통은 JsonFilter 혹은 @JsonView 를 사용합니다. 그냥 상황에 따라 코드로  Cycle을 조정하는 것이라고 보면 됩니다. @JsonView 는 Spring 4.1 부터 지원을 하는데.. 이게 상황에 따라 조정가능하지만 Annotation 지옥이 펼쳐집니다.
그래서 저는 그냥 JsonFilter로 필요할 상황에 맞춰 코딩하는 방식을 사용하는 편입니다.

http://kwonnam.pe.kr/wiki/java/jackson


2015년 12월 18일 오전 11:36, SungKyung Kim <okih...@brace.xyz>님이 작성:

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
https://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/49839d9d-886e-4589-8e5a-b9cbdd7c4545%40googlegroups.com을(를) 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.



--
* 까먹지말자! http://kwon37xi.egloos.com

SungKyung Kim

unread,
Dec 21, 2015, 9:10:39 PM12/21/15
to Korea Spring User Group Q&A
답변 감사합니다~ 아직 해결된 것은 아니지만 

SimpleFilterProvider 쪽을 살펴보니 해결할 수 있을 것 같네요~



2015년 12월 18일 금요일 오후 12시 54분 2초 UTC+9, 권남 님의 말:
Reply all
Reply to author
Forward
0 new messages