LostCatBox

JPA N+1 문제와 해결법(수정중)

Word count: 212Reading time: 1 min
2023/01/02 Share

참조

https://medium.com/geekculture/jpa-entitygraphs-a-solution-to-n-1-query-problem-e29c28abe5fb

https://jojoldu.tistory.com/165

https://wwlee94.github.io/category/blog/spring-jpa-n+1-query/

https://maivve.tistory.com/340

강추

https://mangchhe.github.io/jpa/2021/01/31/N1Problem/

왜?

면접 준비중, JPA는 N+1 문제의 이해와 해결방법에 대해 질문받았다는 내용을 보았고, 실무에서 사용시에도 일어날수있는 상황임을 인지하고, 자세히 알아보고 해결책은 어떤것이 있는지 궁금했다.

-> 김영한의 JPA를 반드시 들어야겠다.! 진짜.. JPA 자체 내용을 잘 모르니, 무슨말인지도 모르겟다. 다시 학습하자.

N+1 Query Problem

단순히 말하면, 부모와 자식이 1:N 인 관계에서 부모 테이블에서 조회문이 실행(1번)되어 N개의 레코드가 조회된다면, JPA 내부에서 자식테이블에 대한 N개의 조회문이 생긴다는것이다.

따라서 부모에 대한 조회문 1개가 일어날때, N개의 조회문이 jpa 내부적으로 실행된다. 따라서 N+1 Query Problem이다.

예시

DB설계

DB

(작성중)

카타시안 곱
발생가능한 모든 경우의 수의 행이 출력되는 것을 의미
이 현상은 조인 조건을 생략한 경우이거나 조인 조건이 부적합할 경우 발생합니다.

해결책

Join Fetch 사용

조회시 바로 가져오고 싶은 Entity 필드를 지정하는 것이다.

내부적으로 inner join SQL문으로 가져오는 것이다

JPA EntityGraphs 사용

EntityGraphs provides a way to formulate better performing queries by defining which entities need to be retrieved from the database using SQL JOINS.

내부적으로 Outer join SQL문으로 가져오는 것이다.

CATALOG
  1. 1. 참조
  2. 2. 왜?
  3. 3. N+1 Query Problem
  4. 4. 예시
    1. 4.1. DB
  5. 5. 해결책
    1. 5.1. Join Fetch 사용
    2. 5.2. JPA EntityGraphs 사용