Spring 프로젝트로 대댓글을 구현하기 위해 댓글 Entity에서 자기 참조(self reference)를 하도록 다음과 같이 코드를 짜보았다.
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Comment extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JoinColumn(name = "member_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private Member member;
@JoinColumn(name = "post_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
@Column(nullable = false)
private String content;
@JoinColumn(name = "parent_id")
@ManyToOne(fetch = FetchType.LAZY)
private Comment parent;
@OneToMany(mappedBy = "parent", orphanRemoval = true)
private List<Comment> replies = new ArrayList<>();
public void update(CommentRequestDto commentRequestDto) {
this.content = commentRequestDto.getContent();
}
public boolean validateMember(Member member) {
return !this.member.equals(member);
}
}
그러나 동작시키니 replies와 parent를 가져오는 것에서 Infinite Recursion이 발생해 Stack Overflow Error가 발생했다.
찾아보니 이에 대한 해결책은 크게 3가지가 있다고 한다.
1. JPA Entity 클래스 내에 Jackson 애노테이션을 위치시키는 방법.
: @JsonIgnore, @JsonManagedReference, @JsonBackReference, @JsonIdentityInfo, …
2. ResponseDTO를 만들어 Persistent Object의 데이터를 주입시키는 방법
: Self Reference하는 Persistent Object를 JSON으로 Serialize할 때 Infinite Recursion이 발생하는 것이기 때문에 이를 해결하기 위해 Response용 DTO를 생성한다.
3. Custom Serializer를 만들어 사용하는 방법
: ResponseEntity에 기본으로 제공되는 Jackson 라이브러리의 Databinding을 사용하지 않고 직접 Serializer를 만들어 Infinite Recursion이 일어나지 않도록 Serialize하는 방법
👉🏻 따라서 나는 가장 간단해보이는 방법으로, 1번 @JsonIgnore을 parent 속성에 붙여 해결하였다.
참고 자료