@OneToMany, @ManyToOne 양방향 참조로 인한 stackover flow 에러

yeonicerely·2022년 11월 24일
0

안녕오류

목록 보기
6/8

병원의 리뷰 데이터를 보여주는 프로그램을 작성할 때 병원 정보를 통해서도 리뷰를 볼 수 있고 리뷰 정보를 통해서도 병원의 정보를 알 수 있도록 하기 위해서 병원 엔티티에는 @OneToMany, 리뷰 엔티티에는 @ManyToOne 어노테이션을 이용해서 서로 참조할 수 있도록 해주었다.
하지만 이렇게 하니 리뷰 내용을 조회할 때 무한루프(?)처럼 돌면서 stackoverflow 에러가 발생했다.

이 문제를 해결하기 위해서 One 쪽(병원 엔티티)의 review 필드에는 @JsonBackReference, Many 쪽(리뷰 엔티티)의 hospital 필드에는 @JsonManagedReference 라는 어노테이션을 붙여주었다.

@JsonBackReference
: 연결된 필드가 엔티티의 하위 속성임을 표시해준다.

@JsonManagedReference
: 연결된 필드(Hospital)가 엔티티(Review)의 상위 속성임을 나타낸다. 이 때 Hospital 엔티티에 @JsonBackReference 주석이 달린 속성이 있어야 한다.

두 annotation은 메소드나 필드에만 적용할 수 있고 생성자에는 사용할 수 없다.

병원 엔티티 코드


@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Hospital {

    @Id
    private Long id;
    @Column(name = "hospital_name")
    private String name;
    private String roadNameAddress;

    @OneToMany(mappedBy = "hospital", fetch = FetchType.LAZY)
    @JsonBackReference
    private List<Review> review;

}

리뷰 엔티티 코드

@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Review {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
    private String patientName;

    @ManyToOne
    @JoinColumn(name = "hospital_id")
    @JsonManagedReference
    private Hospital hospital;


    public Review(String title, String content, String patientName, Hospital hospital){
        this.title = title;
        this.content = content;
        this.patientName = patientName;
        this.hospital = hospital;

    }

}

참고 자료

0개의 댓글