Java/Spring

[Spring] Spring Data JPA Paging, Sort 기능

SeungbeomKim 2023. 3. 18. 19:08

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응답으로 반환하였습니다. 

 

조건이 들어간 페이징과 정렬 사용 예제

  1. 검색 조건: 나이가 10살
  2. 정렬 조건: 이름으로 내림차순
  3. 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 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가 제공해주는 페이징 및 정렬 기능에 대해서 알아보았습니다.