24.09.04

윤지현·2024년 9월 5일

TIL

목록 보기
57/75

오늘은 프로젝트를 했다.
게시글을 조회할 때 다른 테이블을 참조해서 조회를 해야 하기 때문에 N+1문제가 발생하였다.


🔻 N+1이란

  • 데이터베이스나 ORM (Object-Relational Mapping) 시스템에서 발생하는 성능 문제
    • 데이터베이스에 많은 쿼리를 보내게 되어 성능 저하가 일어남
    • 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개다.

profile
첫 시작

0개의 댓글