개발할 때 데이터가 100만건이 있다고 해봅시다. 사실 100만건을 다 애플리케이션으로 퍼올리는건 불가능하고 적당한 사이즈로 끊어서 정렬이 된 상태로 데이터를 가져와야 하죠. 그래서 꼭 페이징과 정렬은 꼭 필요한 기능입니다.
먼저 순수하게 JPA 로 페이징과 정렬을 어떻게 하는지 알아보겠습니다.
JPA에서 페이징을 어떻게 할까요?
다음 조건으로 페이징과 정렬을 사용하는 예제 코드를 봅시다.
@Repository
public class MemberJpaRepository {
@PersistenceContext
private EntityManager em;
//...1
public List<Member> findByPage(int age, int offset, int limit) {
return em.createQuery("select m from Member m where m.age = :age order by m.username desc", Member.class)
.setParameter("age", age)
.setFirstResult(offset)
.setMaxResults(limit)
.getResultList();
}
//...2
public long totalCount(int age) {
return em.createQuery("select count(m) from Member m where m.age = :age", Long.class)
.setParameter("age", age)
.getSingleResult();
}
}
@Test
void paging() {
//given
memberJpaRepository.save(new Member("member1", 10));
memberJpaRepository.save(new Member("member2", 10));
memberJpaRepository.save(new Member("member3", 10));
memberJpaRepository.save(new Member("member4", 10));
memberJpaRepository.save(new Member("member5", 10));
int age = 10;
int offset = 0;
int limit = 3;
//when
List<Member> members = memberJpaRepository.findByPage(age, offset, limit);
long totalCount = memberJpaRepository.totalCount(age);
//페이지 계산 공식 적용...
// totalPage = totalCount / size ...
// 마지막 페이지 ...
// 최초 페이지 ..
//then
assertThat(members.size()).isEqualTo(3);
assertThat(totalCount).isEqualTo(5);
}
참고로 실무에서는 페이징을 하면 전체 페이지, 처음 페이지, 마지막 페이지 등등을 직접 개발해야합니다. 실제로 화면에 뿌려주기 위해서 필요하기 때문이죠.
검색하면 굉장히 많은 자료들이 있으니 참고해서 개발하면 됩니다.
지금 테스트 코드에서는 이런 작업은 생략하겠습니다.
어차피 스프링 데이터 JPA 는 계산을 직접할 필요없이 이런 정보들을 제공해주거든요.