Β REST-API κ°λ°μ μ¬μ ν λ°±μλ κ°λ°μ μ£Όλ λ°©μμΌλ‘ μ리μ‘κ³ μλ€.
μ΄λ λ°±μλμ νλ‘ νΈμλλ₯Ό λͺ
ννκ² λΆλ¦¬ν¨μΌλ‘ κ° κ°λ°μλ€μ λΉμ©μ μ κ°νκ³ ν리ν°λ₯Ό λμ΄λ ν¨κ³Όλ₯Ό μ 곡ν΄μ€λ€.
Β REST-APIλ 무μμ΄λ©°, μ΄λ»κ² λμνκ³ μ΄λ€ νΉμ§κ³Ό μ₯μ μ΄ μμκΉ?
μΆκ°λ‘, μ΅κ·Όμλ REST-APIμ λ¨μ μ 보μν μλ‘μ΄ κ°λ° λ°©μλ€λ λ±μ₯νκ³ μλ€. μ΄λ¬ν κ°λ° λ°©μλ€μ μ΄λ€ κ²λ€μ΄ μμκΉ?
1) μμ (Resource)
URI λ₯Ό ν΅ν΄ μμμ μλ³/post , /member/user1 ...2) νν (Representation)
JSON , XML , HTML λ± λ€μν νμμΌλ‘ ννλ¨3) μν μμ (Stateless)
4) HTTP λ©μλ νμ©
GET : μμ μ‘°νPOST : μμ μμ±PUT : μμ μ 체 μμ PATCH : μμ μΌλΆ μμ DELETE : μμ μμ 5) κ³μΈ΅ ꡬ쑰 (Layered System)
6) μΊμ κ°λ₯ (Cacheable)
1) μμ (Resource)
URI λ‘ νν/post , /member/user ...2) νμ (HTTP λ©μλ)
3) νν (Representation)
JSON , XML λ±μ ννλ‘ ν΄λΌμ΄μΈνΈμ μ λ¬JSON λ°©μμ μλμ κ°μ{
"id": 1,
"author": "μκ°1",
"content": "λͺ
μΈ1"
}
1) μΌλ° μΉ μ ν리μΌμ΄μ
@Controller λ₯Ό μ¬μ©νμ¬ Viewλ₯Ό λ°νHTML νμΌμ λ°ννμ¬ λΈλΌμ°μ μ νμν μΉ νμ΄μ§ μ 곡ModelAndView λ String μ λ°νThymeleaf λ± ν
νλ¦Ώ μμ§μ μ¬μ©νμ¬ HTML μ λμ μΌλ‘ μμ±νκ³ , μ΄λ₯Ό ν΄λΌμ΄μΈνΈμ μ λ¬ex)
@Controller
@RequestMapping("/")
public class AppController {
@GetMapping
public String printHello(Model model) {
model.addAttribute("msg", "Hello!");
return "hello";
}
}
src/main/resources/templates/hello.html μ 미리 μμ±ν΄λμλ€κ³ κ°μ Thymeleaf λ₯Ό μ€μ ν΄λμλ€κ³ κ°μ model.addAttribute() λ₯Ό μ¬μ©νμ¬, λ·° ν
νλ¦Ώμ λμ μΈ λ°μ΄ν°λ₯Ό μ λ¬ν μ μκ² ν΄μ€hello.html λ·° νμ΄μ§λ₯Ό λ°ν2) REST-API
@RestController λ₯Ό μ¬μ©νμ¬ λ°μ΄ν°κ° ννλ νμμΌλ‘ λ°ν@RestController : @Controller μ @ResponseBody μ μ‘°ν©μΌλ‘, λ°νκ°μ μλμΌλ‘ JSON νμμΌλ‘ λ³ννμ¬ ν΄λΌμ΄μΈνΈμκ² μ λ¬JSON , XML λ₯Ό μ£Όλ‘ λ°ννλ©°, λ€μν νμμ λ°μ΄ν°λ₯Ό λ°νν μ μμHTML μ λ°ννμ§ μμex)
@RestController
@RequestMapping("/")
public class AppController {
@GetMapping
public ResponseEntity<?> printHello() {
return ResponseEntity.ok("Hello!");
}
}
HTTPStatus.OK κ° λ°νλκ³ , κ°μΌλ‘ "Hello!" κ° λμ΄κ°@SpringBootTest
@AutoConfigureMockMvc
public class AppControllerTest {
@Autowired
private MockMvc mvc;
@Test
void t1() throws Exception {
ResultActions resultActions = mvc.perform(get("/"))
.andDo(print());
resultActions.andExpect(handler().handlerType(AppController.class))
.andExpect(handler().methodName("printHello"))
.andExpect(status().isOk())
.andExpect(jsonPath("$").value("Hello!"));
}
}
MockMvc λ₯Ό μ¬μ©νμ¬ μ»¨νΈλ‘€λ¬ ν
μ€νΈ μ§νstatus().isOk() λ‘ HttpStatus.OK κ° μ λμ΄μ€λμ§ νμΈ1) νλ‘ νΈμλμ λ°±μλμ λΆλ¦¬
REST-API λ νλ‘ νΈμλ(React, Vue, Angular λ±)μ __λ°±μλ(Spring, Django, Node.js λ±)λ₯Ό λΆλ¦¬νλ λ° μ΄μμ 2) ν΄λΌμ΄μΈνΈ λ€μμ± μ§μ
3) HTTP νλ‘ν μ½ κΈ°λ°
Postman λ± λ€μν λκ΅¬λ‘ μ½κ² ν
μ€νΈνκ³ μ¬μ©ν μ μμ4) λ¬Έμν λ° νμ€ν
Swagger λ±μΌλ‘ API λ¬Έμλ₯Ό μ½κ² μμ±νκ³ , ν΄λΌμ΄μΈνΈμ λͺ
μμ μΈ μν΅μ΄ κ°λ₯1) Postman
REST-API ν
μ€νΈλ₯Ό μν λꡬHTTP μμ²μ 보λ΄κ³ μλ΅μ νμΈν μ μμAPI λμμ μμ°νκ±°λ κ²°κ³Όλ₯Ό μΊ‘μ²νλ©° REST-API κ° μ λλ‘ λμνλ κ²μ 보μ¬μ€ μ μμ2) Swagger
REST-API μ λμμΈ, λ¬Έμν, κ°λ°, ν
μ€νΈ λ±μ μν μ€νμμ€ νλ‘μ νΈAPI λ₯Ό μ μνκ³ ν
μ€νΈνλ©° λ¬Έμνμ νμν μ¬λ¬ λꡬ μ 곡API μ€λͺ
μμ ν¨κ» μ€μ λ‘ API λ₯Ό μ€ννλ κ²λ κ°λ₯/swagger-ui.html μμ API μ€ν λ° νμΈ κ°λ₯1) GraphQL
REST-API μ λ¨μ μ 보μν λ°μ΄ν° 쿼리 μΈμ΄REST-API μμ μ°¨μ΄μ 2) gRPC
Google μμ κ°λ°ν μ격 νλ‘μμ νΈμΆ νλ μμν¬REST λ³΄λ€ κ³ μ±λ₯HTTP/2 λ₯Ό κΈ°λ°μΌλ‘ νλ©° λΉ λ₯΄κ³ ν¨μ¨μ 3) WebSocket
4) Serverless λ° BaaS(Backend as a Service)
REST_API λ³΄λ€ ν΄λΌμ°λ νλ«νΌμ μλΉμ€ κΈ°λ₯μ λ λ§μ΄ νμ©μ°Έκ³ ) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/