[Spring] Self Reference시 발생하는 Infinite Recursion Issue(무한 재귀 루프) 해결하기

DEINGVELOP·2022년 8월 31일

❓ 오류 발생 배경

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 속성에 붙여 해결하였다.




참고 자료


0개의 댓글