병원의 리뷰 데이터를 보여주는 프로그램을 작성할 때 병원 정보를 통해서도 리뷰를 볼 수 있고 리뷰 정보를 통해서도 병원의 정보를 알 수 있도록 하기 위해서 병원 엔티티에는 @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;
}
}
참고 자료