참조
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문으로 가져오는 것이다.