RestApi 만들기 - 이벤트 목록 조회 API구현 (9)

반응형
반응형

먼저 테스트 코드부터 작성하자.

@Test
  void eventQuery() {
    IntStream.range(0, 30)
        .forEach(this::generateEvent);
  }

  private void generateEvent(int index) {
    Delivery delivery = Delivery.builder()
        .item("Delivery" + index)
        .user("klom")
        .build();
    deliveryRepository.save(delivery);
  }

이렇게 작성하면
나는 0번부터 30번까지의 이벤트를 생성하는 로직이다.
그러면 생각해야 될것이
이제 이것들을 테스트를 해야 된다.

최종 코드는 다음과 같다.

@Test
  void eventQuery() throws Exception {
    IntStream.range(0, 30)
        .forEach(this::generateEvent);
    mockMvc.perform(get("/api/delivery")
                    .param("page","2")
                    .param("size","10")
                    .param("sort","item,DESC"))
           .andDo(print())
          .andExpect(status().isOk())
		  .andExpect(jsonPath("page").exists());;
  }

이것을 실행해보자.

어디서 잘못되었다.
에러 코드를 읽어보니
get은 허용이 되지 않는다고 한다.
그래서 get을 만들러 가자.

@GetMapping
    public ResponseEntity<?> deliveryList() {
        return ResponseEntity.ok().build();
    }

만들었다.
그러면 잘 나올까?

page가 존재하지 않는다고 한다.

그러면 만들어야지.

@GetMapping
    public ResponseEntity<?> deliveryList(Pageable pageable) {
        Page<Delivery> page = deliveryRepository.findAll(pageable);
        return ResponseEntity.ok(page);
}

페이지에 대한 정보를 모두 찾아서 등록을 시켜줬다.
그래도 아직도 정상적으로 나오지 않는다.
다행인건

이런식으로 리스트는 보여진다는 것이다.
그 이유는 아직 리소스로 만들지 않았기 때문이다.
리소스를 만들때 PagedResourcesAssembler를 이용하면 편하다고 한다.
이용하자.

@GetMapping
    public ResponseEntity<?> deliveryList(Pageable pageable, PagedResourcesAssembler<Delivery> assembler) {
        Page<Delivery> page = deliveryRepository.findAll(pageable);
         var pagedModel = assembler.toModel(page, DeliveryModel::modelOf);
        return ResponseEntity.ok(pagedModel);
    }

결과는...
드디어 성공

근데 여기까지 하면 다한것일까?

아니다.
우리는 해야할것이 더 남아있다.
바로 문서를 만들어야 된다.

@Test
  void eventQuery() throws Exception {
    IntStream.range(0, 30)
        .forEach(this::generateEvent);
    mockMvc.perform(get("/api/delivery")
        .param("page", "2")
        .param("size", "10")
        .param("sort", "item,DESC"))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(jsonPath("page").exists())
        .andDo(document("query-events",
            links(linkWithRel("first").description("첫번째 페이지"),
                linkWithRel("last").description("마지막 페이지"),
                linkWithRel("prev").description("이전 페이지"),
                linkWithRel("self").description("현재 페이지")),
            requestParameters(parameterWithName("page").description("현재 페이지"),
                parameterWithName("size").description("가져오는 데이터 수"),
                parameterWithName("sort").description("정렬되는 방법")),
            responseFields(fieldWithPath("page.size").description("페이지 크기"),
            fieldWithPath("page.totalElements").description("전체 갯수"),
            fieldWithPath("page.totalPages").description("전체 페이지"),
            fieldWithPath("page.number").description("현재 페이지"),
            fieldWithPath("_links.first.href").description("첫번째 링크"),
            fieldWithPath("_links.prev.href").description("이전 링크"),
            fieldWithPath("_links.self.href").description("현재 링크"),
            fieldWithPath("_links.last.href").description("마지막 링크"),
            fieldWithPath("_embedded.deliveryList[].id").description("인덱스"),
            fieldWithPath("_embedded.deliveryList[].item").description("상품"),
            fieldWithPath("_embedded.deliveryList[].user").description("판매인"),
            fieldWithPath("_embedded.deliveryList[].deliveryTime").description("배송일"),
            fieldWithPath("_embedded.deliveryList[].deliveryEndTime").description("도착 예상일"),
            fieldWithPath("_embedded.deliveryList[].status").description("배송 상태"),
            fieldWithPath("_embedded.deliveryList[].itemPrice").description("물품 가격"),
            fieldWithPath("_embedded.deliveryList[].deliveryCost").description("배달 비용"),
            fieldWithPath("_embedded.deliveryList[]._links.query-events.href").description("목록으로"),
            fieldWithPath("_embedded.deliveryList[]._links.update-events.href").description("업데이트하기"),
            fieldWithPath("_embedded.deliveryList[]._links.self.href").description("현재 이벤트"),
            fieldWithPath("_embedded.deliveryList[]._links.profile.href").description("현재 작업")
            )
        ));

최종본...
힘들다...

이제 직접 보자.

잘 나온다.;;
이거 생각보다 힘드군...;;

반응형

댓글

Designed by JB FACTORY