[DEV] 기록

[Jackson 라이브러리] @JsonBackReference

꾸준함. 2023. 9. 7. 17:16

개요

객체 간 순환 참조를 방지하기 위해 추가한 @JsonBackReference가 @JsonIgnore 애노테이션과 비슷한 역할을 하여 ObjectMapper의 writeValueAsString() 메서드에서 해당 필드가 무시되는 현상이 발생했습니다.
생각보다 해당 문제를 다루는 문서가 없는 것 같아 @JsonBackReference 어노테이션의 역할과 위 문제를 어떻게 해결했는지 이번 포스팅에서 작성해 보겠습니다.

 

@JsonBackReference란?

Jackson 라이브러리의 @jsonbackReference는 Java 객체 간 양방향 참조를 다룰 때 사용됩니다.
해당 어노테이션은 주로 JSON Serialization(직렬화) 및 Deserialization(역직렬화) 프로세스에 사용되며 객체 간 순환 참조를 방지하고 무한 루프를 피하기 위해 도움을 줍니다.
대표적인 예시로는 엔티티 간 연관관계가 있는 상태에서 두 엔티티 모두 Lombok의 @Data 어노테이션을 주는 경우 @Data가 자동으로 추가해 주는 equals(), hashCode(), 그리고 toString() 메서드에서 서로가 서로를 참조하여 무한루프에 빠지고 결국 StackOverflowException이 발생하게 됩니다.
@JsonBackReference를 사용하면 양방향 연관 관게에서 한쪽을 직렬화에서 무시할 수 있고 저도 이 때문에 해당 어노테이션을 사용했습니다.

 

문제 원인과 해결 방법

앞서 개요에서 언급했다시피 @JsonBackReference 어노테이션이 붙어있는 필드는 ObjectMapper가 무시하는 문제가 발생했습니다.
이는 Jackson 라이브러리의 objectMapper가 내부적으로 @JsonBackReference와 @JsonIgnore 어노테이션이 적용된 필드들은 무시하도록 구현이 되었기 때문입니다.
이 때문에 저처럼 @JsonBackReference가 붙어있는 필드를 추가하고 싶다면 JsonSerializer의 serialize() 메서드를 오버라이드하고 적용하고 싶은 클래스에 @JsonSerialize 어노테이션을 적용하면 됩니다.
 
예시 코드는 아래와 같습니다.
 

 
 

 

 

참고

https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion
 
 

반응형