본문 바로가기
개발/SpringBoot

[JPA] @JsonBackReference, @JsonManagedReference

by yo.na 2024. 9. 23.

 

✔ 문제

엔티티 구조

  • A_entity(부모)
    • B_entity (부모: A_entity, 자식: C_entity)
      • C_entity (부모: B_entity, N:1 참조: D_entity)
        • D_entity (부모: X)
// C_entity
    @JsonBackReference
    @ManyToOne
    @JoinColumn(name = "D_entity_id")
    private D_entity d_entity;

 

JPA 를 사용하는 프로젝트에서 C_entity에서 D_entity 조회가 안되는 오류

 

 

✔ 해결과정

@JsonBackReference 어노테이션 제거

@JsonBackReference는 자식 엔티티에서 부모 엔티티의 정보를 숨겨서, JSON 직렬화 시 순환 참조 문제를 해결하는 데 도움을 준다. 

✔ 원인

@JsonBackReference는 역참조를 무시하여 JSON 변환 시 해당 필드를 제외하게 한다.

이 설정은 부모-자식 관계에서 부모의 필드가 직렬화될 때 자식의 필드를 포함하지 않도록 한다.

내가 놓친 부분은 C_entity와 D_entity 가 부모-자식 관계가 아니라는 점

두 엔티티는 참조 관계일 뿐 부모 자식 관계는 아니라 해당 어노테이션이 필요없다.

하지만 @JsonManagedReference 사용해도 정상 동작하긴 했다.

 

@JsonManagedReference

  • 부모 객체에서 자식 객체로의 참조를 설정한다.
  • 직렬화 시 해당 객체가 JSON에 포함된다.

@JsonBackReference

  • 자식 객체에서 부모 객체로의 참조를 설정한다.
  • 직렬화 시 해당 객체는 무시된다.

내 경우, C_entity와 D_entity는 부모-자식 관계가 아니므로 @JsonBackReference 또는 @JsonManagedReference를 사용할 필요가 없다. 필요에 따라, 서로 참조 관계를 명확히 하기 위해 DTO를 사용하는 것도 고려할 수 있다.