일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 데이터베이스
- android
- Database
- 유닉스
- 인프라
- Spring boot
- chatGPT's answer
- kotlin
- JVM
- write by chatGPT
- NIO
- 웹 크롤링
- 리눅스
- python
- Java
- 자바네트워크
- 코틀린
- flet
- 자바
- 고전역학
- spring data jpa
- 역학
- 파이썬
- 시스템
- jpa
- GPT-4's answer
- 소프트웨어공학
- oracle
- write by GPT-4
- 자바암호
- Today
- Total
Akashic Records
Spring Data JPA, @OneToMany 무한 반복 오류 본문
@OneToMany Entity을 RestAPI로 리턴할때 부한 반복 오류
부모-자식 엔티티 간의 양방향 관계에서 @OneToMany를 사용하면, REST API로 엔티티를 리턴할 때 순환 참조(Circular Reference) 문제가 발생할 수 있습니다. 이 문제는 JSON 직렬화 시 무한 루프를 일으키며, 결국 StackOverflowError가 발생하게 됩니다.
이 문제를 해결하기 위해선 Jackson 라이브러리의 @JsonManagedReference 및 @JsonBackReference 어노테이션을 사용하거나, @JsonIgnore 또는 @JsonView를 사용하여 직렬화를 제한할 수 있습니다.
@JsonManagedReference와 @JsonBackReference 사용
@JsonManagedReference는 포워드 방향 참조를 관리하고, @JsonBackReference는 역방향 참조를 관리합니다.
@Entity
public class Parent {
// ...
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private List<Child> children = new ArrayList<>();
}
@Entity
public class Child {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
@JsonBackReference
private Parent parent;
}
@JsonIgnore 사용
@JsonIgnore를 사용하여 순환 참조를 끊고, 특정 필드를 JSON에서 무시할 수 있습니다.
@Entity
public class Child {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
@JsonIgnore
private Parent parent;
}
@JsonView 사용
@JsonView를 사용하여 JSON 직렬화에서 어떤 필드를 포함하고 무시할지 제어할 수 있습니다. 먼저, 뷰 인터페이스를 정의합니다.
public class JsonViews {
public static class Public {}
public static class Internal extends Public {}
}
그리고 각 필드에 뷰를 지정합니다.
@Entity
public class Parent {
// ...
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonView(JsonViews.Public.class)
private List<Child> children = new ArrayList<>();
}
@Entity
public class Child {
// ...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
@JsonView(JsonViews.Internal.class)
private Parent parent;
}
컨트롤러 메소드에서 사용하려는 뷰를 지정합니다.
@RestController
public class ParentController {
// ...
@GetMapping("/parents")
@JsonView(JsonViews.Public.class)
public List<Parent> getAllParents() {
return parentService.getAllParents();
}
}
위의 설정에 따라 순환 참조 문제를 해결하고, 필요한 필드만 JSON에 포함할 수 있습니다. 적절한 방법을 선택하여 순환 참조 문제를 해결하세요.
'Spring.io' 카테고리의 다른 글
Spring Boot Filter 사용법 (0) | 2023.04.15 |
---|---|
Spring Data JPA , FetchType (0) | 2023.04.12 |
Spring Data JPA, 페이지 및 정렬 (0) | 2023.04.10 |
Spring Data JPA @Query 어노테이션 (0) | 2023.04.10 |
Spring Data JPA (0) | 2023.04.10 |