๐ REST๋ (REpresentational State Transfer)?
HTTP๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ๋ฐฉ์์ ๊ท์ ํ ์ํคํ ์ฒ.
๐ REST ํน์ง
โพ Uniform
URI๋ก ์ง์ ํ ๋ฆฌ์์ค์ ๋ํ ์กฐ์์ ํ์ ์ ์ด๊ณ ํต์ผ๋ ์ธํฐํ์ด์ค๋ก ์ํํ๋ ์ํคํ ์ณ๋ค.
--> REST๊ฐ ์ง์ ํ API๋๋ก๋ง ์กฐ์ํ๊ฒ ํ๋๊น !
โพ Stateless
์์ ์ ์ํ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๊ด๋ฆฌํ์ง ์์ต๋๋ค.
API server๋ ๋ค์ด์ค๋ ์์ฒญ๋ง ์ฒ๋ฆฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์๋น์ค์ ์์ ๋๊ฐ ๋์์ง๊ณ ๊ตฌํ์ด ๋จ์ํด์ง๋ค.
--> ์์ฒญ๋ง ๋จ์ํ๊ฒ ์ฒ๋ฆฌ !
โพ Cacheable
REST๋ HTTP๋ผ๋ ๊ธฐ์กด ์น ํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ํ์ฉํ ์ ์๋ค.
๋ฐ๋ผ์, HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์๋ค.
--> Last-Modified Tag / E-Tag ํ์ฉ๊ฐ๋ฅ !
โพ Self-descriptiveness
REST API๋ง ๋ณด๋๋ผ๋ HTTP ์์ฒญ์ ๋ด์ฉ์ ์ดํดํ ์ ์๋ค.
โพ Client-Server ๊ตฌ์กฐ
์๋ฒ๋ API๋ง ์ ๊ณตํ๊ณ
ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธ์ฆ์ด๋ context (๋ก๊ทธ์ธ ์ ๋ณด, ์ธ์ )๋ง ๊ด๋ฆฌํ๊ฒ ๋๋ฏ๋ก ๊ฐ์์ ์ญํ ์ด ํ์คํ๊ฒ ๊ตฌ๋ถ๋์๋ค.
๊ณ ํ๋๋ฐ ์ด ๋ด์ฉ์ ๋ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค
โพ hierarchical ๊ตฌ์กฐ
REST๋ฅผ ์ด์ฉํด ๋ค์ค ๊ณ์ธต์ ์๋ฒ๋ฅผ ๊ตฌ์ถํ ์ ์๋ค.
๋ณด์, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ํธํ ๊ณ์ธต์ ์ถ๊ฐํด ๊ตฌ์กฐ์์ ์ ์ฐ์ฑ์ ๋ ์ ์๊ณ
PROXY๋ ๊ฒ์ดํธ ์จ์ด ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ค๊ฐ ๋งค์ฒด๋ ํ์ฉํ ์ ์๋ค.
์์ง ๋ฌด์จ ๋ง์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค
๐ REST API๋?
REST๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค API๋ฅผ ๊ตฌํํ ๊ฒ.
REST API์ ๊ตฌ์ฑ ์์ 3๊ฐ์ง
โ ์์ (resource)
โ ํ์ (verb)
โ ํํ (representation)
๐ ์ค๊ณ ์์น
โพ URI๋ ๋ฆฌ์์ค(์์)๋ฅผ ํํํด์ผ ํ๋ค.
#bad
GET /get Todos/1
#good
GET /todos/1
URI๋ ๋ฆฌ์์ค๋ฅผ ํํํ๋ ๋ฐ ์ค์ ์ ๋ฌ์ผํ๊ธฐ ๋๋ฌธ์, ๋์ฌ๋ณด๋ค๋ ๋ช ์ฌ๋ก ์ด๋ฆ์ ์ค์ ํด์ผ ํ๋ค. ( ๋ช ๋ น์ด๋ out! out! )
โพ ๋ฆฌ์์ค(์์)์ ๋ํ ํ์๋ HTTP ์์ฒญ ๋ฉ์๋๋ก ํํํ๋ค.
#bad
GET /todos/delete/1
#good
DELETE /todos/1
๋ฆฌ์์ค์ ๋ํ ํ์๋ HTTP ์์ฒญ ๋ฉ์๋๋ฅผ ํตํด ํํํ๋ฉฐ URI์ ํํํ์ง ์๋๋ค.
HTTP ์์ฒญ ๋ฉ์๋๋ GET, POST, PATCH, DELETE ๋ฑ์ ์ฌ์ฉํ๋ค.
๐ HTTP ์์ฒญ ๋ฉ์๋ (์ผ๋ถ) REST API ๊ท์น
GET
ํน์ ๋ฆฌ์์ค๋ฅผ ์กฐํ๋ง ํ๋ค.
POST
ํน์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ค.
PUT
์ํ๋ ๋ฐ์ดํฐ๋ก ํน์ ๋ฆฌ์์ค ์ ์ฒด๋ฅผ ์์ ํ๋ค.
PATCH
์ํ๋ ๋ฐ์ดํฐ๋ก ํน์ ๋ฆฌ์์ค ์ผ๋ถ๋ฅผ ์์ ํ๋ค.
DELETE
ํน์ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๋ค.
๐ PUT๊ณผ PATCH์ ์ฐจ์ด
์ธ๋ป๋ณด๋ฉด ์ ์ ์ฒด์ ์ผ๋ถ ~ ํ๋ฉด์ ๋์ด๊ฐ ์ ์์ง๋ง ์์๋ฅผ ๋ณด๋ฉด ์ญ ? ์ค๋ฝ๋ค.
๋์ผํ body์ ์์ฒญ์ ๋ณด๋ด๋ฉด ๋๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง body๊ฐ ๋ชจ๋ data๋ฅผ ํฌํจํ์ง ์์์ ๋, ๋์ ์ฐจ์ด์ ์ด ์๊ธด๋ค.
PUT์ ์ ๋ง ์ ์ฒด๋ฅผ ์์ ํ๊ธฐ ๋๋ฌธ์ ์กด์ฌํ์ง ์๋ ํค ๊ฐ์ ๋ํด์๋ null ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ,
PATCH๋ ๋ถ๋ถ์ ์์ ํ๊ธฐ ๋๋ฌธ์ ์กด์ฌํ์ง ์๋ ํค ๊ฐ์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
๐ HTTP ์ํ ๋ฉ์ธ์ง (Status Codes)
200 - OK
์์ฒญ ์ํ ์๋ฃ ๐
201 - CREATED
๋ฆฌ์์ค ์์ฑ ์์ฒญ ์ํ ์๋ฃ (์์ฑ๋์์ต๋๋ค๐)
204 - NO CONTENT
๋ฆฌ์์ค ์ญ์ ์์ฒญ ์ํ ์๋ฃ (์ญ์ ๋์์ต๋๋ค๐)
304 - NOT MODIFIED
์์ฒญ์ด ์ด๋ฏธ ์บ์ฌ๋์ด ์๋ ๊ฒฝ์ฐ && ์์ฒญ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ๊ฒฝ์ฐ
์์ฒญํ๋ ์ ๋ณด๋ฅผ ์ด๋ฏธ ๋์คํฌ์ ๊ฐ์ง๊ณ ์์ ๊ฒฝ์ฐ์ (์บ์๋์ด ์๋ ๊ฒฝ์ฐ)
๋ธ๋ผ์ฐ์ ๋ ์ด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์์ฒญ์ ๋ณด๋ธ๋ค. --> Conditional Get Request
์๋ฒ๋ ์์ฒญ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ๊ฒฝ์ฐ 304๋ฅผ ๋ฆฌํดํ๊ณ , ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ก ์๋ต์ ๋ณด๋ธ๋ค.
400 - BAD REQUEST
์๋น ์์ฒญ์ด ๋ถ์ ์ ํ๊ฑฐ๋, ๋ค์ด์ค ์ ์๋ ์์ฒญ์ผ ๊ฒฝ์ฐ
401 - UNATHORIZED
์๋น ํด๋น ์์ฒญ์ ํ๋ ค๋ฉด ์ฌ์ฉ์ ์ธ์ฆ์ด ํ์ํฉ๋๋ค
403 - FORBIDDEN
์๋น ํด๋น ์์ฒญ์ ๋ํ ์๋ต์ ์๋๋ฐ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ ํฉ๋๋ค
์ด ๊ฒฝ์ฐ๋ ํด๋น ๋ฆฌ์์ค๊ฐ ์กด์ฌํ๋ค๋ ๊ฑธ ์๋ฆฌ๋ ์๋ฌ์ด๊ธฐ ๋๋ฌธ์ 400์ด๋ 404๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅ.
404 - NOT FOUND
์๋น ํด๋น ์์ฒญ์ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค
500 - INTERNAL SERVER ERROR
์๋น ์๋ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค
API ๊ฐ๋ฐ์๋ค์ ์ด ๋ฌธ์ ๋ฅผ ํํ ํผํด์ผํฉ๋๋ค.
์ฐธ๊ณ ๋ฌธ์
'Front-end > Browser' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ผ์ฐ์ ์ Node JS : ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค (์ถ๊ฐ์ค) (0) | 2021.10.20 |
---|---|
Event Loop & Task queue ์ด๋ฒคํธ ๋ฃจํ์ ํ์คํฌ ํ (0) | 2021.09.18 |
URI ๊ทธ๋ฆฌ๊ณ URL, URN (0) | 2021.09.11 |
Client - Server : SOP์ CORS (0) | 2021.09.10 |
๋ธ๋ผ์ฐ์ ๋ ๋๋ง ๊ณผ์ && ๊ฐ์ข ์ฉ์ด ์ ๋ฆฌ (0) | 2021.08.22 |
๋๊ธ