강의

멘토링

로드맵

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

이승은님의 프로필 이미지
이승은

작성한 질문수

querydsl paging 검증 부분

작성

·

173

0

@Test
public void paging1() {
    List<Member> result = queryFactory
            .selectFrom(member)
            .orderBy(member.username.desc())
            .offset(1)  //0부터 시작(zero index)
            .limit(2)   //최대 2건 조회
            .fetch();

    assertThat(result.size()).isEqualTo(2);
}

@Test
public void paging2() {
    QueryResults<Member> queryResults = queryFactory
            .selectFrom(member)
            .orderBy(member.username.desc())
            .offset(1)
            .limit(2)
            .fetchResults();

    assertThat(queryResults.getTotal()).isEqualTo(4);
    assertThat(queryResults.getLimit()).isEqualTo(2);
    assertThat(queryResults.getOffset()).isEqualTo(1);
    assertThat(queryResults.getResults().size()).isEqualTo(2);
}

 

검증 부분에서 왜 total이 4개인가요?

 

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
이승은님의 질문에 답변드리겠습니다.

Querydsl의 fetchResults() 메소드는 조회 결과뿐만 아니라, 페이징 처리를 위한 전체 데이터 개수를 포함하는 QueryResults 객체를 반환합니다. 코드에 주석으로 //최대 2건 조회라고 명시되어있는 것처럼 limit(2)를 사용하여 최대 2건의 데이터를 조회하지만, fetchResults()는 쿼리에 지정된 페이징 조건(offset, limit)에 맞게 데이터를 조회하고, 추가로 전체 데이터의 수(total)도 계산합니다.

total이 4개라는 것은 해당 테스트 상황에서 전체 회원(Member) 데이터가 4개 존재한다는 의미입니다. offset(1)limit(2)를 통해 현재 페이지에서는 두 번째 데이터부터 세 번째 데이터까지 조회하였으며, 결과적으로 2개의 데이터를 가져왔다고 볼 수 있습니다. 그러나 전체 회원 데이터의 수는 4개라서 queryResults.getTotal()은 4를 반환하고 있습니다.

즉, 쿼리를 통해 가져온 데이터의 수(size())와 전체 데이터의 수(getTotal())는 서로 다를 수 있고, 이 경우에는 실제 페이지에 표시될 데이터는 2개이지만 전체 가능한 데이터는 4개임을 의미합니다.

이승은님의 프로필 이미지
이승은

작성한 질문수

질문하기