H3-1. 조회건 수 제한 (일반적인 Case)

@Test // Paging
public void testPagingV1(){
    List<Slave> slaves = queryFactory
            .selectFrom(slave)
            .orderBy(slave.slaveName.desc())
            .offset(0) // 0부터 시작
            .limit(2) // Size 2
            .fetch();

    assertThat(slaves).hasSize(2);
}

H3-2. 전체 조회 수 필요

@Test // Paging V2
public void testPagingV2() {
    QueryResults<Slave> slaves = queryFactory
            .selectFrom(slave)
            .orderBy(slave.slaveName.desc())
            .offset(0) // 0부터 시작
            .limit(2) // Size 2
            .fetchResults();

    // fetchResults()는 전체 개수도 가져온다.
    // -> 성능 상의 이슈로 Deprecated 되었다. (대신 fetchCount()를 사용하자)

    assertThat(slaves.getResults()).hasSize(2);
    assertThat(slaves.getTotal()).isEqualTo(4); // 전체 개수 확인
    assertThat(slaves.getOffset()).isEqualTo(0); // offset 확인
    assertThat(slaves.getLimit()).isEqualTo(2); // limit 확인

    System.out.println("⚠️⚠️⚠️⚠️Slaves: " + slaves.getResults());
}
select s1_0.slave_id,s1_0.age,s1_0.master_id,s1_0.slave_name from slave s1_0 order by s1_0.slave_name desc limit 0,2;
⚠️⚠️⚠️⚠️Slaves: [Slave(id=4, slaveName=slave4, age=40), Slave(id=3, slaveName=slave3, age=30)]

H3-3. 성능 최적화 (권장) 전체 조회수

@Test // Recommended Paging instead of fetchResults()
public void testPagingV3() {
    //long total = queryFactory
    //        .selectFrom(slave)
    //        .fetchCount(); // 전체 개수만 가져온다. -> Deprecated 되었다.

    long total = Optional.ofNullable(
        queryFactory.select(slave.count())
                .from(slave)
                .fetchOne()
        ).orElse(0L);

    List<Slave> slaves = queryFactory
            .selectFrom(slave)
            .orderBy(slave.slaveName.desc())
            .offset(0) // 0부터 시작
            .limit(2) // Size 2
            .fetch();

    assertThat(slaves).hasSize(2);
    assertThat(total).isEqualTo(4); // 전체 개수 확인

    System.out.println("⚠️⚠️⚠️⚠️Slaves: " + slaves);
}