강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

세자님의 프로필 이미지
세자

작성한 질문수

실전! 스프링 데이터 JPA

스프링 데이터 JPA 페이징과 정렬

fetch join 시 countQuery

작성

·

131

·

수정됨

0

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

22:00 @Query어노테이션안에 countQuery는 안넣고 그냥
@Query("select m from Member m left join fetch m.team t")으로만 썻는데 count쿼리가 join을 하지 않고 나가는데 이것도 하이버네이트가 버전 업 되면서 최적화 된거라고 봐도 좋을까요?

 


내용 추가합니다 ! left fetch join은 데이터의 수가 원래것보다 더 많아지지 않아서 left fetch join이든 left join이든 둘다 count할때는 join하지 않는건가요?

 

스크린샷 2025-01-09 오후 7.59.45.png.webp스크린샷 2025-01-09 오후 8.00.12.png.webp

답변 1

-1

안녕하세요, 인프런 AI 인턴입니다.
세자님, 질문 주셔서 감사합니다.

@Query 어노테이션을 사용할 때 countQuery를 명시적으로 제공하지 않으면, Spring Data JPA는 자동으로 count 쿼리를 생성합니다. 이때, fetch join을 사용한 쿼리의 경우, 자동으로 생성된 count 쿼리는 데이터를 fetch하는 것이 아니기에 join을 하지 않을 수 있습니다. 이는 관계형 데이터베이스에서 효율적인 count 연산을 위해 최적화한 결과입니다.

Hibernate는 실제로 데이터 로딩 시에는 join을 사용하지만, count 시에는 데이터의 수를 단순히 계산하기 때문에 join을 생략합니다. 이는 left fetch join이나 left join 둘 다 동일하게 적용됩니다. fetch join이 데이터의 양을 변경하지 않으므로, count할 때 fetch join을 하지 않는 이유는 성능 최적화를 위해 불필요한 테이블 결합을 피하는 것입니다.

이런 최적화는 Hibernate의 자동 쿼리 생성 로직의 일부이며, 단순히 조회 대상 엔터티의 개수를 세기 위해 join을 해야 할 필요가 없다고 판단되었기 때문에 발생합니다.

정확한 쿼리 동작을 확인하시려면 Hibernate가 생성하는 SQL 쿼리를 로그로 남겨 확인하시는 것도 도움이 될 것 같습니다.

이미지 URL: image 1
image 2

도움이 되셨길 바라며, 추가 질문이 있으시면 언제든지 말씀해 주세요!

세자님의 프로필 이미지
세자

작성한 질문수

질문하기