N+1 쿼리 성능 최적화 관련 글 작성할 때도 문제였던 애증의 suspended user…
프로젝트 막바지가 되니 다른 곳에서도 자주 쓰이다보니 전체 엔티티 중에 가장 많이 참조되는 user를 참조할 때마다, user와 일대일 관계이고 외래키를 가지고 있는(연관관계의 주인인) suspended User를 계속 조회하는 일이 생겼다.
그중의 최고봉은 우리 앱의 커뮤니티 기능 중에 유저들 사이에 질문지에 잘 어울리는 유저를 뽑는 투표 기능이 있는데, 이때 투표를 할 유저를 조회하는 투표 인원 조회 api에서 투표지에 보여줄 유저를 가져오기 위해 게시물(사진)을 통해 엔티티를 조회하는데, 우리의 비즈니스 로직상 게시물을 통해서 유저들을 조회할 때 suspended user까지 전부 조회가 되는 문제가 생겼다.
결국 조회하는 게시물이 많아질수록 거기에 딸린 유저의 suspendedUser도 함께 딸려오는 상황이였다.
예시로 투표인원(4명)을 뽑는 api를 실행하면
쿼리가 미친듯이 날라가서 이를 복붙해서 gpt한테 세달라고 했더니
이렇게 무지막지한 쿼리가 나갔다.
이전에 언급한 것처럼, 일대일 연관관계에서 외래 키의 주인이 user가 아닐 때, fetchtype을 지연 로딩 전략으로 설정해둬도 프록시 객체가 null 값으로 둘 수는 없기 때문에 user 엔티티 입장에서는 즉시 로딩 전략으로 suspendedUser 엔티티까지 조회한다.
그래서 각 user들과 연관되어 있는 suspended User까지 한 번에 다 조회하다 보니
사진과 같이 무한 suspendedUser 조회 쿼리가 나간 것이다.