Fetch Join
2024. 7. 19. 21:48ㆍTIL
✔오늘 배운 중요한 🔑 point
- Fetch Join은 2개 이상의 엔티티를 한번의 SQL 쿼리로 가져오는 것이다.
- Fetch Join은 대용량 데이터를 처리할 때 유용하다.
🎯 오늘 배운 내용
Fetch Join이란?
Fetch join은 두 개 이상의 엔티티를 한 번의 SQL 쿼리로 조인하여 필요한 데이터를 모두 한 번에 가져오는 것
일반적으로 @OneToMany, @ManyToOne, @OneToOne, @ManyToMany와 같은 관계에서 많이 사용된다.
Fetch Join을 사용해야 하는 이유?
- 성능 최적화:
- N+1 문제 해결: 일반적으로 JPA를 사용하면서 연관된 엔티티를 가져올 때 N+1 문제가 발생할 수 있는데 Fetch join을 사용하면 단일 쿼리로 모든 필요한 데이터를 한 번에 가져올 수 있어 이러한 문제를 해결할 수 있다.
- 즉시 로딩:
- Fetch join을 사용하면 연관된 엔티티를 즉시 로딩할 수 있다. 이는 지연 로딩(Lazy Loading)을 피하고, 한 번의 쿼리로 모든 데이터를 로딩하여 성능을 향상시킨다.
Fetch Join의 이점
- 쿼리 수 감소:
- 여러 개의 쿼리를 실행하지 않고도 단일 쿼리로 모든 데이터를 가져올 수 있어 데이터베이스에 대한 부하를 줄일 수 있습니다.
- 간결한 코드:
- Fetch join을 사용하면 코드가 더 간결해지고, 데이터 로딩을 위한 추가적인 로직이 필요 없게 되어 코드의 가독성과 유지보수성이 향상된다.
- 일관된 성능:
- 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 -
'TIL' 카테고리의 다른 글
QueryDslSupport (0) | 2024.07.21 |
---|---|
Serializing PageImpl instances as-is is not supported 경고 발생 (0) | 2024.07.20 |
최종 프로젝트 (7일차) (0) | 2024.07.18 |
@AfterEach 그리고 @DirtiesContext (테스트 코드) (0) | 2024.07.17 |
Cannot convert existing claim value of type 'class java.lang.Integer' to desired type 'class java.lang.String'. 오류 (0) | 2024.07.16 |