[ํ’€์Šคํƒ] JSON / RESTful API / CRUD

2023. 4. 19. 02:03ใ†ComputerScience/FullStackProgramming

 

 

 

 

https://sohyeonkim-dev.tistory.com/171

 

[ํ’€์Šคํƒ] HTTP's streaming / Curl / SOA / Microservice

HTTP Client Modules in Python Standard Libraries urllib : URL handling module URL์„ ์ „๋ฌธ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ http.client : HTTP protocol client module Non-Standard Library (recommended) 3rd - party “Requests: HTTP for Humans

sohyeonkim-dev.tistory.com

* ์•ž์„œ ์‚ดํŽด๋ณธ ๋‚ด์šฉ - 20๋…„์˜ ์‹œ๊ฐ„ ์••์ถ•ํ•œ ๊ฒƒ 
SOA -> SOAP -> HTTP + XML ->  
microservice -> Cloud computing -> Docker + ์ฟ ๋ฒ„๋„คํ‹ฑ์Šค
๊ฑ”๋„ค๊ฐ€ ๋ญ˜ ํ•˜๋ƒ? HTTP ๊ธฐ๋ฐ˜์˜ JSON์„ ์ฃผ๊ณ  ๋ฐ›๋Š”๋‹ค 
-> JSON -> REST, RESTful / CRUD

 

 

 

 

JSON Data Format

JavaScript Object Notation

  • JS ์–ธ์–ด์˜ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๋กœ ํ™•์‚ฐ๋œ ๊ฒƒ
  • ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” JS ๋ฒˆ์—ญ๊ธฐ๋ฅผ ๋‚ด์žฅํ•˜๊ธฐ์— ์›น ์„œ๋น„์Šค์— ์œ ๋ฆฌํ•จ
  • ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, JSON ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•จ
  • ํ™•์žฅ์ž .json๊ณผ ํƒ€์ž… application/json ์‚ฌ์šฉ์ด ํ™œ์šฉ๋จ
  • ๋ฌด์ƒํƒœ, ์‹ค์‹œ๊ฐ„ ์„œ๋ฒ„ ๋Œ€ ๋ธŒ๋ผ์šฐ์ € ํ†ต์‹  ํ”„๋กœํ† ์ฝœ๋กœ ๋งŽ์ด ํ™œ์šฉ๋จ
    • ์„œ๋ฒ„์™€ ์„œ๋ฒ„ ,์•ฑ๊ณผ ์„œ๋ฒ„๊ฐ€ JSON data๋ฅผ ์ฃผ๊ณ  ๋ฐ›์Œ
  • ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋ฅผ ์ง€์›
    • ์ •์ˆ˜, ์‹ค์ˆ˜ (๊ณ ์ •/๋ถ€๋™ ์†Œ์ˆ˜์ ), ๋ฌธ์ž์—ด
    • ๋ฐฐ์—ด : a, b, c ]
    • ๊ฐ์ฒด : “member1” : “value1”, “member2” : “value2” }
      -> dict ํ˜•ํƒœ๋กœ ์ œ๊ณต
  • ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ ํฌ๋งท’์ž„ (๋ฉ”์„œ๋“œ ํ‘œํ˜„ ๋ถˆ๊ฐ€)
  • ๋ฌธ์ž์—ด๊ณผ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„ ์ž‘์„ฑ์‹œ ํฐ ๋”ฐ์˜ดํ‘œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
  • ํŒŒ์ด์ฌ ๋”•์…”๋„ˆ๋ฆฌ์˜ key - value ๊ฐ’์œผ๋กœ ์ €์žฅ๋œ ๊ฒƒ  
  • ๋ฆฌ์ŠคํŠธ(members)ํ˜•ํƒœ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ์•„์ดํ…œ์ด ์žˆ๋‹ค (์•„๋ž˜ ์˜ˆ์‹œ์˜ entries)

 

 

  

https://emcien.com/json-format/

 

 

 

