개발/부트캠프

본캠프 : 심화 개인 과제_N+1 문제

EJ EJ 2025. 2. 27. 10:43

N+1 문제

: JPA가 연관된 엔티티를 조회할 때 추가적인 쿼리(N개)를 반복적으로 실행하기 때문에 발생하는 문제

 

Lazy Loading

지연 로딩(Lazy Loading)은 데이터를 실제로 사용할 때 데이터베이스에서 조회하는 방식(N+1 문제 발생)

 

Eager Loading

즉시 로딩(Eager Loading)은 엔티티를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식

 

Entity클래스에서 해당 필드의 Fetchtype을 Eager로 설정하면 N+1 문제가 발생하지 않는다.

하지만 연관된 객체를 매번 함께 조회하는것은 낭비인 경우가 있다.

 

해결방안

Fetchtype을 Lazy로 설정하되 추후에 쿼리를 작성할 때 fetch join을 사용하여 해당 부분은 Eager로 동작하게 한다.

 

Fetch join

JPQL에서 성능 최적화를 위해 fetch join을 제공하며 연관된 엔티티나 컬렉션을 SQL 한번으로 조회할 수 있도록 해주는 기능이다. fetch join은 SQL의 JOIN과는 다른 종류이고 객체 그래프를 SQL 한 번에 조회한다. 실무에서 굉장히 많이 활용한다.

 

추가로 fetch join과 동일한 동작을 하는 @EntityGraph와 @Batchsize가 있다.

  • Fetch Join:
    • 단순 조회 및 연관 엔티티가 많지 않은 경우
    • 페이징 처리가 필요 없는 상황
  • EntityGraph:
    • 재사용 가능한 로딩 전략이 필요한 경우
    • 특정 쿼리에서만 연관 데이터 로딩 제어가 필요할 때
  • BatchSize:
    • 대규모 데이터셋 조회 시 일괄 로딩으로 최적화가 필요할 때