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);
}