아카이브

[스프링 기반 REST API 개발] 이벤트 목록 조회 API 구현 본문

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

- 링크 확인 self, profile, (create)

- 문서화