[Spring Boot] 무한 순환 참조 에러, Handler dispatch failed; nested exception is java.lang.StackOverflowError

어디든 배우자·2023년 11월 27일

문제 발생 전

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PostInfo {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long postSeq;

    '''//중간 코드 생략

    @OneToMany(mappedBy = "postInfo", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<PostDetailImage> postDetailImages;

}

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PostDetailImage {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long detailImageSeq;

    @ManyToOne
    @JoinColumn(name = "postSeq")
    private PostInfo postInfo;

}

이렇게 2개의 Entity가 연관관계 맵핑을 이루고 있었고,
PostInfo를 조회하면 서로를 계속해서 조회되어 에러가 발생했었다.

	@ManyToOne
    @JoinColumn(name = "postSeq")
    @JsonIgnore//추가한 어노테이션
    private PostInfo postInfo;

@JsonIgnore를 추가하여 서로 조회하는 걸 막았다.
이 후 끝난 줄 알았지만 아니었다.

문제 발생

Fetch Join을 활용하여 N+1을 발생시키지 않고 코드를 구현하고 있었고,
데이터 값을 보내기 전, 서버에서 조회를 하는 순간

Handler dispatch failed; nested exception is java.lang.StackOverflowError

이러한 에러가 발생했고, 무한 순환 참조 에러였다.

해결

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(exclude = {"postInfo"}) // 추가된 어노테이션
public class PostThumbnailImage {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long thumbnailImageSeq;

    @ManyToOne
    @JoinColumn(name = "postSeq")
    @JsonIgnore
    private PostInfo postInfo;

}

@ToString을 사용하여 특정 필드를 toString에 포함되지 않게 하는것입니다.

profile
다 흡수하기.

0개의 댓글