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
어노테이션을 통해 기본값을 설정할 수 있다.
'JAVA(SPRINGBOOT)' 카테고리의 다른 글
[SPRING SECURITY] 시큐리티 파헤치기 (3) - AUTHENTICATION (0) | 2023.03.22 |
---|---|
[SPRING SECURITY] 시큐리티 파헤치기 (1) (0) | 2023.03.16 |
[SPRINGBOOT] 좋아요 수 표현 (0) | 2023.03.09 |
[JAVA] VECTOR (0) | 2023.01.26 |
[JAVA] GENERIC PROGRAMMING (2) | 2022.12.22 |