๊ฐœ๋ฐœ/restAPI๐Ÿ˜ข

RestApi ๋งŒ๋“ค๊ธฐ - ์ด๋ฒคํŠธ ๋ชฉ๋ก ์กฐํšŒ API๊ตฌํ˜„ (9)

klom 2021. 3. 6. 00:25
๋ฐ˜์‘ํ˜•

๋จผ์ € ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜์ž.

@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("ํ˜„์žฌ ์ž‘์—…")
            )
        ));

์ตœ์ข…๋ณธ...
ํž˜๋“ค๋‹ค...

์ด์ œ ์ง์ ‘ ๋ณด์ž.

์ž˜ ๋‚˜์˜จ๋‹ค.;;
์ด๊ฑฐ ์ƒ๊ฐ๋ณด๋‹ค ํž˜๋“œ๊ตฐ...;;