JSON Standard Library in Python

  • python ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • import json
  • python์ด ์•Œ์•„์„œ JSON ๊ฐ์ฒด <-> python ๊ฐ์ฒด ๋ณ€ํ™˜
  • JSON๊ณผ python ๋ฐ์ดํ„ฐ ํ˜•์‹ ๋ณ€ํ™˜ 1:1๋กœ ๋งค์นญ ๊ฐ€๋Šฅ

 

  • ๋Œ€ํ‘œ ํ•จ์ˆ˜
    •  json.dump() : dict ๋ฐ์ดํ„ฐ๋ฅผ json ํฌ๋งท ํŒŒ์ผ๋กœ ์ €์žฅ
    • json.load() : json ํŒŒ์ผ์„ ์ฝ์–ด์„œ dict ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜
    • json.dumps() : dict ๋ฐ์ดํ„ฐ๋ฅผ json ํฌ๋งท ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
    • json.loads() : json ํฌ๋งท ๋ฌธ์ž์—ด์„ dict ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜
  • ํŒŒ์ด์ฌ ์ž…์žฅ์—์„œ JSON์œผ๋กœ ๋ฐ€์–ด๋„ฃ๋Š” ๊ฒƒ -> dump
  • JSON ๊ฐ์ฒด๋ฅผ ํŒŒ์ด์ฌ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ -> load
  • JSON ํŒŒ์ผ -> JSON ๋ฌธ์ž์—ด : s๋ฅผ ๋ถ™์ธ๋‹ค 
  • python ๊ฐ€์ ธ์˜ค๋Š” ํ˜•์‹์€ ๋ชจ๋‘ python dict data

 

  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋‹ฌ๋ผ๋„ ์ƒ๊ด€ X
  • ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์–ธ์–ด๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค
  • ์ •๋ณด์˜ ํ˜•ํƒœ๋Š” JSON
  • ์ •๋ณด๋ฅผ ์‹ค์–ด ๋‚˜๋ฅด๋ฉด์„œ, ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ -> REST

 

 

 

REST & RESTful

  • HTTP ๊ตฌ์กฐ์— ๊ธฐ๋ฐ˜ํ•œ, ํ”„๋กœ๊ทธ๋žจ์˜ ์„ค๊ณ„ ๊ตฌ์กฐ
  • ์ผ์ข…์˜ ์ฒ ํ•™, ๊ฐœ๋…, ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌํ˜„์˜ ๊ฐ€์ด๋“œ๋ผ์ธ
  • ๊ทธ ์ฒ ํ•™์„ ๊ธฐ๋ฐ˜์œผ๋กœ, ๊ตฌ์ฒด์ ์ธ ํ˜•ํƒœ -> Restfulํ•œ API๋ผ๊ณ  ํ•จ 

 

  •  REST
    • Software architectural style 
      that was created to guide the design and development of the architecture for the WWW
  • RESTful
    • Any web service that obeys the REST constraints is informally described as RESTful
    • Such a web service must provide its Web resources in a textual representation
      and allow them to be read and modified with 
      a stateless protocol and a predefined set of operations
    • ์ƒํƒœ๊ฐ€ ์—†๋‹ค == ์•ž์„  ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๊ธฐ์–ต์ด ์—†๋‹ค
    • memeryless -> ํ˜„ ์ƒํƒœ์— ๋ฐ›์€ http์— ์ถฉ์‹คํ•จ

 

 

 

 

