728x90
순환 참조.
JPA에서 양방향으로 연결된 엔티티를 JSON 형태로 직렬화하는 과정에서, 서로의 정보를 계속 순환하며 참조하여 StackOverflowError 를 발생시키는 현상
.
직렬화.
객체/데이터를 바이트 형태로 변환하여 네트워크를 통해 송수할 수 있도록 만드는 것
1. Entity 대신 DTO 로 반환
- 가장 추천하는 방식이다.
- Entity 클래스는 데이터베이스와 맞닿는 핵심 클래스이다.
- Entity 클래스를 기준으로 수많은 클래스나 비즈니스 로직들이 동작하고 있다.
- Entity 클래스를 통해 여러 클래스들이 영향을 받을 수 있으므로 Entity 클래스를 Request/Response 클래스로 사용하는 것은 강력하게 추천하지 않는다.
- 컨트롤러에서 Response 값으로 여러 테이블을 조인해야하는 경우가 많으므로, DB Layer 와 View Layer 의 역할 분리를 철저하게 해주자.
- 역시나 객체지향 설계에 있어서 역할과 책임은 중요한 요소인 것 같다.
2. @JsonManagedReference & @JsonBackReference
양방향 관계에서 직렬화 방향을 설정하여 순환 참조를 해결할 수 있도록 설계된 애노테이션
@JsonManagedReference
- 연관관계 주인 반대 Entity 에 선언
- 정상적으로 직렬화 수행
@JsonBackReference
- 연관관계의 주인 Entity 에 선언
- 직렬화가 되지 않도록 수행
3. @JsonIgnore
- 양방향 관계를 가지고 있는 두 엔티티 중 하나의 엔티티의 참조 필드에 직렬화를 제외시키는 방법
- JSON 직렬화 과정에서 해당 애노테이션이 선언된 필드는 직렬화 대상에서 제외
- 해당 필드가 직렬화에 필요할 경우에는 적합하지 않은 방법
https://data-make.tistory.com/727
[JPA] JSON 직렬화 순환 참조 해결하기
[JPA] JSON 직렬화 순환 참조 해결하기 순환 참조. JPA에서 양방향으로 연결된 엔티티를 JSON 형태로 직렬화하는 과정에서, 서로의 정보를 계속 순환하며 참조하여 StackOverflowError 를 발생시키는 현상
data-make.tistory.com