๋ก์ด ํ๋ฉ์ 2000๋ ๋ฐ์ฌํ์ ๋ ผ๋ฌธ์์ ์๊ฐ๋์ด ์ง๊ธ๊น์ง ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ REST API์ ๋ํด ์ ๋ฆฌํ ์๋ฃ.
๐ค REST (Representational State Transfer)
- ๋ถ์ฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ
(์ : ์น)์ ์ํ ์ํคํ
์ณ ์คํ์ผ
- ์ํคํ ์ณ ์คํ์ผ: ์ ์ฝ์กฐ๊ฑด๋ค์ ์งํฉ
- ์ฆ, REST์ ์ ์ฝ์กฐ๊ฑด๋ค์ ๋ชจ๋ ์ง์ผ์ผ REST์ธ ๊ฒ์ด๋ค.
- ์์์ ์ด๋ฆ(์์์ ํํ)์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ(์ ๋ณด)๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ์์(Resource)์ ํํ(Representation)์ ์ํ ์ํ ์ ๋ฌ
- CRUD
- Create - ์์ฑ (POST)
- Read - ์กฐํ (GET)
- Update - ์์ (PUT)
- Delete - ์ญ์ (DELETE)
- Header - header ์ ๋ณด ์กฐํ (HEAD)
- ์์ (Resource) : URI
- ๋ชจ๋ ์์์ URI๋ผ๋ ๊ณ ์ ํ ID๊ฐ ์กด์ฌํ๋ฉฐ, ์์์ ์๋ฒ์ ์กด์ฌํ๋ค.
- ํด๋ผ์ด์ธํธ๋ URI๋ง์ผ๋ก ์์์ ์ง์ ํ๊ณ ํด๋น ์์์ ์ํ(์ ๋ณด)์ ๋ํ ์กฐ์์ ์๋ฒ์ ์์ฒญํ๋ค.
- ํ์ (Verb) : HTTP method
- GET, POST, PUT, DELETE
- ํํ (Representation)
- ํด๋ผ์ด์ธํธ๊ฐ ์์์ ์ํ(์ ๋ณด)์ ๋ํ ์กฐ์์ ์์ฒญํ๋ฉด ์๋ฒ๋ ์ด์ ์ ์ ํ ์๋ต์ ๋ณด๋ธ๋ค.
- REST์์ ํ๋์ ์์์ JSON, XML๋ฑ ์ฌ๋ฌ ํํ์ Representation (ํํ)์ผ๋ก ๋ํ๋ด์ด ์ง ์ ์๋ค.
๐โโ๏ธ REST๋ ์ ์ฝ์กฐ๊ฑด์ ๋ชจ๋ ์ง์ผ์ผ REST์ด๋ค.
- client - server
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ฐ ์ญํ ์ ํ์คํ ๊ตฌ๋ถํ์ฌ ์๋ก๊ฐ์ ์์กด์ฑ์ ์ค์ธ๋ค.
- ์๋ฒ : REST API ์ ๊ณต, ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๋ด๋น.
- ํด๋ผ์ด์ธํธ : ์ฌ์ฉ์ ์ธ์ฆ, ์ปจํ ์คํธ (์ธ์ , ๋ก๊ทธ์ธ ์ ๋ณด)๋ฑ์ ๊ด๋ฆฌ๋ผ๊ณ ์ฑ ์์ง๋ค.
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ฐ ์ญํ ์ ํ์คํ ๊ตฌ๋ถํ์ฌ ์๋ก๊ฐ์ ์์กด์ฑ์ ์ค์ธ๋ค.
- stateless (๋ฌด์ํ์ฑ)
- REST๋ ์์ ์ ์ํ ์ํ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์๋๋ค.
- ์ฆ, ์ธ์ ์ ๋ณด๋ ์ฟ ํค์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ API ์๋ฒ๋ ๋ค์ด์ค๋ ์์ฒญ๋ง์ ๋จ์ํ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
- ์๋น์ค์ ์์ ๋๊ฐ ๋์์ง๊ณ ์๋ฒ์์ ๋ถํ์ํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์ง ์์์ผ๋ก์จ ๊ตฌํ์ด ๋จ์ํด์ง๋ค.
- cache (์บ์)
- REST๋ HTTP ์น ํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ํ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ด ์ ์ฉ ๊ฐ๋ฅํ๋ค.
- uniform interface
- ์ ์ฝ ์กฐ๊ฑด
- identification of resources - ๋ฆฌ์์ค๊ฐ URL๋ก ์๋ณ๋๋ฉด ๋๋ค.
- manipulation of resources through representations - REST๋ฅผ ์ด์ฉํด์ ๋ฆฌ์์ค๋ฅผ ์กฐ์ํ ์ ์์ด์ผํ๋ค.
- self-descriptive messages - ๋ฉ์์ง๋ ์ค์ค๋ก๋ฅผ ์ค๋ช
๋์ผํด์ผํ๋ค.
- ๋ฉ์์ง๋ง ๋ณด๊ณ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋ ์์ฒด ํํ ๊ตฌ์กฐ๋ก ๋์ด ์์ด์ผํ๋ค.
- hypermedia as the engine of application state (HATEOAS) - ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ Hyperlink๋ฅผ ์ด์ฉํด ์ ์ด๋์ด์ผํ๋ค. (์ฌ์ดํธ์ ๋ฒํผ(ํ์ดํผ๋งํฌ)๋ฅผ ํตํด ์ ์ด๋ฅผ ํด์ผํ๋ค.)
- ์ uniform interface๋ฅผ ์ง์ผ์ผ ํ๋๊ฐ? - ๋
๋ฆฝ์ ์งํ๋๋ฌธ
- ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์งํํ๊ธฐ ์ํด
- ์๋ฒ์ ๊ธฐ๋ฅ์ด ๋ณ๊ฒฝ๋์ด๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋ค.
- REST๋ฅผ ๋ง๋ค๊ฒ ๋ ๊ณ๊ธฐ :
How do i improve HTTP without breaking the Web. - ์ํธ์ด์ฉ์ฑ - HTTP์์ ๊ธ์ ํ๋ ๋ฐ๊พธ๋ฉด ์ด์ ์ ๋์๋ ์น์์ ์ด๋ฅผ ์ธ์๋ชปํ ์๋ ์๊ธฐ ๋๋ฌธ.
- ์ ์ฝ ์กฐ๊ฑด
- layered system (๊ณ์ธตํ)
- REST ์๋ฒ๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ ๋ณด์, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ํธํ ๊ณ์ธต์ ์ถ๊ฐํด ๊ตฌ์กฐ์์ ์ ์ฐ์ฑ์ ๋ ์ ์๊ณ ํ๋ก์, ๊ฒ์ดํธ์จ์ด ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ค๊ฐ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
- code-on-demand (optional)
- ์๋ฒ์์ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด์ ์คํํ ์ ์์ด์ผ ํ๋ค. (JS)
ํ์ฌ REST API๋ก ๋ถ๋ฆฌ๋ ๋๋ถ๋ถ์ API๋ ๋ก์ด ํ๋ฉ์ด ์ ์ํ REST๋ฅผ ๋ฐ๋ฅด์ง ์๊ณ ์์ผ๋ฉฐ, ๊ทธ์ค์์๋ ํนํ Self-descriptive Message์ HATEOAS๊ฐ ์ง์ผ์ง์ง ์์์ ์ง์ ํ์๋ค. - ๊ทธ๋ฐ rest api๋ก ๊ด์ฐฎ์๊ฐ -
๐ค REST API
- REST ๊ธฐ๋ฐ์ ๊ท์น๋ค์ ์ง์ผ์ ์ค๊ณ๋ API
- REST๋ HTTP ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ฏ๋ก, HTTP๋ฅผ ์ง์ํ๋ ํ๋ก๊ทธ๋จ ์ธ์ด๋ก ํด๋ผ์ด์ธํธ, ์๋ฒ๋ฅผ ๊ตฌํํ ์ ์๋ค.
๐ค ๋ฆฌ์์ค์ ํํ ๋ฐฉ์
- document : ๊ฐ์ฒด ์ธ์คํด์ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ ์ฝ๋์ ์ ์ฌํ ๊ฐ๋ . ๋ฆฌ์์ค ์งํฉ(collection)์ ์ธ์คํด์ค
- collection : ๋จ์ผ ๋ฆฌ์์ค(document)๋ค์ ๋ฌถ์. ๋๋ ํ ๋ฆฌ
- store : ํด๋ผ์ด์ธํธ ์ ์ฅ์์์ ๋ฆฌ์์ค ์ ์ฅ์.
๐โโ๏ธ REST API ์ค๊ณ์ ์์ด ๋ฌด์๋ณด๋ค ์ค์ํ ๋ ๊ฐ์ง
-
URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค.
- ๋ฆฌ์์ค๋ ๋์ฌ๊ฐ ์๋ ๋ช ์ฌ๋ก ํํํ๋ค. ๋๋ฌธ์๋ณด๋ค๋ ์๋ฌธ์๋ฅผ ์ฌ์ฉ.
- ๋ฆฌ์์ค์ ๋ํ๋จผํธ ์ด๋ฆ์ผ๋ก๋ ๋จ์ ๋ช ์ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ฆฌ์์ค์ ์ปฌ๋ ์ ์ด๋ฆ์ผ๋ก๋ ๋ณต์ ๋ช ์ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ๋ฆฌ์์ค์ ์คํ ์ด ์ด๋ฆ์ผ๋ก๋ ๋ณต์ ๋ช ์ฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
-
์์์ ๋ํ ํ์๋ HTTP Method (GET, PUT, POST, DELETE)๋ก ํํํ๋ค.
- URI์ HTTP Method๊ฐ ๋ค์ด๊ฐ๋ฉด ์๋๋ค.
GET /users/delete/1->DELETE /users/1
- URI์ ํ์์ ๋ํ ๋์ฌ ํํ์ด ๋ค์ด๊ฐ๋ฉด ์๋๋ค.
GET /users/show/1->GET /users/1GET /users/insert/1->POST /users/1
- ๊ฒฝ๋ก ๋ถ๋ถ ์ค ๋ณํ๋ ๋ถ๋ถ์ ์ ์ผํ ๊ฐ์ผ๋ก ๋์ฒดํ๋ค.
- URI์ HTTP Method๊ฐ ๋ค์ด๊ฐ๋ฉด ์๋๋ค.
-
์ฌ๋์ ๊ตฌ๋ถ์(
/)๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋๋ค.http://restapi.example.com/houses/apartments
-
URL ๋ง์ง๋ง ๋ฌธ์๋ก ์ฌ๋์(
/)๋ฅผ ํฌํจํ์ง ์๋๋ค.- URI์ ํฌํจ๋๋ ๋ชจ๋ ๊ธ์๋ ๋ฆฌ์์ค์ ์ ์ผํ ์๋ณ์๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ URI๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋ฆฌ์์ค๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ด๊ณ , ์ญ์ค๋ก ๋ฆฌ์์ค๊ฐ ๋ค๋ฅด๋ฉด URI๋ ๋ฌ๋ผ์ ธ์ผ ํ๋ค.
- REST API๋ ๋ถ๋ช
ํ URI๋ฅผ ๋ง๋ค์ด ํต์ ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํผ๋์ ์ฃผ์ง ์๋๋ก URI ๊ฒฝ๋ก์ ๋ง์ง๋ง์๋ ์ฌ๋์(
/)๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.http://restapi.example.com/houses/apartments/(x)
-
ํ์ดํ (-)์ URI ๊ฐ๋ ์ฑ์ ๋์ด๋๋ฐ ์ฌ์ฉ
- ๋ถ๊ฐํผํ๊ธฐ ๊ธด URI ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ํ์ดํ์ ์ฌ์ฉํด ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
-
๋ฐ์ค (_)์ URI์ ์ฌ์ฉํ์ง ์๋๋ค.
- ๋ฐ์ค ๋์ ํ์ดํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
-
URL ๊ฒฝ๋ก์๋ ์๋ฌธ์๊ฐ ์ ํฉํ๋ค.
- ๋์๋ฌธ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฆฌ์์ค๋ก ์ธ์ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋๋ฌธ์์ ์ฌ์ฉ์ ํผํ๋ ๊ฒ์ด ์ข๋ค.
- RFC 3986(URI ๋ฌธ๋ฒ ํ์)์ URI ์คํค๋ง์ ํธ์คํธ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ๋๋ก ๊ท์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
-
ํ์ผ ํ์ฅ์๋ URI์ ํฌํจ์ํค์ง ์๋๋ค.
- REST API์์๋ ๋ฉ์์ง ๋ฐ๋ ๋ด์ฉ์ ํฌ๋งท์ ๋ํ๋ด๊ธฐ ์ํ ํ์ผ ํ์ฅ์๋ฅผ URI ์์ ํฌํจ์ํค์ง ์๋๋ค.
Accept-header๋ฅผ ์ฌ์ฉํ์.
-
๋ฆฌ์์ค ๊ฐ์๋ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ
- /๋ฆฌ์์ค๋ช /๋ฆฌ์์ค ID/๊ด๊ณ๊ฐ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ช
GET : /users/{userid}/devices (์ผ๋ฐ์ ์ผ๋ก ์์ โhasโ์ ๊ด๊ณ๋ฅผ ํํํ ๋)GET : /users/{userid}/likes/devices (๊ด๊ณ๋ช ์ด ์ ๋งคํ๊ฑฐ๋ ๊ตฌ์ฒด์ ํํ์ด ํ์ํ ๋)
- REST ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ ์์คํ ์ RESTful์ด๋ ์ฉ์ด๋ก ์ง์นญํ๋ค๊ณ ํ๋ค. (๊ณต์์ ์ธ๊ฒ ์๋๋ผ๊ณ ํ๋ค.)
- ์ฆ, REST API๋ฅผ ์ ๊ณตํ๋ ์น ์๋น์ค๋ฅผ RESTfulํ๋ค๊ณ ํ ์ ์๋ค.
- CRUD ๊ธฐ๋ฅ์ ๋ชจ๋ POST๋ก๋ง ์ฒ๋ฆฌํ๋ API
- route์ ๋ฆฌ์์ค, id ์ธ์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ
