Spring 에서 JPA 사용하며 JSON 으로 변환시
Domain 간 양방향 참조를 걸 경우가 있다.
이때 JSON 으로 변환 하며 무한 루프에 빠지는데
이를 방지 하기 위해
예전 방식
@JsonManagedReference
@JsonBackReference
과
요즘 방식
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id”)
을 쓰게 된다.
요즘 방식 @JsonIdentityInfo 의 경우 위 예제는
id 로 중복을 방지하여 무한루프를 방지 하는데
한번의 변환에 같은 아이디가 존재 할 경우 JSON 변환을 하지 않는다.
무슨말이냐 하면..
JSON 변환 하는 과정에서 @JsonIdentityInfo 가 달려있는 도메인의 id 가 1개 이상 있으면 안된다는 것이다.
1개 이상 있으면 변환 과정중 1회 이상의 데이터는 변환하지 않는다.
해당 내용은 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id”)
형태로 사용했을 경우이고
generator 를 변경하면 가능 할 것 같아 보이긴 한다.
그림으로 설명하기 귀찮아서 글로 적긴 했는데
아무튼 참고해라.
-- 추가 --
@JsonIdentityInfo 는 generator 별로 숫자, 문자, uuid 등으로 키를 생성하여
json변환 중 같은 키가 발견되면 같은 스코프 내에서는 표시 하지 않는다.
내 상황같은 경우를 잘 분석 해보니 데이터 루프 중 1depth 까지만 데이터를 표시하고 이하는 표시 하지 않는것을원한 것으로 분석 됐다.
이를 위해 위에서 언급 한 방식을 사용하지 않고
@OneToMany 어노테이션이 달린 List 데이터 필드 위에
@JsonIgnoreProperties 를 사용하여 해당 필드의 List 데이터 내에
@ManyToOne 으로 설정 한 릴레이션에서 Json 편환을 하지 않도록 했다.
@JsonIgnoreProperties("auctionCase")
@OneToMany(mappedBy = "auctionCase", fetch = FetchType.LAZY)
private List<Research> research;