REST ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์กฐ๊ฑด

  • ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ
    • ์ผ๊ด€์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•จ
    • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์˜ ํ˜•ํƒœ, ์‘๋‹ตํ•  ๋•Œ์˜ ํ˜•ํƒœ ๋“ฑ
      ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜์–ด์•ผ ํ•จ 
  • ๋ฌด์ƒํƒœ(Stateless)
    • ๊ฐ ์š”์ฒญ ๊ฐ„ ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ˜ํ…์ŠคํŠธ๋Š” ์„œ๋ฒ„์— ์ €์žฅ X
    • ์ด์ „ ์ƒํ™ฉ์— ๋Œ€ํ•œ ๊ฒƒ์€ ์—†๋‹ค. 
    • ์ง€๊ธˆ ๋“ค์–ด์˜จ ์š”์ฒญ์— ๋Œ€ํ•ด, A API์„œ๋ฒ„๊ฐ€ ๋ฐ›๊ณ , 
      ์ดํ›„ ๋‹ค์Œ ์š”์ฒญ์„ B์„œ๋ฒ„๊ฐ€ ๋ฐ›์•„๋„ ์ƒ๊ด€์—†๋‹ค
    • ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค
  • ์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ(Cacheable)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต์„ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
    • ๋„คํŠธ์›Œํฌ, ์„œ๋ฒ„, ํด๋ผ์ด์–ธํŠธ์˜ ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
    • ํ•œ๋ฒˆ ๋ฐ›์•„๋‘๊ณ , ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉด ๊ณ„์† ์‚ฌ์šฉํ•œ๋‹ค -> Cache ์บ์‹œ!
  • ๊ณ„์ธตํ™”(Layered System)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ๋ณดํ†ต ๋Œ€์ƒ ์„œ๋ฒ„์— ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€, ๋˜๋Š” ์ค‘๊ฐ„ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜์—ˆ๋Š” ์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ
    • ์ค‘๊ฐ„ ์„œ๋ฒ„๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ์ด๋‚˜ ๊ณต์œ  ์บ์‹œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์‹œ์Šคํ…œ ๊ทœ๋ชจ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ์œ ์šฉํ•จ
    • ํ”„๋ก์‹œ ์„œ๋ฒ„ ๋งํ•˜๋Š” ๊ฒƒ?
    • ์ตœ์ ํ™”, ์„ฑ๋Šฅ ์˜ฌ๋ฆฌ๋Š” ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค
  • Code on demand (optional) - ์ž๋ฐ” ์• ํ”Œ๋ฆฟ์ด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ œ๊ณต์„ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋กœ์ง์„ ์ „์†กํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ™•์žฅ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

  • ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ ๊ตฌ์กฐ 
    • ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹จ์ˆœํ™”์‹œํ‚ค๊ณ  ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ (decouple)
    • ํด๋ผ์ด์–ธํŠธ - ์„œ๋ฒ„์˜ ๊ฐ ํŒŒํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•จ

 

 

  • ์‚ฌ์‹ค์€ HTTP ์„ค๋ช…์„ ํ•œ ๊ฒƒ 
  • HTTP ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ๊ตฌ์กฐ
  • ์›น ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ์ปจํ…์ธ  ์‹ค์–ด๋‚˜๋ฅด๋Š” ๊ฒƒ X
    A ์ปดํ“จํ„ฐ์™€ B ์ปดํ“จํ„ฐ ์‚ฌ์ด์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ 
    ๊ธฐ๋Šฅ ์š”์ฒญ๊ณผ ์ „์†ก์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ (request & response)
    ์ปจํ…์ธ ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ชฉ์ ์ด ์•„๋‹˜!
  • GET -> ํŒŒ์ผ ์š”์ฒญ X 
    -> ์ˆซ์ž ๋‘ ๊ฐœ ์ฃผ๊ณ  ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ
  • URL -> ์›๋ž˜๋Š” ํŒŒ์ผ ๋””๋ ‰ํ† ๋ฆฌ(์œ„์น˜)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ
  • BUT HTTP์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ, 
    REST ์ฒ ํ•™์„ ๋”ฐ๋ฅด๋Š” ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๊ณ , ๊ทธ์— ๋”ฐ๋ฅธ ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ

 

 

 

  •  HTTP Req/Res ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•œ Client & Server ๊ฐ„ ์ •๋ณด ์†ก์ˆ˜์‹ 
  • ํ•จ์ˆ˜/๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋ฅผ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ
  • ์˜ˆ๋ฅผ ๋“ค์–ด
    http://localhost/ ์„œ๋ฒ„๋ฅผ ๋‹ค
    ์Œ์ฒ˜๋Ÿผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค
    • http://localhost/my_api/๋กœ ํ•ด์„œ, ์„œ๋ฒ„๊ฐ€ “my_api”์— ๋Œ€์‘ํ•ด์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœ
    • ๋” ์ด์ƒ “my_api”๋Š” ์›๋ž˜ ์˜๋ฏธ์˜ directory ๊ฐœ๋…์ด ์•„๋‹˜
    • http://localhost/my_api/{๋ฌธ์ž์—ด} ์ฒ˜๋Ÿผ HTTP Req๋ฅผ Server์— ๋ณด๋‚ด๋ฉด,
      ์„œ๋ฒ„๋Š” 
      {๋ฌธ์ž์—ด}๊ณผ HTTP Req์˜ Body๋กœ ์ „๋‹ฌํ•œ ๊ฐ’์„ ์ž…๋ ฅ ํŒŒ๋ผ๋ฉ”ํƒ€๋กœ ํ•˜์—ฌ,
      GET/POST/PUT/DELETE์— ์ƒ
      ์‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , 
      ๊ฒฐ๊ณผ๋ฅผ Client์— ๋ฆฌํ„ด ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Œ
    • GET์„ Read๋กœ ๊ฐ„์ฃผํ•˜์—ฌ
      {๋ฌธ์ž์—ด}์„ Key ๊ฐ’์œผ๋กœ ํ•˜์—ฌ,
      ์„œ๋ฒ„์˜ record๋“ค์„ 
      ์ฐพ์•„ ๋Œ€์‘ํ•˜๋Š” Value๋ฅผ ๋ฆฌํ„ด
    • POST์„ Create๋กœ ๊ฐ„์ฃผํ•˜์—ฌ
      {๋ฌธ์ž์—ด}์„ Key ๊ฐ’์œผ๋กœ ํ•˜๊ณ ,
      HTTP Req์˜ Body์— ํ•ด
      ๋‹นํ•˜๋Š” ๊ฐ’์„ Value๋กœ ํ•˜๋Š” record๋ฅผ ์ƒ์„ฑ

 

 

 

