JPA N+1 이슈 해결 방법

dev-well-being·2023년 9월 14일
1
post-custom-banner

N+1 문제란?

  • 연관 관계가 설정된 엔티티를 조회할 경우 조회된 데이터 갯수(n) 만큼 연관 관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상

N+1 문제가 발생하는 이유

  • JPA에서 실행하는 첫 쿼리에서 하위 엔티티까지 한 번에 가져오지 않고, 하위 엔티티를 사용할 때 추가로 조회하기 때문에
  • JPQL은 기본적으로 글로벌 Fetch 전략을 무시하고 JPQL만 가지고 SQL을 생성하기 때문에

EAGER(즉시 로딩)인 경우

  • JPQL에서 만든 SQL을 통해 데이터를 조회
  • 이후 JPA에서 Fetch 전략을 가지고 해당 데이터의 연관 관계인 하위 엔티티들을 추가 조회
  • 2번 과정으로 N+1 문제 발생

LAZY(지연 로딩)인 경우

  • JPQL에서 만든 SQL을 통해 데이터를 조회
  • JPA에서 Fetch 전략을 가지지만, 지연 로딩이기 때문에 추가 조회는 하지 않음
  • 하지만, 하위 엔티티를 가지고 작업하게 되면 추가 조회가 발생하기 때문에 결국 N+1 문제 발생

N+1 문제 해결 방법

Fetch Join

  • JPQL을 사용하여 DB에서 데이터를 가져올 때 처음부터 연관된 데이터까지 같이 가져오게 하는 방법
  • @Query 어노테이션을 사용해서 "join fetch 엔티티.연관관계_엔티티" 구문을 만들어 주면 된다.

@Entity Graph

  • @EntityGraph의 attributePaths는 같이 조회할 연관 엔티티명을 적으면 된다.

  • Fetch Join과 @EntityGraph의 출력되는 쿼리를 보면 Fetch Join의 경우 inner join을 하는 반면에 EntityGraph는 outer join을 기본으로 한다.

참고 자료

profile
안녕하세요!! 좋은 개발 문화를 위해 노력하는 dev-well-being 입니다.
post-custom-banner

0개의 댓글