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
'Language > Java, Android' 카테고리의 다른 글
Elasticsearch Java Client !(엘라스틱서치 자바 클라이언트,High-Level Rest Client) (0) | 2021.11.30 |
---|---|
[MacOS 개발환경 #9] DynamoDB 로컬(Local) 환경 설치 - Java (0) | 2021.11.23 |
[Java, JPA] 도메인 객체간 연관관계에서 즉시로딩과 지연로딩 and 프록시 객체 (0) | 2021.11.07 |
[JPA] @OneToOne, 일대일[1:1] 관계 (0) | 2021.11.05 |
[IntelliJ] java: cannot find symbol(클래스 import가 안될 때) (0) | 2021.11.05 |