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("ํ์ฌ ์์
")
)
));
์ต์ข
๋ณธ...
ํ๋ค๋ค...
์ด์ ์ง์ ๋ณด์.

์ ๋์จ๋ค.;;
์ด๊ฑฐ ์๊ฐ๋ณด๋ค ํ๋๊ตฐ...;;