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();
}
댓글