시작 전에 다시 복습을 해봅시다.

컬렉션에서 페치 조인을 하면 페이징 불가

컬렉션을 페치 조인하면 페이징이 불가능합니다.

컬렉션을 페치 조인하면서 페이징하는 경우 하이버네이트는 경고 로그를 남기고 모든 DB 데이터를 읽어서 메모리에서 페이징을 시도합니다. 최악의 경우 장애로 이어질 수 있습니다.

페이징하면서 컬렉션 엔티티를 함께 조회하는 방법

그러면 페이징하면서 컬렉션 엔티티를 함께 조회하려면 어떻게 해야할까요?

지금부터 코드도 단순하고, 성능 최적화도 보장하는 매우 강력한 방법을 소개하겠습니다. 대부분의 페이징 + 컬렉션 엔티티 조회 문제는 이 방법으로 해결할 수 있습니다.

  1. 먼저 ToOne(OneToOne, ManyToOne) 관계를 모두 페치조인 합니다. ToOne 관계는 row수를 증가시키지 않으므로 페이징 쿼리에 영향을 주지 않습니다.
  2. 컬렉션은 지연 로딩으로 조회합니다.
  3. 지연 로딩 성능 최적화를 위해 hibernate.default_batch_fetch_size , @BatchSize 를 적용합니다.