RestAPI로 구현을 하던 와중에 db에 저장된 데이터에 대해 GET 요청을 보내고 데이터를 확인 하려고 하니, JSON 데이터가 무한히 반복되고 있는 현상을 겪었다.
문제의 원인은 두 테이블간 참조 관계에 속해 있을 때 두 테이블의 객체간에 서로 순환 참조를 하는 경우, 순환 참조로 이해 JSON 직렬화 과정에서 무한 루프가 발생하고 있던거였다.
예를 들어 movie 테이블과 actor 테이블이 있을 때 두 테이블 간 특정 객체간에 서로 순환 참조를 한다면 다음과 같이 참조하여 무한 반복이 발생한다.
1. @JsonIgnore
public class Actor {
// 위 코드는 생략
@JsonIgnore
@ManyToOne
@JoinColumn(name = "movie_id", nullable = false)
private Movie movie;
}
코드에서 Actor 클래스는 현재 Movie 테이블의 movie_id를 참조하는 것을 볼 수 있는데, @JsonIgnore 어노테이션을 이용하지 않는다면, 각 두 테이블은 순환 참조를 하는 상황이 발생하여 json 데이터가 무한으로 반복되는 현상이 일어날 수 있다. 따라서 @JsonIgnore를 사용하여 방지할 수 있다.
2. Dto
데이터 전송 객체(Data Transfer Object, DTO)를 사용하여 필요한 데이터만 포함하여, 순환 참조가 발생하지 않도록 하게 할 수 있다.