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
}
참조
'Back-end > Spring Boot' 카테고리의 다른 글
[JPA] JPA의 Entity의 Equality 동일성에 대하여 (0) | 2022.11.05 |
---|---|
[Oauth2] Oauth2로 회원가입 / 로그인 기능 구현하기 (0) | 2022.11.03 |
[SpringBoot] HttpSecurity 보안 설정 정리 (0) | 2022.10.13 |
[SpringBoot] SpringSecurity 인증 처리 흐름 (1) | 2022.09.26 |
[SpringBoot] WebClient 이해하기(feat. block/non-block과 동기/비동기) (0) | 2022.08.01 |