circular refrence.jfif

문제

최근 팀 프로젝트를 하면서 겪은 문제인데, 진행 중의 겪은 이슈의 원인을 제대로 파악하지 못해서 자세히 정리해보게 되었다.

문제의 코드와 에러 내용은 아래와 같았다.

public class Article {
    @OneToMany(mappedBy = "article", fetch = FetchType.EAGER)
    @Builder.Default
    private List<Comment> commentList = new ArrayList<>();
}

// ----------------------------------

public class Comment {
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "user_id")
	private Member author;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "article_id")
	private Article article;
}
through reference chain: 
GlobalResponse["data"]->
ArticleDetailResponseDto["article"]->
Article["commentList"]->
PersistentBag[3]->
Comment["author"]->
Member$HibernateProxy$LW4Bw84e["hibernateLazyInitializer"])

원인

객체를 JSON으로 직렬화하는 과정에서 발생한 문제이다.

결론부터 얘기하자면 각 객체의 필드를 역직렬화하는 과정에서 프록시 객체에는 실제 값이 들어있지 않아서 발생한 오류이다.

원인을 바로 파악하지 못했던 이유는, 이전에 겪었던 문제 중에 JSON 직렬화 과정에서 발생한 순환참조 이슈와 헷갈렸기 때문이었다.

다만, 그 때는 양방향 연관관계 매핑을 사용했었고 그로 인해 아래와 같이 순환 구조가 확실하게 눈에 보이는 상황이었다.

Article["commentList"]->
PersistentBag[3]->
Comment["author"]->
Member["articleList"]->
PersistentBag[1]->
Article["commentList"] // ... 반복