본 캠프_52일차

졸용·2025년 4월 30일

TIL

목록 보기
53/144

N+1 문제(N+1 Query Problem)ORM(Object-Relational Mapping) 프레임워크(예: JPA, Hibernate)를 사용할 때 자주 발생하는 비효율적인 쿼리 문제이다


📌 N+1 문제란?

예를 들어, 다음과 같은 관계가 있다고 가정해보면,

  • Store (가게)와 Order (주문)는 1:N 관계이다
    → 즉, 하나의 Store는 여러 개의 Order를 가진다

❗ N+1 문제 시나리오

  1. 먼저 1개의 쿼리로 N개의 Store를 조회한다

    SELECT * FROM store;

    👉 여기까지는 괜찮다

  2. 그리고 각 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가 많을수록, 쿼리도 기하급수적으로 늘어나면서 성능 저하가 발생한다


💡 해결 방법

  1. Fetch Join 사용

    SELECT s FROM Store s JOIN FETCH s.orders;
  2. Entity Graph 사용 (JPA)

    @EntityGraph(attributePaths = {"orders"})
    List<Store> findAll();
  3. BatchSize 설정 (JPA + Hibernate)

    • 연관된 엔티티를 일괄로 가져오도록 설정

🔍 정리

항목설명
문제 이름N+1 Query Problem
원인Lazy 로딩된 연관 엔티티를 반복적으로 조회할 때
결과쿼리가 N + 1개 실행되어 성능 저하 발생
해결 방법Fetch Join, EntityGraph, BatchSize 등 사용하여 즉시 로딩 처리
profile
꾸준한 공부만이 답이다

0개의 댓글