Spring Data JPA 페이징 처리하기

일고잉·2021년 7월 25일
0

Spring

목록 보기
2/2

Spring Data JPA를 사용하여 페이징 처리, 정렬을 해보자

1. Entity 생성

@Entity
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long no;
    private String userid;
    private String subject;
    private String content;
    ...
}

2. Repository 생성

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);
}

3. 페이징 처리

이제 데이터를 조회해보자
PageRequest 객체를 생성하고 findAll 메서드에 파라미터로 전달한다.
페이지 번호는 0부터 시작하므로 pno에서 1을 뺀 값을 전달한다.

// 10개씩 나누어 페이징하고, 페이지 번호가 pno-1인 데이터들을 가져온다
Pageable pageWithTenElements = PageRequest.of(pno - 1, 10, Direction.DESC, "no");
noticeRepo.findAll(pageable);

4. 페이징 및 정렬

정렬된 결과를 얻으려면 메서드에 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

0개의 댓글