회고

트러블슈팅 기록하기 - 무한 순환 참조 에러

luminous13 2022. 12. 8. 00:59

DTO와 엔티티를 분리하지 않아 발생한 무한 순환참조 에러

 

게시글 상세페이지를 조회했을 때 응답으로 제공하는 정보중에 댓글 정보도 있었습니다.

 

프로젝트를 진행하면서 많은 에러를 마주쳤고 그 중에 가장 기억에 남는 에러를 핸들링하는 주제를 가져왔습니다.

주제는 DTO와 엔티티를 분리하지 않아 발생한 무한 순환참조 에러입니다.

 

위 사진은 게시글 정보를 응답으로 주는 DTO입니다.

게시글의 경우 Post 엔티티와 PostResponseDto로 분리하여 문제가 없을거 같지만 사실 이것은 DTO와 엔티티를 분리하지 않은 상태입니다. 왜냐하면 필드로 Comment 엔티티를 노출하고 있기 때문입니다.

 

 

위 사진을 보면  Comment 엔티티는 필드로 Post 정보를 갖고 있습니다.

 

 

그리고 위 사진을 보면 Post 엔티티는 필드로 Comment 정보를 갖고 있습니다.

즉, 두 엔티티는 양방향 관계입니다.

결국 응답메세지로 Comment 엔티티를 직접 노출시키면 Comment 정보를 출력하고, Post 정보를 출력하고 또다시

Comment 정보를 출력하는 양방향 무한 순환 참조가 일어나게 됩니다.

 

그 결과 다음과 같이 응답 메시지를 보면 다음과 같이 재귀적으로 정보가 출력됩니다.

 

 

이 문제의 원인은 결국 엔티티를 직접 노출시켜 양방향 관계에 있는 필드까지 정보를 출력하기 때문입니다.

그러므로 양방향 매핑을 노출하지 않기 위해 엔티티 직접 노출을 피해야합니다.

다시말해서, 엔티티를 대신해 필요한 정보만이 담긴 DTO을 노출해야합니다.

 

 

따라서 엔티티 노출을 막기 위해 첫 번째 사진처럼 Commen엔티티를 대신해 CommentResponseDto를 만들었습니다. 즉 엔티티와 DTO를 분리했습니다.

 

그리고 필드로는 필요한 정보만을 담아 응답으로 제공하였습니다.