default_batch_fetch_size
OneToMany
관계의 컬렉션 조회 최적화 시 사용합니다
- 예를 들어서 상품을 여러개 주문한 상황이라고 생각해봅니다
default_batch_fetch_size
를 적용하지 않았다면, order_item
을 가져올 때, order
의 개수만큼 order_item
을 가져오는 쿼리를 실행하게 됩니다
Page<Order> orders = orderRepository.findOrderWithEmail(email, pageable);
for (Order order : orders) {
List<orderItems> orderItems = order.getOrderItems();
log.info(orderItems);
}
default_batch_fetch_size
를 적용했을 경우 order_item
을 가져올 때, in
쿼리로 주문 엔티티와 연관된 주문 상품 엔티티들을 쿼리 1번으로 조회합니다
- batch size는 100 ~ 1000 사이를 권장합니다 -> DB와 애플리케이션 부하 고려해서 결정
- 오라클의 경우 in 절에 들어갈 수 있는 최대 파라미터의 개수는 1000개입니다(
PostgreSQL
의 경우는 꽤 큰 듯합니다)
OSIV(Open-Session-In-View)
- OSIV 설정 값: default 값이 true
- View 렌더링 또는 API 요청일 경우 클라이언트 응답까지 영속성 컨텍스트가 생존

- OSIV 설정을 false로 설정합니다
- 트랜잭션 종료 시점 시(DB 연결 단위) 영속성 컨텍스트가 종료됩니다 => 컨트롤러에서 지연로딩으로 연관된 엔티티 가지고 오려고 하면 에러 발생
- 영속성 컨텍스트를 오래 유지하면 DB Connection도 오래 가지고 있으므로 DB Connection이 부족할 수 있습니다 => 실시간 트래픽이 중요한 API 애플리케이션에서는 false로 설정하는게 좋습니다

글 잘 봤습니다.