-
REST API - ๋๋ง์ ์ธ์ด๋ก ๋ธ๋ก๊น ํด๋ณด๊ธฐcodeStates front-end/node(server) 2023. 1. 31. 20:01๋ฐ์ํ
๐ REST API
๐REST( Representational State Transfer )
API ์๋ ๋ฐฉ์์ ๋ํ ์กฐ๊ฑด์ ๋ถ๊ณผํ๋ ์ํํธ์จ์ด ์ํคํ ์ณ
๋๊ท๋ชจ์ ๊ณ ์ฑ๋ฅ ํต์ ์ ์์ ์ ์ผ๋ก ์ง์
๐API
์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค
๋ค๋ฅธ ์ํํธ์จ์ด ์์คํ ๊ณผ ํต์ ํ๊ธฐ ์ํด ๋ฐ๋ผ์ผ ํ๋ ๊ท์น์ ์ ์
๐ REST API
์น์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ ์์์ HTTP URI๋ก ํํํ๊ณ , HTTP ํ๋กํ ์ฝ์ ํตํด ์์ฒญ๊ณผ ์๋ต์ ์ ์ํ๋ ๋ฐฉ์
REST ๊ตฌ์ฑ
- ์์(RESOURCE) - URI
- ํ์(Verb) - HTTP METHOD
- ํํ(Representations)
REST ํน์ง
1) ๊ท ์ผํ ์ธํฐํ์ด์ค : ์๋ฒ๊ฐ ํ์ค ํ์์ผ๋ก ์ ๋ณด๋ฅผ ์ ์ก
2) ๋ฌด์ํ : ์๋ฒ๊ฐ ์ด์ ์ ๋ชจ๋ ์์ฒญ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ๋ชจ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์๋ฃํ๋ ํต์ ๋ฐฉ๋ฒ
3) ๊ณ์ธตํ ์์คํ : ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ์ฌ๋ฌ ์๋ฒ์์ ์คํ๋๋๋ก RESTful ์น ์๋น์ค๋ฅผ ์ค๊ณ
4) ์บ์ ๊ฐ๋ฅ์ฑ : ํด๋ผ์ด์ธํธ ๋๋ ์ค๊ฐ์์ ์ผ๋ถ ์๋ต์ ์ ์ฅํ๋ ํ๋ก์ธ์ค์ธ ์บ์ฑ์ ์ง์
5) ์จ๋๋งจ๋ ์ฝ๋ : ์๋ฒ๋ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฅ์ ์ผ์์ ์ผ๋ก ํ์ฅํ๊ฑฐ๋ ์ฌ์ฉ์ ์ง์ ๊ฐ๋ฅ
REST API ์ด์
ํ์ฅ์ฑ ์ ์ฐ์ฑ ๋ ๋ฆฝ์ฑ
์ฉ์ด ์ ๋ฆฌ
- ๋ฆฌ์์ค(Resource): ๋ฐ์ดํฐ์ ์ผ๋ถ์ ๋๋ค. (์. user)
- ์ฝ๋ ์ (Collection): ๋ฆฌ์์ค์ ์งํฉ์ ๋๋ค. (์. users)
- URL(Identifies the location): ๋ฆฌ์์ค ํน์ ์ฝ๋ ์ ์ ์๋ณํ ์ ์๋ ๊ฒฝ๋ก์ ๋๋ค
๐REST API๋ฅผ ๋์์ธํ๋ ๋ฐฉ๋ฒ
๋ ์ค๋๋ฅด๋ ๋ฆฌ์ฐจ๋์จ(Leonard Richardson) 4๋จ๊ณ ๋ชจ๋ธ
https://jaehoney.tistory.com/176 ๐REST ์ฑ์๋ ๋ชจ๋ธ - 0๋จ๊ณ
REST API๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๋จ๊ณ
๋ฆฌ์์ค ๊ตฌ๋ถ ์์ด HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ธฐ๋ง ํด๋ ๊ฐ๋ฅํ๋ค
ํ๋์ End-point๋ฅผ ์ฌ์ฉํด์ HTTP Method๋ ๋ฐ๋์ POST๊ฐ ๋๋ค
์ฌ์ฉ์์)
Reqest : ์ ์ ๋ฅผ ์์ฒญํ๋ฉด
POST /api/user { "function": "getUser", "arguments" [ "1" ] }
Resposne : ์ฝ๋๋ 200๊ณผ ํจ๊ป ์์ฒญ์ ๋ฐ๊ณ
HTTP/1.1 200 OK { "result" { "id": "1" "name": "honey", } }
CRUD : HTTP Method๋ ๋ฐ๋์ POST๊ฐ ๋๋ค
CREATE : POST /api/user READ : POST /api/user UPDATE : POST /api/user DELETE : POST /api/user
๐REST ์ฑ์๋ ๋ชจ๋ธ - 1๋จ๊ณ
๋ฆฌ์์ค ๊ฐ๋ ์ ๋์
๋ชจ๋ ์์ฒญ์ ํ๋์ ์๋ํฌ์ธํธ(๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๊ณ ๋คํธ์ํฌ๋ฅผ ํตํด ํต์ ํ๋ ๋ชจ๋ ๋๋ฐ์ด์ค)๋ก ๋ณด๋ด๋ ๊ฒ
์ด ์๋๋ผ ๊ฐ๋ณ ๋ฆฌ์์ค์ ํต์
์์ฒญํ๊ณ ๋ฐ์ ์์์ ๋ํ ์ ๋ณด๋ฅผ ์๋ต์ผ๋ก ์ ๋ฌํด์ผ ํ๋ค๋ ๊ฒ
HTTP Method๋ GET๊ณผ POST๋ง ์ฌ์ฉํ๊ณ ์ฝ๋๋ 200์ผ๋ก ์ ๋ฌ
์ฌ์ฉ์์)
Reqest : ์ ํํ ์ ์ ์ ์ ๋ฌด๋ฅผ ๋ฌผ์ด๋ณด๋ฉด
POST /api/users/create { "name": "honey" }
Resposne : ์ฝ๋๋ 200๊ณผ ํจ๊ป ์์ฒญ์ ๋ฐ๊ณ
HTTP/1.1 200 OK { "result" { "error": "already exist member" } }
CRUD : GET๊ณผ POST๋ง ์ฌ์ฉ
CREATE : POST /api/users/create READ : GET /api/users/1 UPDATE : POST /api/users/update DELETE : POST /api/users/remove/1
๐REST ์ฑ์๋ ๋ชจ๋ธ - 2๋จ๊ณ
2๋จ๊ณ๋ CRUD์ ๋ง๊ฒ ์ ์ ํ HTTP ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ค์
์กฐํ(READ) -> GET, ์์ฑ(CREATE) -> POST
์๋ต ์ฝ๋๋ 201 Created๋ก ๋ช ํํ๊ฒ ์์ฑ
ํ์ฌ ๊ฐ์ฅ ๋ง์ REST API๊ฐ ์ด ๋จ๊ณ์ ํด๋น
์ฌ์ฉ์์)
Reqest : ์ ํํ ์ ์ ์ ์ ๋ฌด๋ฅผ ๋ฌผ์ด๋ณด๋ฉด
POST /api/users/create { "name": "honey" }
Resposne : ์ฝ๋๋ 201๊ณผ ํจ๊ป ์์ฒญ์ ๋ฐ๊ณ
HTTP/1.1 201 Created Content-Type: application/json { "result" { "id": "1", "name": "honey" } }
CRUD : CREATE/READ/UPDATE/DELETE
CREATE : POST /api/users READ : GET /api/users/1 UPDATE : PUT /api/users/1 DELETE : DELETE /api/users/1
๐REST ์ฑ์๋ ๋ชจ๋ธ - 3๋จ๊ณ
HATEOAS(Hypertext As The Engine Of Application State)
ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ ์ ์ฉ
์์ฒญ์ 2๋จ๊ณ์ ๋์ผ ์๋ต์ URI๋ฅผ ํฌํจํ ๋งํฌ ์์๋ฅผ ์ฝ์ ํ์ฌ ์์ฑ
์๋ต ๋ด์ ์๋ก์ด ๋งํฌ๋ฅผ ๋ฃ์ด ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ทผ ๊ฐ๋ฅ
์ถ๊ฐ์ ์ผ๋ก ๋ค์ Request์ ํ์ํ End-point๊น์ง ์ ๊ณต์ ํ๋ค. ์ด๋ Uniform Interface์ HATEOAS๋ฅผ ์๋ฏธ
์ฌ์ฉ์์)
Reqest
GET /api/
Resposne
HTTP/1.1 200 OK Content-Type: application/json { "/api/users", "/api/users/{userId}/roles", "/api/products", "/api/..." }
Reqest
GET /api/users/1
Resposne
HTTP/1.1 200 OK Content-Type: application/json { "result" { "id": "1", "name": "honey", "_links": { "self" : { "href" : "https:/api/users/1" }, "update" : { "href" : "https:/api/users/1" }, "list" : { "href" : "https:/api/users/" // ํด๋ผ์ด์ธํธ์๊ฒ ํฅ๋ฏธ๋ฅผ ๋ ์ ์๋ ์์ }, } }
๐OPEN API
๋๊ตฌ์๊ฒ๋ ์ ๊ทผ ๊ฐ๋ฅํ API(์ด์ฉ ์์น o, ์ ํ์ฌํญ o)
๐ API Key
API๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ key๊ฐ ํ์
์๋ฒ ๋ฌธ์ ์ฌ๋ ์ด์
๋ฐ์ํ'codeStates front-end > node(server)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mini-Node Server (0) 2023.02.08 CORS ๊ฐ์ (0) 2023.02.06 ๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ(๋ณด์ด๋ ๊ณณ) - AJAX, SSR๊ณผ CSR (0) 2023.01.30 ๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ(๋ณด์ด์ง ์๋ ๊ณณ) - URL/URI, IP, port, domain, DNS (0) 2023.01.30 HTTP/๋คํธ์ํฌ ๊ธฐ์ด (0) 2023.01.30