N+1 문제(N+1 Query Problem)는 ORM(Object-Relational Mapping) 프레임워크(예: JPA, Hibernate)를 사용할 때 자주 발생하는 비효율적인 쿼리 문제이다
예를 들어, 다음과 같은 관계가 있다고 가정해보면,
Store (가게)와 Order (주문)는 1:N 관계이다먼저 1개의 쿼리로 N개의 Store를 조회한다
SELECT * FROM store;
👉 여기까지는 괜찮다
그리고 각 Store에 연결된 Order를 Lazy Loading으로 가져오게 되면,
각 Store마다 1개의 쿼리가 추가로 실행된다
→ 즉, Store가 10개면 다음과 같은 쿼리가 10번 더 실행된다
SELECT * FROM order WHERE store_id = ?; -- 10번 실행
1 (Store 목록 조회) + N (각 Store의 Order 조회) = N + 1 쿼리
이게 바로 N+1 문제이다
Store가 많을수록, 쿼리도 기하급수적으로 늘어나면서 성능 저하가 발생한다
Fetch Join 사용
SELECT s FROM Store s JOIN FETCH s.orders;
Entity Graph 사용 (JPA)
@EntityGraph(attributePaths = {"orders"})
List<Store> findAll();
BatchSize 설정 (JPA + Hibernate)
| 항목 | 설명 |
|---|---|
| 문제 이름 | N+1 Query Problem |
| 원인 | Lazy 로딩된 연관 엔티티를 반복적으로 조회할 때 |
| 결과 | 쿼리가 N + 1개 실행되어 성능 저하 발생 |
| 해결 방법 | Fetch Join, EntityGraph, BatchSize 등 사용하여 즉시 로딩 처리 |