N+1문제?
연관 관계가 설정된 엔티티 사이에서 한 엔티티를 조회하였을 때,
조회된 엔티티의 개수(n)만큼 연관된 엔티티를 조회하기 위해 추가적인 쿼리가 발생하는
문제를 의미한다.
- 언제 발생하는가?
- JPA Repository를 활용해 인터페이스 메서드를 호출할 때
- 누가 발생시키는가?
- 1:N 또는 N:1 관계를 가진 엔티티를 조회할 때 발생
- 어떤 상황에 발생되는가?
- JPA Fetch 전략이 EAGER 전략으로 데이터를 조회하는 경우
- JPA Fetch 전략이 LAZY 전략으로 데이터를 가져온 이후에 연관 관계인 하위 엔티티를 다시 조회하는 경우
- 왜 발생하는가?
- JPA Repository로 find 시 실행하는 첫 쿼리에서 하위 엔티티까지 한 번에 가져오지 않고,
하위 엔티티를 사용할 때 추가로 조회하기 때문에
- JPQL은 기본적으로 글로벌 Fetch전략을 무시하고 JPQL만 가지고 SQL을 생성하기 때문에
EAGER인 경우
- JPQL에서 만든 SQL을 통해 데이터 조회
- 이후 JPQ에서 Fetch 전략을 가지고 해당 데이터의 연관 관계인 하위 엔티티들을 추가 조회
- 2번의 과정으로 N+1문제 발생
LAZY인 경우
- JPQL에서 만든 SQL을 통해 데이터를 조회
- JPA에서 Fetch 전략을 가지지만, 지연 로딩이기 때문에 추가 조회는 하지 않음
- 하지만 하위 엔티티를 가지고 작업하게 되면 추가 조회가 발생하기 때문에 결국 N+1문제 발생