JAVA(SPRINGBOOT)

[JPA] PAGEABLE

본듀 2023. 3. 13. 12:15

JPA로 Pageable을 활용한 pagination을 구현하기 위해서는
다음과 같이 Pageable 객체를 인수로 넘겨주면 된다.

GET /users?email=test&page=3&size=10&sort=id,DESC
위와 같은 url로 controller에 요청이 오면 페이지에 관련된 정보 (page, size, sort)가 Pageable 객체로 매핑된다.

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findAllByEmail(String email, Pageable pageable);
    Page<User> findAllByEmail(String email, Pageable pageable);
    Slice<User> findAllByEmail(String email, Pageable pageable);
}

JPA에서 반환값으로 위의 List, Page, Slice 세 가지를 지원하고 있다.

Page 반환의 경우 전체 페이지 수를 포함하고 있어 SELECT 외에 COUNT도 실행되고,
Slice 반환의 경우 다음페이지가 존재하는지, 현재 처음페이지인지 마지막페이지인지 등의 정보가 포함된다.

Page의 경우 전체페이지 수를 알 수 있기 때문에 테이블형식의 pagination을 적용할 때 유리할 수 있고,

Slice는 다음페이지의 유무가 함께 반환되기때문에 무한스크롤형식에 유리할 수 있다.
             no offset으로 대용량 데이터일 경우 COUNT쿼리를 수행하는데도 적은 않은 시간을 할애할 수 있기때문에
             속도 측면에서 Page를 반환하는 것보다 유리할 수 있다.
         
상황에 맞는 자료형을 선택하는 것이 좋다.

 

@Controller
public class UserController {
  @GetMapping("/users")
  public List<UserResponse> findByLastName(@RequestParam String email,
                                           @PageDefault(size=10, sort="id", direction = Sort.Direction.DESC) Pageable pageable) {
  
  }    
}

@PageDefault

어노테이션을 통해 기본값을 설정할 수 있다.