순환 참조(Circular Reference)와 DTO

GyeongEun Kim·2022년 5월 3일
0

졸업 프로젝트를 진행하면서 수많은 오류들을 만났는데 다음에 다시 만날것 같은(만나지 말아야겠지만) 오류들을 한번 정리해보려고 한다.

프론트엔드에게 Json형식으로 데이터를 넘겨주는 중 오류가 발생했는데, 찾아보니 무한 참조 오류였다.

순환 참조 오류는 왜 발생했을까

우리가 데이터베이스를 설계할때 연관관계를 양방향매핑으로 설정해놓은것이 있었는데 이것 때문에 문제가 발생한 것이였다.

그리고 나는 별 생각없이 Dto를 사용하지않고, jpa에서 리턴한 entity를 그대로 프론트에게 넘겨주었다.
그래서 내가 User entity를 리턴했을때

User review컬럼에서 Review테이블참조 --> Review테이블의 user컬럼에서 또 User참조 --> 반복,,,

위와 같은 무한참조가 일어나면서 재귀호출의 깊이가 엄청나게 깊어져 stackOverflow가 발생하였다.

순환 참조 오류를 방지하는 방법

1. Entity를 바로 리턴하지 말고 DTO를 적극 사용

entity를 그대로 리턴하면 연관 관계가 있는 테이블 전체가 함께 리턴되기 때문에, dto를 사용하여 참조하는 테이블 전체가 아니라 필요한 컬럼만을 리턴하도록 한다.

2. 한방향 매핑

양방향 매핑이 필요없다면 한방향 매핑을 통해 이를 방지할 수 있다. 나도 데이터베이스 설계를 할때 이를 잘 고려해야겠다.

profile
내가 보려고 쓰는 글

0개의 댓글