카테고리 없음

N+1 문제

우성팔 2023. 12. 20.

N + 1문제란?

- 엔티티 1개를 조회할 때 1:N 혹은 N:1 관계를 맺고 있을 때 그와 관련된 조회 쿼리문이 N+1번 쿼리가 발생하는 문제

 

 

N + 1 문제 발생 시점

 - 즉시 로딩으로 데이터를 불러오는 경우

 - 지연 로딩으로 불러온 데이터의 하위 데이터를 다시 조회하는 경우

 

 

N + 1 문제 해결방법

  • GlobalFetch
    • 엔티티를 생성할 때 결정되는 연관전략
    • @ManyToOne에 fetch 타입으로 LAZY를 넣어주면 된다
public class Comment {

    ...

    @ManyToOne(fetch = FetchType.LAZY) // fetch 타입으로 LAZY를 넣어줌
    @JoinColumn(name = "thread_id")
    Board thread;
}
  • FetchJoin
    • DB에서 데이터를 가져올 때 처음부터 연관된 엔티티나 컬렉션을 한 번에 조회하는 방법
    • @Query 어노테이션 사용
public interface CommentRepository extends JpaRepository<Comment, Long> {

    @Query("select c from Comment c join fetch c.board")
    List<Comment> findAll();
}
  • EntityGraph
    • EntityGraph 상에 있는 Entity의 연관관계 속에서 필요한 엔티티와 컬렉션을 함께 조회할 때 사용
    • @EntityGraph 어노테이션 사용
      • attributePaths에 쿼리 수행 시 바로 가져올 필드명을 지정하면 Eager타입으로 조회
    • 현업에서 많이 사용
public interface CommentRepository extends JpaRepository<Comment, Long> {

    @EntityGraph(attributePaths = {"thread"}, type = EntityGraph.EntityGraphType.LOAD)
    List<Comment> findAll();
}

 

 

댓글