N+1 문제에 대해 설명해 주세요.

  • N + 1 문제란, 하나의 쿼리를 수행하는 데 N개의 쿼리가 더 수행된다는 의미이다.

  • 연관 관계가 설정된 엔티티를 조회할 경우 조회된 데이터 개수만큼 연관 관계의 조회 쿼리가 추가로 발생하여 데이터를 읽는 문제를 말한다.

  • 보통 최적화를 위해 즉시 로딩보다는 지연 로딩을 사용하는데, 지연 로딩은 프록시 객체를 불러오고 이 프록시 객체에서 실제 조회할 때마다 쿼리를 수행하게 된다.

  • 그래서 처음 조회할 때 1번, 이후에 N개의 쿼리가 추가로 수행된다고 해서 N + 1 문제라고 한다.

N + 1 문제 해결방안

  • fetch join

    • JPQL의 페치 조인을 사용하면 지연 로딩으로 설정되어 있어도, 프록시가 아닌 실제 엔티티가 반환된다.

    • @EntityGraph도 페치 조인을 사용한다.

  • @BatchSize

    • 하이버네이트가 제공하는 @BatchSize를 이용하면 연관된 엔티티를 조회할 때 지정한 size만큼 IN 절로 조회한다.

    • 개별 적용은 @BatchSize, 글로벌 설정은 hibernate.default_batch_fetch_size로 설정할 수 있다.

Last updated