REST๋?๐
`REST๋ (Representational State Transfer) ์ ์ฝ์`
์์(resourece)์ ํํ(representation)์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น์ฅ์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋คโ๏ธ
- ์ฆ REST๋
- HTTP URI(Uniform Resource Identifier)๋ฅผ ํตํด ์์(Resource)์ ๋ช ์ํ๊ณ ,
- HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํตํด
- ํด๋น ์์(URI)์ ๋ํ CRUD Operation์ ์ ์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
CRUD Operation์ด๋
CRUD๋ ๋๋ถ๋ถ์ ์ปดํจํฐ ์ํํธ์จ์ด๊ฐ ๊ฐ์ง๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ธ Create(์์ฑ), Read(์ฝ๊ธฐ), Update(๊ฐฑ์ ), Delete(์ญ์ )๋ฅผ ๋ฌถ์ด์ ์ผ์ปซ๋ ๋ง๋ก
REST์์์ CRUD Operation ๋์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
REST ๊ตฌ์ฑ ์์
**REST๋ ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค.**
- ์์(Resource) : HTTP URI
- ์์์ ๋ํ ํ์(Verb) : HTTP Method
- ์์์ ๋ํ ํ์์ ๋ด์ฉ (Representations) : HTTP Message Pay Load
REST์ ํน์ง
- Server-Client(์๋ฒ-ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ)
- Stateless(๋ฌด์ํ)
- Cacheable(์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ)
- Layered System(๊ณ์ธตํ)
- Uniform Interface(์ธํฐํ์ด์ค ์ผ๊ด์ฑ)
REST์ ์ฅ๋จ์
- **์ฅ์ **
- HTTP ํ๋กํ ์ฝ์ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก REST API ์ฌ์ฉ์ ์ํ ๋ณ๋์ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ ํ์๊ฐ ์๋ค.
- HTTP ํ๋กํ ์ฝ์ ํ์ค์ ์ต๋ํ ํ์ฉํ์ฌ ์ฌ๋ฌ ์ถ๊ฐ์ ์ธ ์ฅ์ ์ ํจ๊ป ๊ฐ์ ธ๊ฐ ์ ์๊ฒ ํด ์ค๋ค.
- HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- Hypermedia API์ ๊ธฐ๋ณธ์ ์ถฉ์คํ ์งํค๋ฉด์ ๋ฒ์ฉ์ฑ์ ๋ณด์ฅํ๋ค.
- REST API ๋ฉ์์ง๊ฐ ์๋ํ๋ ๋ฐ๋ฅผ ๋ช ํํ๊ฒ ๋ํ๋ด๋ฏ๋ก ์๋ํ๋ ๋ฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
- ์ฌ๋ฌ ๊ฐ์ง ์๋น์ค ๋์์ธ์์ ์๊ธธ ์ ์๋ ๋ฌธ์ ๋ฅผ ์ต์ํํ๋ค.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ๋ค.
- **๋จ์ **
- ํ์ค์ด ์์ฒด๊ฐ ์กด์ฌํ์ง ์์ ์ ์๊ฐ ํ์ํ๋ค.
- ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ 4๊ฐ์ง๋ฐ์ ์๋ค.
- HTTP Method ํํ๊ฐ ์ ํ์ ์ด๋ค.
- ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ํ ์คํธํ ์ผ์ด ๋ง์ ์๋น์ค๋ผ๋ฉด ์ฝ๊ฒ ๊ณ ์น ์ ์๋ URL๋ณด๋ค Header ์ ๋ณด์ ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํ๋ฏ๋ก ์ ๋ฌธ์ฑ์ด ์๊ตฌ๋๋ค.
- ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ด ๋์ง ์์ ์ง์ํด์ฃผ์ง ๋ชปํ๋ ๋์์ด ๋ง๋ค.(์ต์คํด๋ก์ด)
- **REST API ์ค๊ณ ์์** 1. URI๋ ๋์ฌ๋ณด๋ค๋ ๋ช
์ฌ๋ฅผ, ๋๋ฌธ์๋ณด๋ค๋ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํ๋ค. Bad Example http://khj93.com/Running/
Good Example http://khj93.com/run/ 2. ๋ง์ง๋ง์ ์ฌ๋์ (/)๋ฅผ ํฌํจํ์ง ์๋๋ค. Bad Example http://khj93.com/test/
Good Example http://khj93.com/test 3. ์ธ๋๋ฐ ๋์ ํ์ดํฐ์ ์ฌ์ฉํ๋ค. Bad Example http://khj93.com/test_blog
Good Example http://khj93.com/test-blog 4. ํ์ผํ์ฅ์๋ URI์ ํฌํจํ์ง ์๋๋ค. Bad Example http://khj93.com/photo.jpg
Good Example http://khj93.com/photo
**REST API ์ฑ์๋ ๋ชจ๋ธ (Maturity Model)**
Level 0 : 1 URI, 1 HTTP method
level 0์ ์น ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ง ์๊ณ HTTP๋ฅผ ์๊ฒฉ ํต์ ์ ์ํ ์ ์ก ์์คํ ์ผ๋ก ์ฌ์ฉํ๋ค. RPC(Remote Precedure Call) ํํ๋ก ๋ฆฌ์์ค ๊ตฌ๋ถ ์์ด ์ค๊ณ๋ HTTP API์ด๋ค.
๊ทธ์ ๋จ์ํ๊ฒ POX(Plain Old XML)๋ฅผ ์ฃผ๊ณ ๋ฐ๋ RPC ์คํ์ผ ์์คํ ์ ๋งํ๋ค. ๋จ ํ๋์ endpoint๋ฅผ ์ฌ์ฉํ๊ณ , ์ ๋ฌ๋๋ ์๋ก ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ํ๋์ endpoint์์ ์ฌ๋ฌ ๋์์ ํ๊ฒ ๋๋ค. ๋งค๊ฐ ๋ณ์๋ฅผ body๋ก ์ ๋ฌํ๊ธฐ ์ํด HTTP method๋ POST๊ฐ ๋๋ค.
- Request,Response,CRUD Request
ResponsePOST https://api/user { "function": "getUser", "arguments" [ "1" ] }
CRUDHTTP/1.1 200 OK { "result" { "id": "1" "name": "yoonyoung", } }
CREATE : POST /api/user READ : POST /api/user UPDATE : POST /api/user DELETE : POST /api/user
Level 1 : N URI, 2 HTTP method
๋ฆฌ์์ค๋ฅผ ๋์ ํ๋ค. ๋ชจ๋ ์์ฒญ์ ๋จ์ผ ์๋น์ค endpoint๋ก ๋ณด๋ด๋ ๊ฒ์ด ์๋๋ผ ๊ฐ๋ณ ๋ฆฌ์์ค์ ํต์ ํ๊ฒ ๋๋ค. ๋ฆฌ์์ค๋ณ๋ก ๊ณ ์ ํ URI๋ฅผ ์ฌ์ฉํด์ ์๋ณํ๋ค.
- Request,Response,CRUD Request
ResponsePOST https://api/users/create { "name": "yoonyoung" }
CRUDHTTP/1.1 200 OK { "result" { "error": "already exist member" } }
CREATE : POST /api/users/create READ : GET /api/users/1 UPDATE : POST /api/users/update DELETE : POST /api/users/remove/1
HTTP method๋ GET๊ณผ POST๋ง ์ฌ์ฉํ๊ณ ์๊ณ , Response์์๋ error์ธ ๊ฒฝ์ฐ์๋ Status Code๋ฅผ 200์ผ๋ก ์ ๋ฌํ๊ณ ์๋ค. ๋ HTTP headers์ Content-Type์ด๋ Cache ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
Level 2 : N URI, 4 HTTP method
2๋จ๊ณ์์๋ HTTP method์ธ GET, POST, PUT, DELETE๋ฅผ ์ฌ์ฉํด CRUD๋ฅผ ๋ํ๋ด๊ณ ๋ฉ์์ง์ Status Code๋ ๋ด๊ฒจ ๋ฐํํ๋ค. GET์ ์ํ๋ฅผ ๋ณํ์ํค์ง ์๋ ์์ ํ Action์ ๋ํ๋ด๊ณ , ์์ ํ๊ฒ ์ผ๋ง๋ ์ง ํธ์ถํ ์ ์๊ณ ๋งค๋ฒ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ก ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์บ์ฑ์ ํ ์ ์์ด ์ฌ์ฉ์ ์ ์ฅ์์ ์ฑ๋ฅ ํฅ์๋ ๋๋ ์ ์๋ค.
์ค๋ช ์์๋ GET, POST, PUT, DELETE์ 4๊ฐ์ง CRUD๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋์์์ง๋ง, POST์ GET๋ง ์ฌ์ฉํด๋ ์ถฉ์กฑ๋๋ ๊ฒ ๊ฐ๋ค.
- Request,Response,CRUD Request
ResponsePUT https://api/users { "name": "yoonyoung" }
CRUDHTTP/1.1 201 Created Content-Type: application/json { "result" { "id": "1", "name": "yoonyoung" } }
CREATE : POST /api/users READ : GET /api/users/1 UPDATE : PUT /api/users/1 DELETE : DELETE /api/users/1
2๋จ๊ณ์์๋ URI์ action์ด ๋ด๊ธฐ์ง ์๊ณ , ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ๋ GET์๋ ์บ์๊ฐ ์ ์ฉ๋๋ค. Response์๋ ์๋ฏธ์๋ HTTP Status Code๊ฐ ๋ฐํ๋๋ค. Status Code๋ฅผ ๋ชจ๋ ํ์ฉํ ํ์๋ ์๊ณ , ํด๋ผ์ด์ธํธ ์ ์ฅ์์ 200 OK์ธ์ง, ํด๋ผ์ด์ธํธ ์๋ชป(400 Bad Request) ์ธ์ง, ์๋ฒ ์๋ชป(500 Internal Server Error)์ธ์ง ์ ๋๋ฅผ ์ ์ ์๋๋ก ์ ๋ฌํด์ฃผ๋ฉด ์ถฉ๋ถํ๋ค. ๋ค๋ง, ์คํจ์ผ ๊ฒฝ์ฐ Body์ ์ ์คํจํ๋์ง ์ ๋ณด๋ฅผ ๋ณด๋ด์ฃผ๋ฉด ์ข๋ค.
Level 3 : Hypermedia As Engine of Application State
3๋จ๊ณ๊น์ง๋ ์์ผ ์ง์ ํ REST API๋ผ๊ณ ํ๋ค. API ์๋น์ค์ ๋ชจ๋ endpoint๋ฅผ ์ต์ด ์ง์ ์ ์ด ๋๋ URI๋ฅผ ํตํด Hypertext Link ํํ๋ก ์ ๊ณตํ๋ค. ์์ฆ API๋ API ๋ฌธ์๋ฅผ ์ ๊ณตํ์ง๋ง ๋จ์ํ API ๋ชฉ๋ก ์ ๊ณต๋ฟ๋ง ์๋๋ผ ์ด๋ค request์ ๋ค์ request์ ํ์ํ endpoint๊น์ง ์ ๊ณตํ๋ค. ํด๋ผ์ด์ธํธ์๊ฒ ๋ค์์ ์ด๋ค ๋์์ด ๊ฐ๋ฅํ์ง ํํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค.
๋ค์์ ๋ฌด์์ ํ ์ ์๋์ง, ๊ทธ๊ฒ์ ํ๊ธฐ ์ํด ๋ค๋ฃจ์ด์ผ ํ ๋ฆฌ์์ค์ URI๋ฅผ ์๋ ค์ค ์ ์๋ค. ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์๊ณ URI scheme์ ๋ณ๊ฒฝํ ์ ์๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๋งํฌ URI๋ฅผ ์ฐพ๋ ๋์, ์๋ฒ ํ์ ์ต์ด ์ง์ ์ ์ ์ ์ธํ ๋ชจ๋ URI ์์ ์ ํ ์ ์๋ค.
- Request,Response,CRUD,Response Request
ResponseGET https://api/
CRUDHTTP/1.1 200 OK Content-Type: application/json { "/api/users", "/api/users/{userId}/roles", "/api/products", "/api/..." }
ResponseGET https://api/users/1
HTTP/1.1 200 OK Content-Type: application/json { "result" { "id": "1", "name": "yoonyoung", "nextActions": { "/api/users/{userId}/roles", } } }
OPEN API ์ API KEY
Open API
Open API๋ ๋ง ๊ทธ๋๋ก ๊ฐ๋ฐฉํ API
API๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค๋ ์๋ฏธ์ด๋ฏ๋ก Open API๋ ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ฐฉ ์ํ์ ์ธํฐํ์ด์ค๋ฅผ ๋งํ๊ณ ์๋ค.
๋ค์์ด๋ ๊ตฌ๊ธ,๋ค์ด๋ฒ ๋ฑ์ ํฌํธ์ฌ์ดํธ๋ ํต๊ณ์ฒญ,๊ธฐ์์ฒญ ๋ฑ์์ ์์งํ ์๋ฃ๋ฅผ ์์ฉํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ ์ ์๊ฒ ์ ๊ณตํ๋ ์๋น์ค์ด๋ค.
API KEY
API๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ API Key๊ฐ ํ์ํ๋ค. API Key๋ ์๋ฒ์ ๋ฌธ์ ์ฌ๋ ์ด์ ์ด๋ค. (์๋ฒ๋ฅผ ์ด์ฉํ๋๋ฐ ๋น์ฉ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ ์ฅ์์๋ ์๋ฌด๋ฐ ์กฐ๊ฑด ์์ด ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ์ดํฐ ์ ๊ณตํ ์๋ฌด X)
'codestates' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Effect Hook ์ฌ์ฉํ๊ธฐ (0) | 2022.06.20 |
---|---|
URL & URI (0) | 2022.06.16 |
React Props, State (0) | 2022.06.13 |
React ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ก SPA๊ฐ๋ฐ (0) | 2022.06.10 |
React intro (0) | 2022.06.09 |
Comment