-
join fetch와 left join fetch의 차이프로젝트/Trend-Pick 2023. 9. 18. 22:11
쿼리를 최적화할 때 join fetch를 사용해서 최적화했다.
배포를 완료하고 테스트 하는데 계속해서 내가 올린 사진, 게시글들이 마이페이지에 올라오지 않는 문제점이 발생했다.
이 문제로 거의 일주일동안 고민했다. 내가 고친 것이라고는 fetch join으로 성능 최적화를 한 것밖에 없는데.. 중간에 네트워크에서 오류가 생겼나? 데이터에 에러가 나고있나? 라는 생각들이 들었다.
결국 처음으로 돌아와서 repository 계층에 있는 쿼리문에서 하나하나 조건을 빼가며 테스트를 해보았다.
public List<Picture> MyPagePicture(Long memberId) { return em.createQuery("select p from Picture p join fetch p.likes l " + "where p.picture_member.id = :id order by p.pictureTime desc", Picture.class) .setParameter("id", memberId) .getResultList(); }
이 쿼리문에서 "left join fetch p.likes l"이라는 문장만 지웠는데 내가 원하는 데이터가 잘 반환되는 것을 확인할 수 있었다.
하지만 저렇게 한다면 사진 하나당 좋아요 수를 받아오는 데 계속해서 쿼리를 날리게 될 것이다.
구글링을 통해 left join에 대해 검색을 해보던 도중에 재밌는 사실을 발견 했다.
그 사실은 바로 fetch join은 join하는 엔티티에 대한 데이터가 없다.
inner join은 picture에 매칭되는 like가 있어야지 반환이 되는데 올린 사진에 아무도 좋아요를 누르지 않았을 때에는 사진 자체가 반환이 안되는 것이다.
그렇기 때문에 join fetch가 아니라 left join fetch로 바꿔줬다.
public List<Picture> MyPagePicture(Long memberId) { return em.createQuery("select p from Picture p join fetch p.likes l " + "where p.picture_member.id = :id order by p.pictureTime desc", Picture.class) .setParameter("id", memberId) .getResultList(); }
join fetch로 작성했을 때에는 비어있었던 pictures 배열에 기존에 넣었던 데이터가 잘 나오는 것을 확인했다.
페치 조인이 쿼리 최적화에 유용하지만 그 전에 join이 어떻게 이루어지는지 아는 것이 중요하다. 단순히 쿼리 최적화에 집중을 할 것이 아니라 sql 자체를 이해하고 잘 다룰 수 있도록 공부가 필요하다는 생각이 들었다.
'프로젝트 > Trend-Pick' 카테고리의 다른 글
fetch join으로 성능 최적화 (0) 2023.08.16 AWS S3를 이용한 사진 저장 (0) 2023.07.31 자바 코드로 정렬 vs db에서 특정 값을 정렬해서 select (0) 2023.07.28 비어있을 수도 있는 객체의 조회 -> Optional 사용 (0) 2023.07.27 @RequestParam과 @RequestBody의 차이점 (0) 2023.07.22