Spring Data JPA를 사용하여 페이징 처리, 정렬을 해보자
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long no;
private String userid;
private String subject;
private String content;
...
}
PagingAndSortingRepository를 상속한 BoardRepository를 만든다. PagingAndSortingRepository를 상속한 JPARepository를 상속해도 된다.
public interface BoardRepository extends PagingAndSortingRepository<Board, Long>{
List<Board> findAllByUserId(String userId, Pageable pageable);
}
PagingAndSortingRepository 인터페이스를 보자. findAll(Sort sort), findAll(Pageable pageable) 메서드가 있다.
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
/**
* Returns all entities sorted by the given options.
*
* @param sort
* @return all entities sorted by the given options
*/
Iterable<T> findAll(Sort sort);
/**
* Returns a {@link Page} of entities meeting the paging restriction provided in the {@code Pageable} object.
*
* @param pageable
* @return a page of entities
*/
Page<T> findAll(Pageable pageable);
}
이제 데이터를 조회해보자
PageRequest 객체를 생성하고 findAll 메서드에 파라미터로 전달한다.
페이지 번호는 0부터 시작하므로 pno에서 1을 뺀 값을 전달한다.
// 10개씩 나누어 페이징하고, 페이지 번호가 pno-1인 데이터들을 가져온다
Pageable pageWithTenElements = PageRequest.of(pno - 1, 10, Direction.DESC, "no");
noticeRepo.findAll(pageable);
정렬된 결과를 얻으려면 메서드에 Sort 객체를 전달한다.
Page<Board> boardsSortedByUserId = boardRepository.findAll(Sort.by("userId"));
페이징과 정렬 둘 다 하고싶으면 아래 코드처럼 PageRequest 객체를 생성하여 사용한다.
Pageable sortedByUserId =
PageRequest.of(0, 3, Sort.by("userId"));
Pageable sortedByUserIdDesc =
PageRequest.of(0, 3, Sort.by("userId").descending());
Pageable sortedByUserIdDescNoAsc =
PageRequest.of(0, 5, Sort.by("userId").descending().and(Sort.by("no")));
참고한 Baeldung 문서
https://www.baeldung.com/spring-data-jpa-pagination-sorting