Inflearn Community Q&A
N + 1 문제 해결 fetch join 관련해서 질문드릴 것이 있습니다!
Written on
·
505
3
안녕하세요. 38강의 N + 1 문제를 해결하기 위한 fetch join 문제 해결과 관련해서 제가 발견(?)한 것을 질문드리고자 합니다!
수업 내용 중 N + 1 문제를 querydsl을 사용해서 해결하는 것을 보여주셨는데요. 코드가 다음과 같았습니다.
class UserRepositoryCustomImpl(
private val queryFactory: JPAQueryFactory
) : UserRepositoryCustom {
override fun findAllWithHistories(): List<User> {
return queryFactory
.select(user)
.distinct()
.from(user)
.leftJoin(userLoanHistory).on(userLoanHistory.user.id.eq(user.id)).fetchJoin()
.fetch()
}
}그러고 테스트를 돌렸을 때 쿼리가 찍히는 걸 보면 다음과 같습니다.

N + 1 문제가 아직 발생하고 있는 것 같습니다.
조금 이상해서 구글링을 해보니 querydsl에서 on 절을 사용하면 두 엔티티가 연관관계라는 것을 인식하지 못 한다고 하네요! 그래서 코드를 다음과 같이 좀 바꿔봤습니다.
class UserRepositoryCustomImpl(
private val queryFactory: JPAQueryFactory
) : UserRepositoryCustom {
override fun findAllWithHistories(): List<User> {
return queryFactory
.select(user)
.distinct()
.from(user)
.leftJoin(user.userLoanHistories, userLoanHistory).fetchJoin()
.fetch()
}
}이렇게 바꾸고 쿼리를 찍히는 것을 확인하니까

한 번에 fetch join 되면서 가져오는 것 같습니다!
한 번 확인해주시면 감사하겠습니다!
javaspringkotlinspring-boot리팩토링
Quiz
JPQL이나 Spring Data JPA의 메서드 이름을 이용한 쿼리 작성 방식의 주된 단점은 무엇일까요?
데이터베이스 종류에 따라 쿼리 문법이 달라진다.
컴파일 시점에는 오류를 감지하기 어렵다.
성능 최적화가 어렵다.
복잡한 조인 쿼리를 작성할 수 없다.







아하 그렇군요! 선생님 역시 꼼꼼하시게 미리 다 업데이트를 해두셨군요👍🏻 감사합니다 ^^