Fetch Join

2024. 7. 19. 21:48TIL

✔오늘 배운 중요한 🔑 point

  • Fetch Join은 2개 이상의 엔티티를 한번의 SQL 쿼리로 가져오는 것이다.
  • Fetch Join은 대용량 데이터를 처리할 때 유용하다.

🎯 오늘 배운 내용

 

Fetch Join이란?

Fetch join은  두 개 이상의 엔티티를 한 번의 SQL 쿼리로 조인하여 필요한 데이터를 모두 한 번에 가져오는 것
일반적으로 @OneToMany, @ManyToOne, @OneToOne, @ManyToMany와 같은 관계에서 많이 사용된다.

 

Fetch Join을 사용해야 하는 이유?

  1. 성능 최적화:
    • N+1 문제 해결: 일반적으로 JPA를 사용하면서 연관된 엔티티를 가져올 때 N+1 문제가 발생할 수 있는데 Fetch join을 사용하면 단일 쿼리로 모든 필요한 데이터를 한 번에 가져올 수 있어 이러한 문제를 해결할 수 있다.
  2. 즉시 로딩:
    • Fetch join을 사용하면 연관된 엔티티를 즉시 로딩할 수 있다. 이는 지연 로딩(Lazy Loading)을 피하고, 한 번의 쿼리로 모든 데이터를 로딩하여 성능을 향상시킨다.

 

 

Fetch Join의 이점

  1. 쿼리 수 감소:
    • 여러 개의 쿼리를 실행하지 않고도 단일 쿼리로 모든 데이터를 가져올 수 있어 데이터베이스에 대한 부하를 줄일 수 있습니다.
  2. 간결한 코드:
    • Fetch join을 사용하면 코드가 더 간결해지고, 데이터 로딩을 위한 추가적인 로직이 필요 없게 되어 코드의 가독성과 유지보수성이 향상된다.
  3. 일관된 성능:
    • Fetch join을 통해 데이터 로딩 시 발생할 수 있는 성능 변동성을 줄일 수 있습니다. 이는 특히 대용량 데이터를 처리할 때 유용하다.

 

 

Fetch Join 프로젝트 적용

 

override fun findPromotionWineList(pageable: Pageable): Page<WinePromotion> {

    val results = queryFactory.selectFrom(winePromotion)
        .leftJoin(winePromotion.wine, wine).fetchJoin()
        .offset(pageable.offset)
        .limit(pageable.pageSize.toLong())
        .orderBy(*getOrderSpecifier(pageable, winePromotion))
        .fetch()

    val countQuery = queryFactory.select(winePromotion.count()).from(winePromotion).fetchOne()

    return PageImpl(results, pageable, countQuery!!)
}

 

🤔 어떻게 활용할까?

지금 현재 WinePromotion의 데이터 양이 많지 않아 Fetch Join에 대한 효과를 기대하기 어렵지만, 서비스가 지속되며 WinePromotion의 데이터가 쌓이게 되면 Fetch Join에 대한 성능향상을 기대할 수 있을 것이다.

📓 오늘의 한줄

"Problems are not stop signs, they are guidelines."

- Robert H. Schuller -