반응형
오늘 한 일
Spring Data JPA를 쓰는데 쿼리 메소드로 여러 연관관계를 표시하는게 복잡해서 JPQL을 공부하고 사용했다.
조금 복잡한 조회 조건(좋아요 누른 글 목록을 얻는데, 글 작성자가 비공개 계정이라면 얻을 수 없다)을 쿼리로 작성하려고 하니 서브쿼리 때문에 가독성이 많이 나빠졌다. 그래서 서버에서 글 필터링 조건을 처리할지 고민했는데, 글이 많아지는 경우에 서버가 처리하는 것보다 DB에서 처리할 때 인덱스를 걸어서 가독성은 나쁘지만 조회 속도는 최적화 할 수 있다고 생각했다.
그냥 흘깃 봐도 아래의 쿼리는 보기가 싫어진다.. 더 가독성 좋은 쿼리를 위해서 다음엔 QueryDsl를 사용해야겠다.
// 좋아요를 누른 글 목록 조회(글 작성자가 비공개 상태라면 팔로잉 중일 때만 조회) @Query("select p from Post p where p.isDeleted = false and p.id in " + "(select p2.id from Like l join l.post p2 where l.user.id = :userId and (p2.user.isPrivate = false " + "or (p2.user.isPrivate = true and p2.user.id in " + "(select f.following.id from Follow f where f.follower.id = :userId))))") Page<Post> findPostsByLikes(Long userId, Pageable pageable); // 팔로잉 중인 유저들이 작성한 글 목록 조회 @Query("select p from Post p join p.user u where p.isDeleted = false and (u.id in (" + "select f.following.id from Follow f where f.follower.id = :userId) or u.id = :userId)") Page<Post> findPostsByFollowingUsers(Long userId, Pageable pageable);
반응형
'TIL' 카테고리의 다른 글
50일차.. (0) | 2023.12.15 |
---|---|
[TIL] 46일차 (0) | 2023.12.12 |
[TIL] 44일차 프로젝트 개발 (2) | 2023.12.07 |
[TIL] 43일차 프로젝트 기획 (2) | 2023.12.05 |
[TIL] 42일차 테스트 코드 공부 (1) | 2023.12.04 |