JPA 성능 최적화 설정

Gyeongjae Ham·2023년 8월 16일
0

JPA

목록 보기
12/12
post-thumbnail

default_batch_fetch_size

  • OneToMany 관계의 컬렉션 조회 최적화 시 사용합니다
  • 예를 들어서 상품을 여러개 주문한 상황이라고 생각해봅니다
    • default_batch_fetch_size를 적용하지 않았다면, order_item을 가져올 때, order의 개수만큼 order_item을 가져오는 쿼리를 실행하게 됩니다
// 1. 해당 회원의 주문 엔티티 일부 조회
Page<Order> orders = orderRepository.findOrderWithEmail(email, pageable);

// 2. 지연 로딩으로 orderItems 조회 및 로그 출력
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로 설정하는게 좋습니다
profile
Always be happy 😀

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

글 잘 봤습니다.

답글 달기