RestApi ๋ง๋ค๊ธฐ - 201์ฝ๋ ์์ฑํ๊ธฐ (1)

๋๋ ๋ฐฐ๋ฌAPI๋ฅผ restAPI๋ก ๋ง๋ค์ด ๋ณผ๋ ค๊ณ ํ๋ค.
๋ด์ฉ์ ์คํ๋ง ๊ธฐ๋ฐ REST API ๊ฐ๋ฐ ์์ ๊ณต๋ถํ ๋ด์ฉ์ ์ฐธ์กฐํด์ ๋ง๋ค์๋ค.
์๋๋ restAPI์ ๋ํ ์ ์๋ฅผ ๋งํ๊ณ ์์ํด์ผ ๋์ง๋ง
์์ง์ ์ค๋ช
ํ๊ธฐ๋ ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค,
์ผ๋ฐ์ ์ธ api๋ณด๋ค ์ํ๋ฅผ ์์ ๋กญ๊ฒ ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฑด ํ์คํ๋ค.
์๋ฌดํผ api๋ฅผ ๋ง๋ค๊ธฐ์ํด์๋ dto๊ฐ ํ์ํ๋ค.
๊ทธ๋ฌ๋๊น ์๋ฐ๋น๊ฐ์๊ฒ ํ์ํ๋ค๋ ๋ป์ด๋ค.
๊ฐ๋จํ๊ฒ
@Builder
@Setter @Getter
public class Delivery {
private int id;
private String item;
private String user;
private LocalDateTime deliveryTime;
private DeliveryStatus status;
}
์ด๋ ๊ฒ ์์ฑํ๋ค.
์ด์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
๋๋ mockMVC๋ฅผ ์ฌ์ฉํด์ผ๋๋ค.
mockMVC๋ ์น์ผ๋ก ์ง์ ์ ์ผ๋ก ํต์ ํ์ง ์๊ณ , ๊ฐ์์ผ๋ก ์น์ผ๋ก ํธ์ถ์ด ์ ๋์์ง ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ด๋ค.(mock์ด ๊ฐ์ง๋ผ๊ณ ํ์ง๋ง ํ๋ก์๋ ๊ฐ์ง๊ณ ๊ทธ๋์ ๊ฐ์ง๋ผ๋ ๋ง์ด ์ซ๋ค.)
@WebMvcTest
class DeliveryTest {
@Autowired
private MockMvc mockMvc;
@Test
void create_Delivery() throws Exception {
mockMvc.perform(post("/api/delivery"))
.andExpect(status().isCreated());
}
}
ํ
์คํธ ์ฝ๋๋ ์ด๋ ๊ฒ ์์ฑํ์๋ค.
ํฌ์คํธ ๋ฐฉ์์ผ๋ก ๋ณด๋ด๊ณ , url์ด ๋ค์ด์ค๋ฉด ์์ฑํ๋ผ๋ ๋ป์ด๋ค.
ํ์ง๋ง ์ด๊ฑด404์๋ฌ๊ฐ ๋ฐ์๋๋ค.

์๋ํ๋ฉด ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์ด๋ณด์.
@Controller
public class DeliveryController {
@PostMapping("/api/delivery")
public ResponseEntity createDelivery() {
return ResponseEntity.created().build();
}
}
ResponseEntity๋ ์๋ต์ํฐํฐ๋ฅผ ๊ฒฐ์ ํ๋ ํ์๋ผ ์๊ฐ์ด ๋ ๋ค.
๊ทผ๋ฐ created๋ฅผ ํ๊ธฐ ์ํด์๋ uri๊ฐ ํ์ํ๋ค.
uri๋ฅผ ๋ง๋ค์ด๋ณด์.
์๋๋
URI uri = URI.create("/api/delivery");
์ด๋ ๊ฒ ๋ง๋ค์ด์ผ ๋์ง๋ง... ์ด๋ ๊ฒ ๋ง๋ค๊ฒ ๋๋ฉด ๋ฌธ์ ์ ์ด
uri๊ฐ ๋ณ๊ฒฝ์ด ๋๋ค๋ฉด ์ uri๋ฅผ ์์ ํด๋๋ ๋ถ์์ฌ๊ฐ ๋ฐ์๋ ์ ์๋ค.(์๋ ๊ฐ๋ฅ์ฑ์ด ๋ ํฌ์ง๋ง...ใ
ใ
)
spring hateoaus๋ฅผ ์ฌ์ฉํ๋ฉด ๋งํฌ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
URI createUri = linkTo(DeliveryController.class).slash("{id}").toUri();
์ ์ฝ๋๋ ์์์ ์์ฑ๋ uri์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.

