최근 팀 프로젝트를 하면서 겪은 문제인데, 진행 중의 겪은 이슈의 원인을 제대로 파악하지 못해서 자세히 정리해보게 되었다.
문제의 코드와 에러 내용은 아래와 같았다.
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"] // ... 반복