N+1 문제란?
연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상
발생 이유
N+1 문제가 발생하는 이유는 JPA가 JPQL을 분석해서 SQL을 생성할 때는 글로벌 Fetch 전략을 참고하지 않고 오직 JPQL 자체만을 사용하기 때문이다. JPA Repository로 find를 할 때 실행하는 첫 쿼리에서 하위 엔티티까지 한 번에 가져오지 않고, 하위 엔티티를 사용할 때 추가로 조회하기 때문에 발생한다.
발생 시점
JPA Repository를 이용해 인터페이스 메소드를 호출할 때(list, read...), 1:N, N:1 관계를 가진 엔티티를 조회할 때 발생 Fetch Type이 Eager이면서 데이터를 조회할 때 Fetch Type이 Lazy이면서, 전체 데이터를 조회한 후 연관 관계인 하위 엔티티를 다시 조회할 때
해결 방법
- BatchSize
@BatchSize(size= n)
BatchSize는 JPA의 성능 개선을 위한 옵션 중 하나이다.
여러 개의 프록시 객체를 조회할 때 where절이 같은 여러 개의 select 쿼리들을 하나의 쿼리로 만들어준다. - EntityGraph
@EntityGraph(attributePaths = "fieldName")
-> 이렇게 사용하면 Lazy가 아닌 Eager 조회로 가져온다. 만약 두 개의 테이블을 한 번에 가져오려면
@EntityGraph(attributePaths = "fieldName", "fieldName2")
-> 위와 같이 사용하면 된다.
'공부' 카테고리의 다른 글
CHAR와 VARCHAR의 차이점 (0) | 2023.09.24 |
---|---|
Java Virtual Machine(JVM) (0) | 2023.09.17 |
JPA와 JPQL (0) | 2023.09.14 |
Cross-Origin Resource Sharing(CORS)와 preflight (0) | 2023.09.03 |
3계층 구조(3-Tier Architecture)란? (0) | 2023.09.01 |