본문 바로가기

Language/Java, Android

[JPA] 양방향 관계에서 infinite recursion 해결법

nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)

JPA에서 대표적인 문제가 몇개 있는데 그 중 하나가 infinite recursion이다. @OneToMany, @ManyToOne 어노테이션으로 양방향 관계를 맺어주면 서로가 서로를 무한 참조하면서 발생한다.

이 문제를 다루려고 저번 포스팅에서 조회를 빼고 데이터 삽입만 진행했다.

 

[JPA] JPA 시작하기(3) - @OneToMany, @ManyToOne 양방향

​JPA에서 @OneToOne, @OneToMany, @ManyToOne, @ManyToMany 어노테이션을 이용해 테이블간...

blog.naver.com

무한 루프 발생

user와 post가 1:N 관계이고 초기 데이터가 위와 같이 들어가 있는 상태에서 조회를 해보자.

userRepository.getOne(1L);

user seq 1번으로 조회하면 다음과 같이 무한 루프가 발생한다

{"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": {"seq":1,"userId":"user1","password":"pass1","name":null,"posts":[{"seq":1,"title":"안녕하세요","content":"반가워요","user": ...

user -> post 참조하고 post -> user 참조하고 또 다시 user -> post 참조하고 post -> user 참조하고.... .. 무서워서 서버를 꺼버렸다..

해결방법

1.

Jackson 1.6 버전대 라면 @JsonManagedReference, @JsonBackReference annotation 사용 하면된다.

 

[JPA] Infinite recursion (StackOverflowError)

JPA로 relation을 맺으려고 @OneToMany ,@ManyToOne, @ManyToMany 어노테이션을 많이 사용하면...

blog.naver.com

2.

Jackson 2.0 이상부터 @JsonIdentityInfo 으로 이를 해결할 수 있다.

그 전에는 나도 1번 방법으로 해결을 했었는데, 포스팅을 하려고 다시 찾아보니 새로운 방법이 있길래 적용시켜봤다.

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) public class User extends CommonEntity { ... }

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class) public class Post extends CommonEntity { ... }

무한루프가 발생하지 않는지 다시 조회해보자.

userRepository.getOne(1L);

user seq 1번으로 조회하면 다음과 같이 나온다.

{ "@id":1, "seq":1, "userId":"user1", "password":"pass1", "name":null, "posts": [ { "@id":2, "seq":1, "title":"안녕하세요", "content":"반가워요", "user":1 } ], "hibernateLazyInitializer":{} }

근데 @JsonIdentityInfo를 써서 루한 루프를 해결하니 @id가 갑자기 생겼다.. 아직 원인은 모르겠다...

[출처] https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=rorean&logNo=221593255071 

 

[JPA] 양방향 관계에서 infinite recursion 해결법(2)

nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (St...

blog.naver.com