오늘은 프로젝트를 했다.
게시글을 조회할 때 다른 테이블을 참조해서 조회를 해야 하기 때문에 N+1문제가 발생하였다.
🔻 N+1이란
처음에는 image가 여러 개이면 여러 번 검색해서 해야되서 N+1문제가 발생했다.
그래서 어떻게 할 까 하다가 fetch를 하기로 했다.
@Query("SELECT DISTINCT f FROM Feed f " +
"LEFT JOIN FETCH f.images " +
"LEFT JOIN FETCH f.user " +
"WHERE f.user.email = :email")
Page<Feed> findByUserEmailOrderByUpdatedAtDesc(@Param("email") String email, Pageable pageable);
이러면 join을 하는데 feed와 images, user도 전부 조인하기 때문에 쿼리가 한 번만 진행될 것이다.
과면!
Hibernate:
/* SELECT
DISTINCT f
FROM
Feed f
LEFT JOIN
FETCH
f.images
LEFT JOIN
FETCH
f.user
WHERE
f.user.email = :email
order by
f.createdAt desc */ select
distinct f1_0.feed_id,
f1_0.content,
f1_0.created_at,
i1_0.feed_id,
i1_0.image_id,
i1_0.image_name,
f1_0.likes_count,
f1_0.updated_at,
u1_0.user_id,
u1_0.deleted_at,
u1_0.email,
u1_0.is_deleted,
u1_0.nickname,
u1_0.password,
u1_0.profile_image
from
feed f1_0
left join
image i1_0
on f1_0.feed_id=i1_0.feed_id
left join
user u1_0
on u1_0.user_id=f1_0.user_user_id
where
u1_0.email=?
order by
f1_0.created_at desc
이렇게 image와 feed, user가 한 번에 조인되서 나온다.
심지어 query도 1개다.