본문 바로가기
Back-end/Spring Boot

[JPA] Infinite Recursion 해결법

by whatamigonnabe 2022. 10. 23.

Infinite Recursion이란?

양방향 연관관계를 가진 Entity를 Json으로 직렬화할 때, 서로가 서로를 무한히 참조하면서 발생하는 에러이다.

 

해결법

@JsonIdentityInfo

이 어노테이션을 클래스레벨에 붙이게 되면, Mapper가 직렬화할 때매다 지정한 ID 객체를 추가해서 다시 스캔되지 않도록한다.

 

아래는 Member와 WIshlist가 일대다 양방향 관계일 때, 위시리스트에 @JsonIdentityInfo를 추가한 모습.

 

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class)
public class Wishlist extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long wishlistId;
    @ManyToOne(targetEntity = Member.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "MEMBER_ID")
    private Member member;
    @DateTimeFormat(pattern = "yyyy-mm-dd")
    private LocalDate dueDate;
    @Convert(converter = BooleanConverter.class) // Y/N <-> true/false
    private boolean isNotice;
    private GeneralStatus status = GeneralStatus.ACTIVE;
    private String isbn;
    @OneToOne(mappedBy = "wishlist",fetch = FetchType.EAGER, cascade = CascadeType.DETACH)
    private Review review;
}

아래는 위시리스트를 직렬화한 모습

"wishlist": {
            "@id": 1, //추가된 id객체
            "createdAt": "2022-10-23T17:05:35.023958",
            "modifiedAt": null,
            "wishlistId": 2,
            "member": {
                "createdAt": "2022-10-23T17:05:30.21694",
                "modifiedAt": null,
                "memberId": 1,
                "email": "ccdc@navver.com",
                "password": "{bcrypt}$2a$10$eioDPYErI.RfCTxVSpeTmOEJygUU4CPvkrAN1PtzwknBW/ROrk8fi",
                "nickname": "pausl",
                "point": 0,
                "level": 1,
                "memberStatus": "MEMBER_ACTIVE",
                "roles": [
                    "ROLE_USER"
                ],
                "wishlists": [
                    1 //추가됐기 때문에 Infinite Recursion이 발생하지 않는다.
                ]
            },
            "dueDate": "2020-11-13",
            "status": "ACTIVE",
            "isbn": "123464",
            "review": null,
            "notice": false
        }

 

참조

https://stackoverflow.com/questions/3325387/infinite-recursion-with-jackson-json-and-hibernate-jpa-issue