개발/SpringBoot
[JPA] @JsonBackReference, @JsonManagedReference
yo.na
2024. 9. 23. 23:52
✔ 문제
엔티티 구조
- A_entity(부모)
- ↳ B_entity (부모: A_entity, 자식: C_entity)
- ↳ C_entity (부모: B_entity, N:1 참조: D_entity)
- ↳ D_entity (부모: X)
- ↳ C_entity (부모: B_entity, N:1 참조: D_entity)
- ↳ B_entity (부모: A_entity, 자식: C_entity)
// 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를 사용하는 것도 고려할 수 있다.