-
Spring Data JPA 페이징과 정렬자바/스프링 2021. 10. 12. 23:31
Repository 인터페이스 작성 시 JpaRepository가 아니라 PagingAndSortingRepository를 상속하게 하면, Spring Data JPA에서 제공하는 페이징, 정렬 기능을 이용할 수 있다.
public interface UserRepository extends PagingAndSortingRepository<User, Long> { ... }
PagingAndSortingRepository를 상속하면 findAll(Pageable pageable)이나 findAll(Sort sort)과 같이 Pageable과 Sort 클래스를 파라미터로 받는 메서드를 명세할 수 있다.
기본적으로 제공되는 findAll(Pageable pageable)은 Page 객체를 리턴하지만, 커스텀 메서드를 통해 리턴 타입을 List, Slice 객체로 받을 수 있다.
Page 객체는 전체 페이지의 개수를 알 수 있지만 이를 위해 추가적인 쿼리가 발생한다. List나 Slice 객체로 리턴 타입을 변경하면 전체 페이지의 개수는 모르지만 추가적인 쿼리를 막을 수 있다.
Slice 객체의 경우 다음 페이지가 있는지 여부만을 알 수 있다.
public interface UserRepository extends PagingAndSortingRepository<User, Long> { Page<User> findAll(Pageable pageable); List<User> findAll(Pageable pageable); Slice<User> findAll(Pageable pageable); }
Pageable 객체는 PageRequest.of() 메서드로 생성이 가능하며, PageRequest.of() 메서드는 page(조회하고자 하는 페이지 번호), size(페이지 당 로우 개수)를 파라미터로 받는다.
페이지는 0부터 시작한다.
오버로딩을 통해 sort(정렬 기준 컬럼 정보, Sort 객체) 파라미터도 함께 사용할 수 있는데, 이 경우 페이징과 정렬이 동시에 처리된다.
Pageable pageable = PageRequest.of(0, 12, Sort.by("id").accending());
페이징 없이 정렬만 하려는 경우 위에 언급한 findAll(Sort sort) 메서드와 같이 Sort 객체만 파라미터로하는 메서드를 작성하면 된다.
public interface UserRepository extends PagingAndSortingRepository<User, Long> { ... List<User> findAll(Sort sort); }
Sort 클래스의 and() 메서드를 통해 여러 컬럼을 정렬 기준으로 삼을 수 있다.
Sort idSort = Sort.by("id"); Sort nameSort = Sort.by("name"): Sort idNameSort = idSort.and(nameSort); userRepository.findAll(idNameSort);
Sort 객체를 생성할 때 사용하는 컬럼명은 실제 테이블의 컬럼명이 아니라 Entity의 속성 이름으로 지정해야 한다.
// 테이블 컬럼명: post_code / Enitity 속성명: postCode Sort idSort = Sort.by("postCode");
출처:
https://howtodoinjava.com/spring-boot2/pagination-sorting-example/
'자바 > 스프링' 카테고리의 다른 글
Plain jar vs Executable jar(feat. plain jar 생성 방지) (0) 2021.11.08 Spring Data JPA DTO 사용 시 매핑 에러가 발생할 때(org.springframework.data.mapping.PropertyReferenceException: No property ...) (0) 2021.10.08 스프링부트 H2 데이터베이스 설정 방법 (1) 2021.10.04 스프링부트 profile 설정 방법 (0) 2021.10.03