[Spring] 페이징과 정렬 WEB 확장

박준형·2023년 11월 26일
0

Spring

목록 보기
11/17
post-thumbnail

📌페이징 요청

컨트롤러 코드

@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;
}
profile
으쌰 으쌰

0개의 댓글

관련 채용 정보