생각정리/사이드 프로젝트

사이드 프로젝트 : 중고 거래 플랫폼 - 게시글 관련 쿼리 최적화

생각중임 2024. 5. 17. 23:38

게시글 상세 조회 시 최적화

게시글 상세 조회 시 댓글을 작성한 사람의 정보를 가져오는 곳에서 N + 1 문제 발생

 

원인 파악

 

게시글 상세정보 데이터를 보낼 때, DTO에 게시글 엔티티를 통채로 넘긴 다음 DTO 생성자 안에서 게시글 데이터에 있는 댓글 정보를 찾아 바로 댓글 DTO 리스트로 만들어 전송을 한다.

 

게시글 데이터 안에 있는 댓글 리스트를 가져올 때는 댓글 쿼리 하나가 발생하지만, 댓글 리스트에서 댓글을 DTO로 만드는 과정에서 댓글의 유저 아이디를 가져오는 과정에서 N + 1 문제가 발생했다.

 

해결 방안

 

게시글 엔티티안에 있는 댓글 리스트를 이용하는 것이 아닌, 게시글 아이디를 이용해 댓글을 별도로 조회하면서 패치 조인으로 유저 정보를 한 번에 가져온 뒤 댓글 DTO를 만들고 해당 댓글 DTO를 게시글 DTO에 넣어 사용한다.

 

기존의 게시글 1번, 댓글 1번, 유저 N + 1번 발생하던 쿼리가 게시글 1번, 댓글 1번으로 댓글 조회 시 같이 유저 정보를 가져와 쿼리를 최적화할 수 있다.

 

 

유저 정보를 가져올 때, 아이디 정보가 아닌 상세 유저 정보도 같이 가져오는 문제

유저의 신상정보가 들어있는 인포 테이블이 필요없는 곳에서도 유저 테이블과 같이 쿼리를 보냄.

 

원인 파악

 

유저 엔티티 설계에서 유저와 유저신상 정보의 OneToOne관계에서 유저신상 정보 쪽에서 외래 키를 관리해서 발생하는 문제로 확인하였다.

 

해결 방안

 

유저와 유저신상 정보의 관계매핑을 OneToOne 양방향 관계에서 별도로 유저신장 정보만을 사용하는 부분은 없어 유저 엔티티에서 키를 관리하고 단방향 매핑으로 수정을 한다.

 

유저 엔티티만 사용하는 서비스에서 유저 신상 정보를 추가적으로 쿼리발생을 하지 않도록 방지할 수 있다.