작성
·
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개임을 의미합니다.