Spring Data JPA는 기본적으로 페이징 기능과 정렬 기능을 제공하고 있습니다.
이들을 사용하기 위해서는 Pageable, Sort 객체가 필요합니다.
org.springframework.data.domain.Sort : 정렬 기능
org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함)
Pageable 객체에는 페이지 번호, 페이지 크기, 정렬 정보를 가지고 있습니다.
@GetMapping("/users")
public ResponseEntity<Page<User>> getUsers(
@RequestParam(defaultValue = "0") Integer pageNo,
@RequestParam(defaultValue = "10") Integer pageSize,
@RequestParam(defaultValue = "id") String sortBy) {
Pageable pageable = PageRequest.of(pageNo, pageSize, Sort.by(sortBy));
Page<User> pageResult = userRepository.findAll(pageable);
return ResponseEntity.ok(pageResult);
}
PageRequest 클래스를 사용해 of 메서드에 페이지 번호, 크기, 정렬정보를 담은 Pageable 객체를 생성하였습니다.
이후 userRepository.findAll(pageable) 메서드를 호출하여 원하는 결과를 얻을 수 있습니다. 위 코드에서는 Page 객체를 HTTP응답으로 반환하였습니다.
조건이 들어간 페이징과 정렬 사용 예제
- 검색 조건: 나이가 10살
- 정렬 조건: 이름으로 내림차순
- 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건
Pageable을 구현한 PageRequest 객체를 사용하였고, 생성자의 파라미터에는 위의 예제와 동일하게 첫 번째, 두번째, 세번째 각각 현재 페이지, 데이터 수, 정렬 정보를 넣어주었습니다.
결과는 10살인 데이터 중에서 이름을 내림차순으로 정렬한 데이터 3개가 정확하게 출력되었음을 확인할 수 있었습니다.
참고로 Page의 default값은 0입니다.
List<Member> content = page.getContent(); //조회된 데이터
assertThat(content.size()).isEqualTo(3); //조회된 데이터 수
assertThat(page.getTotalElements()).isEqualTo(5); //전체 데이터 수
assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
assertThat(page.getTotalPages()).isEqualTo(2); //전체 페이지 번호
assertThat(page.isFirst()).isTrue(); //첫번째 항목인가?
assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는가?
이 뿐만 아니라, 조회된 데이터 목록에 대한 다양한 구성 요소들이 있기 때문에 다음과 같은 항목들을 검증할 수 있게 됩니다.
Spring Data JPA가 제공해주는 페이징 및 정렬 기능에 대해서 알아보았습니다.
'Java > Spring' 카테고리의 다른 글
[Spring] 이메일 인증을 구현하기 위한 설정 (SMTP, mail.properties) (0) | 2023.04.02 |
---|---|
[Spring] N+1 문제를 해결하기 위한 방안 (fetch join, @EntityGraph) (0) | 2023.03.18 |
[Spring] Spring Data JPA 공통 인터페이스 (0) | 2023.03.18 |
[Spring] Querydsl (0) | 2023.03.12 |
[Spring] OSIV[Open Session In View]를 적절히 사용하여 성능 최적화 (0) | 2023.03.08 |