[ํ์คํ] JSON / RESTful API / CRUD
2023. 4. 19. 02:03ใComputerScience/FullStackProgramming
https://sohyeonkim-dev.tistory.com/171
* ์์ ์ดํด๋ณธ ๋ด์ฉ - 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)
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
- Software architectural style
- 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 ๋ก ๋๋ค.
- ํ์ฌ๋ง๋ค ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์์ฒด์ ์ผ๋ก ์ ์ํจ
REST API ์ค๊ณ๋ฅผ ์ํ ๋๊ตฌ๋ค
- Flask-RESTX
- Flask์์ REST API ๊ฐ๋ฐ์ด ์ฉ์ดํ๋๋ก ํ๋ ํ์ฅ ๊ธฐ๋ฅ
- 1) Flask ๊ตฌํ
- flask ์ค๋ธ์ ํธ ๋ง๋ค๊ณ ,
๋ฃจํธ ๋๋ ํ ๋ฆฌ๋ก ์ค๋ ํจ์๊ฐ ์๋ค๋ฉด,
hello() <- ์ํํด์ผ ํ ๋์์ ์จ๋ ๊ฒ
ํ์ผ์ ์ฐพ์๊ฐ๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ์ ๋ฐ๋ฅธ ๊ธฐ๋ฅ์ ํ๋ค!
- flask ์ค๋ธ์ ํธ ๋ง๋ค๊ณ ,
- 2) Flask-RESTX
- ์๊น๋ app์ผ๋ก ํ๋ก๊ทธ๋จ์ ๊ตฌ๋
์ด๋ฒ์๋ api๋ก ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ๊ฒ์ด ์ฐจ์ด์ - ๋ด๊ฐ ๋ฐ์์ ๋, ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ฉ์๋ -> class ํํ
hello url๋ก ์ค๋ get request๊ฐ ์ค๋ฉด ์๋ฅผ ์คํ
post, put, delete ๋ค์ ๋ฐ๋ฅผ ๋์์ ๊ฐ๋ฐ์๊ฐ ์์ฑ
RESTul api์ CRUD ์ฒ ํ์ ๋ฐ๋ฅด๋ ๊ฒ
- ์๊น๋ app์ผ๋ก ํ๋ก๊ทธ๋จ์ ๊ตฌ๋
- Swagger
- ์ด๊ธฐ HTTP์ ์๋๋, ๋๋ ํ ๋ฆฌ์ ํ์ผ ์ ์ก
ํ์ง๋ง CRUD ๊ธฐ๋ฅ์ ์ํ
์์ฒญ - ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ํ์์ผ๋ก ์งํํ ๊ฒ - fulsk-restX -> ์ค์จ๊ฑฐ๋ฅผ ์ด๋ฏธ ๊ฐ๊ณ ์์
- ์น์ฌ์ดํธ์์ ์ง์ ์๋ฒ์ test ํด๋ณผ ์ ์๋ค!
- ์ด๊ธฐ HTTP์ ์๋๋, ๋๋ ํ ๋ฆฌ์ ํ์ผ ์ ์ก
< ์ค๊ฐ๊ณ ์ฌ ๋ฒ์ ๋! :) >
'ComputerScience > FullStackProgramming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์คํ] ๊ธฐ๋ง๊ณ ์ฌ Summary (0) | 2023.07.21 |
---|---|
[ํ์คํ] HTTP's streaming / Curl / SOA / Microservice (1) | 2023.04.19 |
[ํ์คํ] HTTP request methods / Proxy Cache (0) | 2023.04.18 |
[ํ์คํ] HTTP/1.1 intro / URL, TCP/IP (0) | 2023.04.18 |
[ํ์คํ] ZMQ Pattern (0) | 2023.04.18 |