N+1 문제란?
: JPA에서 지연로딩 전략때문에 발생하는 성능 문제
지연로딩하는 경우(각 객체에 접근할때마다 쿼리를 실행하게 되므로 쿼리수가 기하급수적으로 증가)
@XToMany 관계_에 있는 엔티티를 조회할때
-> 부모 엔티티 가져오는 쿼리 1번 발생
-> 자식 엔티티 가져오는 쿼리 N번 발생
ex) 10개의 게시글을 가져오고 댓글을 가져오기 위해 지연로딩을 사용할때
게시글들 가져오는 쿼리 1번 (N개의 게시글)
각 게시글에 연관된 댓글 가져오는 쿼리 N번
총 1+N번의 쿼리가 발생함
쿼리수 증가 -> 성능 저하, 트래픽 과부화, 서버 부하
1️⃣ fetch join
: 연관된 엔티티를 한번의 쿼리로 가져온다
-) fetch join을 하게되면, 데이터 호출시점에 연관된 데이터를 모두가져오므로 FetchType을 LAZY로 해놓는게 무의미함
-) 하나의 쿼리문으로 가져오다보니, 페이징 처리가 불가능하다
2️⃣ 페이징 처리
: 한번에 가져올 entity개수를 제한함 - @BatchSize(Size=n)
즉시 로딩이어서 발생하는 것은 아니다.
3️⃣ Entity Graph
: JPA 2.1 부터 추가된 Entity Graph를 이용해 연관된 객체들을 어떻게 로드할지 세밀하게 제어가능