2021년 1월 15일 금요일

@JsonIdentityInfo 사용시 주의점

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;