Spring/스프링 기반 REST API 개발
[스프링 기반 REST API 개발] 이벤트 목록 조회 API 구현
주멘이
2021. 1. 9. 11:06
페이징, 정렬을 어떻게 할까?
- spring-data-jpa가 제공하는 Pageable을 사용
Page<Event>에 안에 들어있는 Event 들은 리소스로 어떻게 변경할까?
- 하나씩 순회하면서 직접 EventResource로 맵핑을 시킬까..
- PagedResourceAssembler<T> 사용하기
queryEvents handler 추가하기
@GetMapping
public ResponseEntity queryEvents(Pageable pageable, PagedResourcesAssembler<Event> assembler) {
Page<Event> page = this.eventRepository.findAll(pageable);
PagedModel<EntityModel<Event>> entityModels = assembler.toModel(page, EventResource::new);
entityModels.add(new Link("/docs/index.html#resources-events-list").withRel("profile"));
return ResponseEntity.ok(entityModels);
}
queryEvents Test 추가하기
@Test
@TestDescription("30개의 이벤트를 10개씩 두번째 페이지 조회하기")
void queryEvents() throws Exception {
// Given
IntStream.range(0, 30).forEach(this::generateEvent);
// When
this.mockMvc.perform(get("/api/events")
.param("page", "1")
.param("size", "10")
.param("sort", "name,DESC")
)
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("_embedded.eventList[0]._links.self").exists())
.andExpect(jsonPath("_links.self").exists())
.andExpect(jsonPath("_links.profile").exists())
.andDo(document("query-events"))
;
}
private void generateEvent(int index) {
Event event = Event.builder()
.name("event " + index)
.description("test event")
.build();
this.eventRepository.save(event);
}
page는 0부터 시작하고, size의 기본값은 20이다.
테스트 할 것
- Event 목록 Page 정보와 함께 받기
- content[0].id 확인
- pageable 경로 확인
- Sort과 Paging 확인
- 30개를 만들고, 10개 사이즈로 두번째 페이지 조회하면 이전, 다음 페이지로 가는 링크가 있어야 한다.
- 이벤트 이름순으로 정렬하기
- page 관련 링크
- Event를 EventResource로 변환해서 받기
- 각 이벤트 마다 self