Skip to content

양방향 연관관계에서 순환참조가 발생하는 문제

N a t a s h a edited this page Dec 12, 2022 · 3 revisions

1. 도입 이유 & 문제상황

JPA에서 양방향으로 연결된 엔티티를 JSON 형태로 직렬화하는 과정에서, 서로의 정보를 계속 순환하며 참조하여 StackOverflowError를 발생시키는 순환 참조가 발생


2. 해결 방안

1) Entity 대신 DTO 로 반환

2) @JsonManagedReference & @JsonBackReference

양방향 관계에서 직렬화 방향을 설정하여 순환 참조를 해결할 수 있도록 설계된 애노테이션

@JsonManagedReference : 연관관계 주인 반대 Entity 에 선언, 정상적으로 직렬화 수행

@JsonBackReference : 연관관계의 주인 Entity 에 선언, 직렬화가 되지 않도록 수행

3) @JsonIgnore

양방향 관계를 가지고 있는 두 엔티티 중 하나의 엔티티의 참조 필드에 직렬화를 제외시키는 방법 JSON 직렬화 과정에서 해당 애노테이션이 선언된 필드는 직렬화 대상에서 제외 해당 필드가 직렬화에 필요할 경우에는 적합하지 않은 방법


3. 의견 결정 & 결과 반영

Entity 클래스는 데이터베이스와 맞닿는 핵심 클래스이며 Entity 클래스를 기준으로 수많은 클래스나 비즈니스 로직들이 동작하고 있다. Entity 클래스를 통해 여러 클래스들이 영향을 받을 수 있으므로 Entity 클래스를 Request/Response 클래스로 사용하는 것은 피할 수 있도록 가능하면 해결방안 1번 DTO로 반환하고 그렇지 못한 곳에서는 해결방안 2번 @JsonManagedReference & @JsonBackReference을 사용하여 순환참조를 해결했다.