inflearn logo
강의

Course

Instructor

Practice! Querydsl

count 쿼리 관련 질문입니다!

Resolved

75

tnals724414593

1 asked

0

[질문 내용]
안녕하세요 영한님! 강의 잘 듣고 있습니다.

수강 중 궁금한 점이 생겨 질문드립니다!

스프링 데이터 페이징 활용1 - Querydsl 페이징 연동

-> 이 강좌 수강 중에 생긴 궁금증입니다

 

count 쿼리 같은 경우는 아래와 같이 long 타입의 변수를 통해 저장되고 있습니다.

long count = queryFactory
        .select(member.count())
        .from(member)
        .leftJoin(member.team, team)
        .where(
                usernameEq(condition.getUsername()),
                teamNameEq(condition.getTeamName()),
                ageGoe(condition.getAgeGoe()),
                ageLoe(condition.getAgeLoe())
        )
        .fetchOne();

위 조건은 저희가 쿼리를 통해 조회하는 데이터의 총 개수를 반환하는데, 그렇다면 아래와 같은 방식으로 총 개수를 구하면, count 쿼리를 굳이 사용할 필요 없이 1회의 쿼리만으로 PageImpl 객체를 반환할 수 있지 않을까? 라는 생각이 들었습니다.

 

long size = result.size();

이 size 기반 방식이 데이터 수가 적을 때 채용해볼 만한 방식인지, 아니면 count 쿼리를 사용했을 때,

쿼리를 한 번 더 날릴 정도의 이점이 있는지 궁금합니다!

 

제 개인적인 생각입니다만 데이터 수가 특정 수치를 넘어가면 성능에 차이가 생기는 걸까요..?

java jpa

Answer 1

1

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 김수민님.

질문 주신 내용은 페이징 처리 시 count 쿼리 사용 여부에 대한 고민이시군요. 페이징 처리에서 count 쿼리를 사용하게 되는 이유와, result.size()를 사용하는 방식에 대해 각각의 장단점을 알아보겠습니다.

Count 쿼리를 사용하는 이유

  1. 정확한 총 개수 확인: 페이징을 구현할 때, 데이터베이스에 저장된 전체 데이터의 총 개수를 정확히 알아야 페이지의 총 개수를 계산할 수 있습니다. count() 쿼리는 정확한 전체 카운트를 반환합니다.

  2. 대규모 데이터 처리: result.size()는 현재 가져온 데이터의 크기를 반환할 뿐, 조건에 맞는 전체 데이터의 크기를 계산하지 않습니다. 즉, 이는 일부 데이터 페칭에서만 유효하며, 전체 카운트를 계산하는 데는 부적절할 수 있습니다.

result.size()를 사용할 때의 문제점

  • 제한된 정확성: 페이징 시 가져오는 데이터 집합의 크기만 알 수 있으며, 전체 데이터셋의 정확한 크기를 반영하지 않습니다. 이는 조건에 따라 달라질 수 있습니다.
  • 성능 문제: 데이터가 많을 경우 전체 데이터를 가져와서 사이즈를 계산하기 때문에, 전체 데이터셋을 처리하는 데 성능 저하가 발생할 수 있습니다.

성능상 이점

  • 데이터가 적을 때 result.size()를 사용하면 count 쿼리를 추가적으로 요청하지 않기 때문에 빠를 수 있습니다. 하지만 데이터가 많아지면 전체 데이터를 모두 메모리에 올려 처리해야 하는 상황이 발생할 수 있어 성능이 낮아질 수 있습니다.

결론

페이징 처리 시 데이터의 정확한 총 카운트를 알아야 한다면 count 쿼리를 사용하는 것이 정확하고 안전합니다. 데이터가 적어 성능 저하가 문제 되지 않는 상황에서는 result.size()를 고려할 수도 있지만, 일반적으로는 count 쿼리를 사용하는 것이 더 좋습니다. 이러한 결정은 애플리케이션의 요구사항에 따라 달라질 수 있습니다.

관련하여 더 자세한 설명을 원하시면 이 기존 답변을 확인해 보실 수 있습니다.

저는 김수민님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

SpringBoot 4.X에서의 Querydsl 설정

0

84

2

querydsl 오픈소스에 대한 질문

0

70

1

예제에서의 카운트 쿼리에서 join문과 where문은 필요없지 않나요?

0

108

1

Querydsl 6.X버전에 대해서 어떻게 생각하시나요?

0

316

2

여러 테이블 조인하여 통계치를 구하고자 할 때 어떤 방법이 더 효율적일까요

1

68

1

fetchResults()는 더이상 권장되지 않는다는데 맞나요?

0

160

1

querydsl sum() 메서드 없어요.

0

158

2

build 디렉터리 생성

0

135

2

자바 ORM 표준 JPA 프로그래밍 - 기본편 듣고 바로 학습해도 괜찮을까요?

0

113

2

현재 Querydsl에서 from절 서브쿼리를 지원하나요?

0

90

1

오타 제보 드립니다.

0

70

2

벌크 연산과 flush, clear

0

76

1

Run As Intellij 로 변경시 Q타입 import 불가

0

87

1

QHello import하기 문제 발생

0

147

2

등록된 함수 보는법(H2Dialect) 질문

0

68

2

5.0부터 Querydsl은 향후 fetchCount() , fetchResult() 를 지원하지 않기로 결정했다고 하는데 이에 맞는 강의

1

195

2

[환경설정 PDF 부트 3.0이후 설명 질문] build.gradle에 compileQuerydsl을 정의하지 않은 상태에서 Gradle->Tasks->other->compileQuerydsl을 클릭하라고 하는 이유가 무엇인가요??

1

200

1

querydsl 설정 문제

0

222

2

quey dsl 설정부분

0

158

2

stringtemplate를 이용하여 where절 검색 방법 질문 드립니다.

0

89

1

답변부탁드리겠습니다.

0

89

2

(OrderSpecifier)관련 내용 어디있을가요

0

64

1

중급문법 벌크연산에서

0

81

2

OpenFeign/QueryDSL 관련 정보 공유

2

695

1