컨트롤러 코드
@GetMapping("/members") public Page<Member> list(Pageable pageable) { // Data JPA가 제공하는 findBy~ 매개변수에 pageable 기능을 지원한다. Page<Member> page = memberRepository.findAll(pageable); return page; }
init 데이터
@PostConstruct public void init() { for(int i = 0; i < 100; i++) { memberRepository.save(new Member("userA" + i, i)); } }
회원 데이터 100개가 초기화 된다.
http://localhost:8080/members
로 요청을 보내면 아래와 같이 페이징된 결과가 반환된다.
{
"content": [
{
"createdDate": "2023-11-26T21:08:08.991412",
"lastModifiedDate": "2023-11-26T21:08:08.991412",
"id": 1,
"username": "userA0",
"age": 0,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.05107",
"lastModifiedDate": "2023-11-26T21:08:09.05107",
"id": 2,
"username": "userA1",
"age": 1,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.056073",
"lastModifiedDate": "2023-11-26T21:08:09.056073",
"id": 3,
"username": "userA2",
"age": 2,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.060076",
"lastModifiedDate": "2023-11-26T21:08:09.060076",
"id": 4,
"username": "userA3",
"age": 3,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.06507",
"lastModifiedDate": "2023-11-26T21:08:09.06507",
"id": 5,
"username": "userA4",
"age": 4,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.06907",
"lastModifiedDate": "2023-11-26T21:08:09.06907",
"id": 6,
"username": "userA5",
"age": 5,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.07307",
"lastModifiedDate": "2023-11-26T21:08:09.07307",
"id": 7,
"username": "userA6",
"age": 6,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.077072",
"lastModifiedDate": "2023-11-26T21:08:09.077072",
"id": 8,
"username": "userA7",
"age": 7,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.081099",
"lastModifiedDate": "2023-11-26T21:08:09.081099",
"id": 9,
"username": "userA8",
"age": 8,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.085077",
"lastModifiedDate": "2023-11-26T21:08:09.085077",
"id": 10,
"username": "userA9",
"age": 9,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.090075",
"lastModifiedDate": "2023-11-26T21:08:09.090075",
"id": 11,
"username": "userA10",
"age": 10,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.095072",
"lastModifiedDate": "2023-11-26T21:08:09.095072",
"id": 12,
"username": "userA11",
"age": 11,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.100072",
"lastModifiedDate": "2023-11-26T21:08:09.100072",
"id": 13,
"username": "userA12",
"age": 12,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.105072",
"lastModifiedDate": "2023-11-26T21:08:09.105072",
"id": 14,
"username": "userA13",
"age": 13,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.109075",
"lastModifiedDate": "2023-11-26T21:08:09.109075",
"id": 15,
"username": "userA14",
"age": 14,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.11407",
"lastModifiedDate": "2023-11-26T21:08:09.11407",
"id": 16,
"username": "userA15",
"age": 15,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.11807",
"lastModifiedDate": "2023-11-26T21:08:09.11807",
"id": 17,
"username": "userA16",
"age": 16,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.122071",
"lastModifiedDate": "2023-11-26T21:08:09.122071",
"id": 18,
"username": "userA17",
"age": 17,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.127074",
"lastModifiedDate": "2023-11-26T21:08:09.127074",
"id": 19,
"username": "userA18",
"age": 18,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.131071",
"lastModifiedDate": "2023-11-26T21:08:09.131071",
"id": 20,
"username": "userA19",
"age": 19,
"team": null
}
],
"pageable": {
"sort": {
"empty": true,
"sorted": false,
"unsorted": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 20,
"paged": true,
"unpaged": false
},
"last": false,
"totalPages": 5,
"totalElements": 100,
"size": 20,
"number": 0,
"sort": {
"empty": true,
"sorted": false,
"unsorted": true
},
"first": true,
"numberOfElements": 20,
"empty": false
}
아무런 조건을 주지 않았기 때문에 기본값인 첫 페이지의 20개의 데이터가 반환된다.
http://localhost:8080/members?page=1&size=3
같이 원하는 페이지와 데이터 수를 GET 요청으로 보낼 수 있다.
{
"content": [
{
"createdDate": "2023-11-26T21:08:09.060076",
"lastModifiedDate": "2023-11-26T21:08:09.060076",
"id": 4,
"username": "userA3",
"age": 3,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.06507",
"lastModifiedDate": "2023-11-26T21:08:09.06507",
"id": 5,
"username": "userA4",
"age": 4,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.06907",
"lastModifiedDate": "2023-11-26T21:08:09.06907",
"id": 6,
"username": "userA5",
"age": 5,
"team": null
}
],
"pageable": {
"sort": {
"empty": true,
"sorted": false,
"unsorted": true
},
"offset": 3,
"pageNumber": 1,
"pageSize": 3,
"paged": true,
"unpaged": false
},
"last": false,
"totalPages": 34,
"totalElements": 100,
"size": 3,
"number": 1,
"sort": {
"empty": true,
"sorted": false,
"unsorted": true
},
"first": false,
"numberOfElements": 3,
"empty": false
}
Data JPA에서 페이징은 0부터 첫 페이지이므로 page=1은 두번째 페이지이다.
http://localhost:8080/members?page=1&size=3&sort=id,desc
같이 정렬도 요청할 수 있다. id순으로 정렬하고 desc 옵션은 내림차순으로 정렬한다는 뜻이다(asc는 오름차순).
{
"createdDate": "2023-11-26T21:08:09.418168",
"lastModifiedDate": "2023-11-26T21:08:09.418168",
"id": 97,
"username": "userA96",
"age": 96,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.415169",
"lastModifiedDate": "2023-11-26T21:08:09.415169",
"id": 96,
"username": "userA95",
"age": 95,
"team": null
},
{
"createdDate": "2023-11-26T21:08:09.413169",
"lastModifiedDate": "2023-11-26T21:08:09.413169",
"id": 95,
"username": "userA94",
"age": 94,
"team": null
}
id 기준으로 내림차순으로 정렬된 데이터가 반환된다.
application.yml의 설정을 다음과 같이 바꿔주면 된다.
spring:
data:
web:
pageable:
# 페이지당 데이터 수
default-page-size: 10
max-page-size: 2000
@PageableDefault
을 사용하여 해당 메서드에만 기본 pageable 설정을 해줄 수 있다. 이 경우 전역 설정보다 우선하여 적용된다.(전역 설정의 페이지 당 데이터 수가 10개인데 현재 5개로 설정되어 있으므로 페이지 당 5개의 데이터가 반환된다.)
@GetMapping("/members")
public Page<Member> list(@PageableDefault(size = 5) Pageable pageable) {
// Data JPA가 제공하는 findBy~ 매개변수에 pageable 기능을 지원한다.
Page<Member> page = memberRepository.findAll(pageable);
return page;
}