[rest api 프로젝트 구축] - 조회 (페이징 처리)

geun kim·2023년 3월 26일
0

REST API 구축

목록 보기
9/20

Pageable : page,size,sort등 paging에 관련된 정보를 담고 있다.
PagedResourcesAssembler : 페이지 링크 정보를 생성 해 준다.

@GetMapping
    public ResponseEntity queryEvents(Pageable pageable){
        return ResponseEntity.ok().body(eventRepository.findAll((pageable)));
    }

응답값

{
    "content": [
        {
            "id": 29,
            "name": "event26",
            "description": "test event26",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 28,
            "name": "event25",
            "description": "test event25",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 27,
            "name": "event24",
            "description": "test event24",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 26,
            "name": "event23",
            "description": "test event23",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 25,
            "name": "event22",
            "description": "test event22",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 24,
            "name": "event21",
            "description": "test event21",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 23,
            "name": "event20",
            "description": "test event20",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 5,
            "name": "event2",
            "description": "test event2",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 22,
            "name": "event19",
            "description": "test event19",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        },
        {
            "id": 21,
            "name": "event18",
            "description": "test event18",
            "beginEnrollmentDateTime": null,
            "closeEnrollmentDateTime": null,
            "beginEventDateTime": null,
            "endEventDateTime": null,
            "location": null,
            "basePrice": 0,
            "maxPrice": 0,
            "limitOfEnrollment": 0,
            "offline": false,
            "free": false,
            "eventStatus": null
        }
    ],
    "pageable": {
        "sort": {
            "sorted": true,
            "unsorted": false,
            "empty": false
        },
        "offset": 10,
        "pageNumber": 1,
        "pageSize": 10,
        "paged": true,
        "unpaged": false
    },
    "last": false,
    "totalElements": 30,
    "totalPages": 3,
    "size": 10,
    "number": 1,
    "sort": {
        "sorted": true,
        "unsorted": false,
        "empty": false
    },
    "numberOfElements": 10,
    "first": false,
    "empty": false
}
@GetMapping
    public ResponseEntity queryEvents(Pageable pageable, PagedResourcesAssembler<Event> pagedResourcesAssembler){
        Page<Event> eventPage = eventRepository.findAll((pageable));
        PagedModel<EventResource> eventResources = pagedResourcesAssembler.toModel(eventPage, e -> new EventResource(e));
        eventResources.add(new Link("/docs/index.html#resources-events-list").withRel("profile"));
        return ResponseEntity.ok().body(eventResources);
    }

응답값

{
    "_embedded": {
        "eventList": [
            {
                "id": 29,
                "name": "event26",
                "description": "test event26",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/29"
                    }
                }
            },
            {
                "id": 28,
                "name": "event25",
                "description": "test event25",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/28"
                    }
                }
            },
            {
                "id": 27,
                "name": "event24",
                "description": "test event24",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/27"
                    }
                }
            },
            {
                "id": 26,
                "name": "event23",
                "description": "test event23",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/26"
                    }
                }
            },
            {
                "id": 25,
                "name": "event22",
                "description": "test event22",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/25"
                    }
                }
            },
            {
                "id": 24,
                "name": "event21",
                "description": "test event21",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/24"
                    }
                }
            },
            {
                "id": 23,
                "name": "event20",
                "description": "test event20",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/23"
                    }
                }
            },
            {
                "id": 5,
                "name": "event2",
                "description": "test event2",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/5"
                    }
                }
            },
            {
                "id": 22,
                "name": "event19",
                "description": "test event19",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/22"
                    }
                }
            },
            {
                "id": 21,
                "name": "event18",
                "description": "test event18",
                "beginEnrollmentDateTime": null,
                "closeEnrollmentDateTime": null,
                "beginEventDateTime": null,
                "endEventDateTime": null,
                "location": null,
                "basePrice": 0,
                "maxPrice": 0,
                "limitOfEnrollment": 0,
                "offline": false,
                "free": false,
                "eventStatus": null,
                "_links": {
                    "self": {
                        "href": "http://localhost:8080/api/events/21"
                    }
                }
            }
        ]
    },
    "_links": {
        "first": {
            "href": "http://localhost:8080/api/events?page=0&size=10&sort=name,desc"
        },
        "prev": {
            "href": "http://localhost:8080/api/events?page=0&size=10&sort=name,desc"
        },
        "self": {
            "href": "http://localhost:8080/api/events?page=1&size=10&sort=name,desc"
        },
        "next": {
            "href": "http://localhost:8080/api/events?page=2&size=10&sort=name,desc"
        },
        "last": {
            "href": "http://localhost:8080/api/events?page=2&size=10&sort=name,desc"
        }
    },
    "page": {
        "size": 10,
        "totalElements": 30,
        "totalPages": 3,
        "number": 1
    }
}

test

@Test
    @TestDescription("30개의 이벤트를 10개씩 두번째 페이지 조회하기")
    public void queryEvents() throws  Exception{
        //given
        IntStream.range(0,30).forEach(i -> this.generateEvent(i));

        //when
        this.mockMvc.perform(get("/api/events")
                        .param("page","1")
                        .param("size","10")
                        .param("sort", "name,DESC")
                )
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(jsonPath("page").exists())
                .andDo(document("query-events"));
        //then

    }

    private void generateEvent(int i) {
        Event event = Event.builder()
                .name("event"+i)
                .description("test event"+i)
                .build();
        eventRepository.save(event);
    }
profile
Devops Load Map

0개의 댓글