N+1 문제란?
요청이 1개의 쿼리로 처리되길 원했는데 N개의 쿼리가 발생
OneToMany일때
지연(Lazy) 로딩이란?
- 외래관계에 있는 객체를 proxy로 미리 채워놓고 나중에 가져오는 것.
Lazy와 N+1
즉시(Eager)로딩일때
- JPA는 조회 대상이 되는 Entity 위주의 쿼리문을 생성
- 후에 연관 Entity가 있다는걸 알고 fetch 전략을 확인
- 다시 연관 Entity를 가져오는 쿼리문을 실행 => N+1
fetch join은 만능인가?
- 문제 상황: OneToMany 관계의 페이징
- 페이징에서 가져오길 원하는 수는 고정됨
- 하지만 fetch join은 limit 없이 모든 데이터를 가져옴
- 메모리에서 모든 데이터를 페이징 만큼 가져옴
- 메모리 부하가 걸릴 수 있음
=> 해결 방법: fetchSize를 설정