๊ทผ๋ฐ ๋ด๊ฐ ๊ธฐ๋ํ uri๋ ๋ค๋ฅธ ์ ๋ณด๊ฐ ๋์๋ค.
์๋ํ๋ฉด ๋๋ ํด๋์ค์ ์ ์๋ ๋งคํ๊ฐ์ ๊ฐ์ ธ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฑธ ๋ฉ์๋๋ก ๋ฐ๊ฟ์ค์ผ ๋๋ค.
URI createUri = linkTo(methodOn(DeliveryController.class).createDelivery()).slash("{id}").toUri();

์ด์ delivery์ ๋ณด๋ฅผ ๋๊ฒจ์ ๊ทธ์์ ์ ๋ณด๋ค์ ๋ฃ์ด๋ณด์.
๊ทผ๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.

๋ฉ์๋๊ฐ ํ๋ผ๋ฏธํฐ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค.
์ฌ๊ธฐ์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์กด์ฌํ๋ค.
์ ๊ณณ์ null์ ๋ฃ๋์ง,
์๋๋ฉด, ํด๋์ค์ ์ ์ ํ๋์ง ๊ฒฐ์ ํด์ผ๋๋ค.
๋๋ ํด๋์ค์ ์ ์ํ๋ ๋ฐฉ์์ด ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋์ ๋ณ๊ฒฝํ๊ณ ๋ค์ ์ํํด์ฃผ์๋๋,

์ด๋ฐ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
๊ตฌ๊ธ์ ํ์ ๋น๋ฆฐ ๊ฒฐ๊ณผ ์ด๊ฑด 500์๋ฌ์ ๊ด๋ จ์ด ์๋ค๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋๊ฑด ๊ฐ์ด ์ ์ ํ๊ฒ ๋ค์ด๊ฐ์ง ์์๊ธฐ ๋๋ฌธ์ธ๊ฐ?
ํ์ธ ๊ฒฐ๊ณผ,
๋ด๊ฐ ๋ง๋ dto์ ๋ฌธ์ ๊ฐ ์์๋ค.
๋น๋๋ก ๋ง๋ค๊ฒ ๋๋ฉด ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฃ์ด์ผ ๋๋ค.
ํ์ง๋ง ์ด๊ฒ์ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋น ์์ฑ์๋ ํ์ํ๋ค.
๊ทธ๋ฌ๋ฉด @NoArgsConstructor๋ง ์ถ๊ฐํ๋ฉด ๋ ๊น?
ํ์ง๋ง ์ด๋ ๊ฒ ๋ง๋ค๊ฒ ๋๋ฉด ๋์ด์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฃ์ง ์๊ธฐ ๋๋ฌธ์ ๋น๋์ ์ญํ ์ ์์ด์ง๋ค.
๊ทธ๋์
@Builder
@Setter @Getter
@NoArgsConstructor
@AllArgsConstructor
public class Delivery {

์ ์์ ์ผ๋ก ๋์๋ค.
์๋ header์๋ ๊ฐ์ ์ถ๊ฐํ๋๊ฒ ์ข์ง๋ง, ๊ทธ๋ฅ ๊ฐ๋จํ๊ธฐ ์ํด ์ด๋ ๊ฒ ํ๋ค.ใ ;