/////
Search
Duplicate
7️⃣

페이징 처리하기

: 데이터 목록을 보여줄 때, 전체 데이터 중 일부를 보여주는 것은 기본이다.
: 스프링 데이터 JPA는 페이징 처리를 위해 Pageable 타입을 이용한다. Sort 타입과 마찬가지로 find 메서드에 Pageable 타입 파라미터를 사용하면 페이징을 자동으로 처리한다.
pulbic interface MemberDataDao extends Repository<MemberData, String> { List<MemberData> findByNameLike(String name, Pageable pageable); }
Java
복사
: 위 코드에서 findByNameLike() 메서드는 마지막 파라미터로 Pageable 타입을 갖는다. Pageable 타입은 인터페이스로 실제 Pageable 객체는 PageRequest 클래스를 이용해서 생성한다.
: 다음 코드는 findByNameLike() 메서드를 사용하는 예를 보여준다.
PageRequest pageReq = PageRequest.of(1, 10); List<MemberData> user = memberDataDao.findByNameLike("사용자%", pageReq);
Java
복사
: PageRequest.of() 메서드의 첫 번째 인자는 페이지 번호를, 두 번재 인자는 한 페이지의 개수를 의미한다.
: 페이지 번호는 0번부터 시작하므로 위 코드는 한 페이지에 10개 씩 표시한다고 했을 때 두 번째 페이지를 조회한다. 즉 11번부터 20번까지 데이터를 가져온다.
: PageRequest와 Sort를 사용하면 정렬 순서를 지정할 수 있다.
Sort sort = Sort.by("anme").descending(); PageRequest pageReq = PageRequest.of(1, 2, sort); List<MemberData> user = memberDataDao.findByNameLike("사용자%", pageReq);
Java
복사
: Page 타입을 사용하면 데이터 목록뿐만 아니라 조건에 해당하는 전체 개수도 구할 수 있다.
public interface MemberDataDao extends Repository<MemberData, String> { Page<MemberData> findByBlocked(boolean blocked, Pageable pageable); }
Java
복사
: Pageable을 사용하는 메서드의 리턴 타입이 Page일 경우 스프링 데이터 JPA는 목록 조회 쿼리와 함께 COUNT 쿼리도 실행해서 조건에 해당하는 데이터 개수를 구한다. Page는 전체 개수, 페이지 개수 등 페이징 처리에 필요한 데이터도 함께 제공한다.
Pageable pageReq = PageRequest.of(2, 3); Page<MemberData> page = memberDataDao.findByBlocked(false, pageReq); List<MemberData> content = page.getC아itent(); // 조회 결과 목록 long totalElements = page.getTotalElements(); // 조건에 해당하는 전체 개수 int totalPages = page.getTotalPages(); // 전체 페이지 번호 int number = page.getNumber(); // 현재 페이지 번호 int numberOfElements = page.getNumberOfElements(); // 조회 결과 개수 int size = page.getSizeQ; // 페이지 크기
Java
복사
: 스펙을 사용하는 findAll() 메서드도 Pageable을 사용할 수 있다.
public interface MemberDataDao extends Repository<MemberData, String> { Page<MemberData> findAll(Specification<MemberData> spec, Pageable pageable); }
Java
복사
프로퍼티를 비교하는 findBy 프로퍼티 형식의 메서드는 Pageable 타입을 사용하더라도 리턴 타입이 List면 COUNT 쿼리를 실행하지 않는다. 즉, 다음 두 메서드 중에서 두 번재 findByNameLike 메서드는 전체 개수를 구하기 위한 COUNT 쿼리를 실행하지 않는다.
: 처음부터 N개의 데이터가 필요하다면 Pageable을 사용하지 않고 find에 FirstN또는 TopN 형식의 메서드 를 사용할 수도 있다.
List<MemberData> findFirst3ByNameLikeOrderByName(String name); List<MemberData> findTop3ByNameLikeOrderByName(String name); MemberData findFirstByBlockedOrderByld(boolean blocked); MemberData findTopByBlockedOrderByld(boolean blocked)
Java
복사