Simple Guideline for REST API Design

  • ์ˆ˜ํ•™ ๊ณต์‹์ฒ˜๋Ÿผ ๋ช…ํ™•ํ•œ ๊ทœ์น™์€ ์—†์Œ
  • JSON ํฌ๋งท์œผ๋กœ ์ •๋ณด๋ฅผ ์†ก์ˆ˜์‹  ํ•จ
  • ํ†ต์ƒ CRUD(Create, Read, Update, and Delete)๋ฅผ ๋”ฐ๋ฆ„
  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” RESTful ๊ตฌํ˜„ ๋ฐฉ์‹

 

  • ์„œ๋ฒ„์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ ‘๊ทผํ•  ๋•Œ
  • DB์— ์ •๋ณด๋ฅผ ๋„ฃ์„ ๋•Œ -> ์ผ๋‹จ record๋ฅผ create 
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ, record๋ฅผ read, update, delete

 

  • POST 
  • create new, unique thing
  • request & ๋ณด๋‚ด๊ณ  ์‹ถ์€๊ฒŒ ์žˆ์œผ๋ฉด URL or JSON ์— ๋„ฃ์–ด์„œ ์ „๋‹ฌ
  • ํŒŒ์ผ์„ ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค!

 

  • ํ•ญ์ƒ ์ €๋Ÿฐ ์‹์œผ๋กœ ๋งคํ•‘?
  • ๊ผญ ๊ทธ๋Ÿฐ๊ฑด ์•„๋‹ˆ์ง€๋งŒ, ์ƒ์‹์ ์œผ๋กœ 
  • GET ์ด read -> PUT ์„ update ๋กœ ๋‘”๋‹ค.
  • ํšŒ์‚ฌ๋งˆ๋‹ค ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์€ ์ž์ฒด์ ์œผ๋กœ ์ •์˜ํ•จ

 

 

 

https://dev.to/ijsathi/basic-crud-operations-hg0

 

 

 

REST API ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ๋„๊ตฌ๋“ค

  •  Flask-RESTX
    •  Flask์—์„œ REST API ๊ฐœ๋ฐœ์ด ์šฉ์ดํ•˜๋„๋ก ํ•˜๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ
    • 1) Flask ๊ตฌํ˜„ 
      • flask ์˜ค๋ธŒ์ ํŠธ ๋งŒ๋“ค๊ณ ,
        ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์˜ค๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, 
        hello() <- ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๋™์ž‘์„ ์จ๋‘” ๊ฒƒ 
        ํŒŒ์ผ์„ ์ฐพ์•„๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ์— ๋”ฐ๋ฅธ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค! 
    • 2) Flask-RESTX
      • ์•„๊นŒ๋Š” app์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋™
        ์ด๋ฒˆ์—๋Š” api๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ฐจ์ด์ 
      • ๋‚ด๊ฐ€ ๋ฐ›์•˜์„ ๋•Œ, ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๋ฉ”์†Œ๋“œ -> class ํ˜•ํƒœ
        hello url๋กœ ์˜ค๋Š” get request๊ฐ€ ์˜ค๋ฉด ์–˜๋ฅผ ์‹คํ–‰ 
        post, put, delete ๋’ค์— ๋”ฐ๋ฅผ ๋™์ž‘์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑ
        RESTul api์˜ CRUD ์ฒ ํ•™์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ 

  • Swagger
    • ์ดˆ๊ธฐ HTTP์˜ ์˜๋„๋Š”, ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ์ „์†ก
      ํ•˜์ง€๋งŒ CRUD ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰
      ์š”์ฒญ - ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๋Š” ํ˜•์‹์œผ๋กœ ์ง„ํ™”ํ•œ ๊ฒƒ
    • fulsk-restX -> ์Šค์›จ๊ฑฐ๋ฅผ ์ด๋ฏธ ๊ฐ–๊ณ  ์žˆ์Œ 
    • ์›น์‚ฌ์ดํŠธ์—์„œ ์ง์ ‘ ์„œ๋ฒ„์— test ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค!
 

 

 

 

 

< ์ค‘๊ฐ„๊ณ ์‚ฌ ๋ฒ”์œ„ ๋! :) >