이론/JPA
N+1 문제란?
모달조아
2022. 12. 18. 19:04
- N+1 문제란 무엇일까?
- 연관관계가 있는 엔티티를 조회할 경우 조회된 데이터의 갯수(N) 만큼 조회 쿼리가 추가로 발생하는 문제
- N+1 문제 발생 이유
- JpaRepository 가 JPQL 로 쿼리를 실행할 때는 Fetch 전략을 따르지 않고 JPQL 자체만을 이용하기 때문이다. JPQL 은 엔티티 객체와 필드를 가지고 쿼리를 한다. JPQL 입장에서는 연관관계를 모르고 해당 엔티티를 기준으로만 쿼리를 만든다. 그렇기 때문에 연관된 엔티티 데이터가 필요한 경우, Fetch 전략으로 지정한 시점에 조회를 별도로 호출하게 된다.
- 해결 방법
- Fetch join
- 정의
- JPQL 을 이용하여서 DB에서 데이터를 가져올 때 처음부터 연관된 데이터까지 같이 가져오게 하는 방법
- 단점
- 연관관계 설정해놓은 Fetch 전략을 사용할 수 없다. Fetch join을 사용하게 되면 데이터 호출 시점에 모든 연관 관계의 데이터를 가져오기 때문에 FetchType을 Lazy로 해놓는것이 무의미하다.
- 하나의 쿼리로 데이터를 가져오다보니 페이징 단위로 데이터를 가져오는 Paging API 사용 불가능
- 정의
- Fetch join