JPA N+1 문제

한바울·2023년 2월 24일
0

스터디

목록 보기
3/4

JPA에서 1:N 관계의 엔티티 사이에서 발생하는 N + 1 문제를 해결하는 방법은 무엇인가요?

  • fetch join 이용하여 해결 합니다.

1:N 보고나서 더 공부해야 되는 부분

  • 1:N관계의 테이블을 실제로 join 쿼리를 이용하면 어떻게 되는가?
  • 예를들어 부모테이블이 1건, 자식테이블이 10건이 있을 때 join 쿼리를 날리면 몇건이 조회 되는가?
  • FetchType이란? fetch join시 fetch Type 사용 못하는 이유
  • fetch join 사용할 시 페이징 처리를 못하는 이유

N+1 문제란?

1:N 관계의 테이블에서 나타나는 문제이다.
(예를들면 부서[dept]와 사원[employee] 관계, 1개의 부서에 10명의 사원이 종속되어 있다고 가정한다.)

// 부서를 조회하는 쿼리
List<Department> dept = deptRepository.findAll();

위 쿼리를 실행시키면 . . .

# Hibernate Log
1   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
2   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
3   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
4   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
5   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
6   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
7   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
8   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
9   SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;
10  SELECT * FROM DEPARTMENT d LEFT JOIN employee e ON e.departmentId = d.id;

Hibernate는 위 코드처럼 행 개수만큼 조회를 한다.(10명의 사원만큼)
(임의로 적는거라 Hibernate 쿼리랑은 다를 수 있지만 10개 조회한다는 내용만 숙지 할 것)

@Query("select d from department d join fetch d.employees")
List<Department> findAllJoinFetch();

위 현상을 해결하기위해 fetch join 을 사용한다.
JPA Repository에서 지원하진 않고 JPQL로 수기 작성 해야 함.

단점은 FetchType을 사용할 수 없고 페이징처리를 못 함

profile
몰두하는 사람

0개의 댓글