Akashic Records

Spring Data JPA, @OneToMany 무한 반복 오류 본문

Spring.io

Spring Data JPA, @OneToMany 무한 반복 오류

Andrew's Akashic Records 2023. 4. 12. 00:24
728x90

@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에 포함할 수 있습니다. 적절한 방법을 선택하여 순환 참조 문제를 해결하세요.

728x90

'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
Comments