예시
JPA의 N + 1 문제는 연관 관계가 설정된 엔티티를 조회할 경우에, 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 추가로 발생하는 현상이다.
블로그 게시글과 댓글이 있는 경우, 게시글을 조회한 후 각 게시글마다 댓글을 조회하기 위해 추가 쿼리가 발생한다면 N + 1 문제가 발생한다.
블로그 게시글이 10개라면 총 11개의 쿼리(게시글 조회 1개 + 각 게시글의 댓글 조회 10개)가 실행
문제 발생 원인
패치 전략을 Eager Loding(즉시로딩)
으로 가져갔을때 발생하는 문제이다.
이중 Data JPA에서 제공하는 findAll
메서드를 수행할 경우 내부적으로는 select e from Entity e
라는JPQL을 생성하는데, JPQL의 특성상 글로벌 패치 전략을 고려하지 않고 쿼리를 수행한다.
그렇기에 명시적으로 Lazy Loading으로 엔티티 패치전략을 설정하면, findAll() 메서드를 사용할때 N + 1 문제가 발생하지않는다
이는 연관관계에 있는 엔티티를 실제 객체 대신에 프록시 객체로 생성하여 주입하기 때문이다.
하지만 프록시 객체를 사용할 경우에 실제 데이터가 필요하여 조회하는 쿼리가 발생하고 N + 1 문제가 발생할 수 있다.
해결
N + 1 문제를 해결하기 위해서는 fetch join
, @EntityGraph
를 사용하는 방법이 있다.
fetch join
은 연관 관계에 있는 엔티티를 한번에 즉시 로딩해주며, @EntityGraph
도 비슷한 효과를 만들어내며, 쿼리 메서드에 해당 어노테이션을 추가해 사용할 수 있다.
'Tech-Interview' 카테고리의 다른 글
[Redis] Redis Eviction 정책 (0) | 2025.03.07 |
---|---|
사용자 증가에 따른 서버확장 (0) | 2024.12.08 |
JPA ID 생성전략 (0) | 2024.12.06 |
리터럴 String과 new String()의 차이 (0) | 2024.11.13 |
Docker와 컨테이너 (0) | 2024.11.04 |