REST๋ Representational State Transfer๋ผ๋ ์ฉ์ด์ ์ฝ์๋ก์ 2000๋ ๋์ ๋ก์ด ํ๋ฉ (Roy Fielding)์ ๋ฐ์ฌํ์ ๋ ผ๋ฌธ์์ ์ต์ด๋ก ์๊ฐ๋์์ต๋๋ค. ๋ก์ด ํ๋ฉ์ HTTP์ ์ฃผ์ ์ ์ ์ค ํ ์ฌ๋์ผ๋ก ๊ทธ ๋น์ ์น(HTTP) ์ค๊ณ์ ์ฐ์์ฑ์ ๋นํด ์ ๋๋ก ์ฌ์ฉ๋์ด์ง์ง ๋ชปํ๋ ๋ชจ์ต์ ์ํ๊น์ํ๋ฉฐ ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ ์ฒ๋ก์จ REST๋ฅผ ๋ฐํํ๋ค๊ณ ํฉ๋๋ค.
์ฝ๊ฒ ๋งํด REST API๋ ๋ค์์ ๊ตฌ์ฑ์ผ๋ก ์ด๋ฃจ์ด์ ธ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ฐ์์ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
1) Uniform (์ ๋ํผ ์ธํฐํ์ด์ค)
Uniform Interface๋ URI๋ก ์ง์ ํ ๋ฆฌ์์ค์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํํ๋ ์ํคํ
์ฒ ์คํ์ผ์ ๋งํฉ๋๋ค.
2) Stateless (๋ฌด์ํ์ฑ)
REST๋ ๋ฌด์ํ์ฑ ์ฑ๊ฒฉ์ ๊ฐ์ต๋๋ค. ๋ค์ ๋งํด ์์
์ ์ํ ์ํ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์์ต๋๋ค. ์ธ์
์ ๋ณด๋ ์ฟ ํค์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ API ์๋ฒ๋ ๋ค์ด์ค๋ ์์ฒญ๋ง์ ๋จ์ํ ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋๋ค. ๋๋ฌธ์ ์๋น์ค์ ์์ ๋๊ฐ ๋์์ง๊ณ ์๋ฒ์์ ๋ถํ์ํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์ง ์์์ผ๋ก์จ ๊ตฌํ์ด ๋จ์ํด์ง๋๋ค.
3) Cacheable (์บ์ ๊ฐ๋ฅ)
REST์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ HTTP๋ผ๋ ๊ธฐ์กด ์นํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ด ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค. HTTP ํ๋กํ ์ฝ ํ์ค์์ ์ฌ์ฉํ๋ Last-Modifiedํ๊ทธ๋ E-Tag๋ฅผ ์ด์ฉํ๋ฉด ์บ์ฑ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
4) Self-descriptiveness (์์ฒด ํํ ๊ตฌ์กฐ)
REST์ ๋ ๋ค๋ฅธ ํฐ ํน์ง ์ค ํ๋๋ REST API ๋ฉ์์ง๋ง ๋ณด๊ณ ๋ ์ด๋ฅผ ์ฝ๊ฒ ์ดํด ํ ์ ์๋ ์์ฒด ํํ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค๋ ๊ฒ์
๋๋ค.
5) Client - Server ๊ตฌ์กฐ
REST ์๋ฒ๋ API ์ ๊ณต, ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธ์ฆ์ด๋ ์ปจํ
์คํธ(์ธ์
, ๋ก๊ทธ์ธ ์ ๋ณด)๋ฑ์ ์ง์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๊ฐ๊ฐ์ ์ญํ ์ด ํ์คํ ๊ตฌ๋ถ๋๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ๊ฐ๋ฐํด์ผ ํ ๋ด์ฉ์ด ๋ช
ํํด์ง๊ณ ์๋ก๊ฐ ์์กด์ฑ์ด ์ค์ด๋ค๊ฒ ๋ฉ๋๋ค.
6) ๊ณ์ธตํ ๊ตฌ์กฐ
REST ์๋ฒ๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ ๋ณด์, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ํธํ ๊ณ์ธต์ ์ถ๊ฐํด ๊ตฌ์กฐ์์ ์ ์ฐ์ฑ์ ๋ ์ ์๊ณ PROXY, ๊ฒ์ดํธ์จ์ด ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ค๊ฐ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
REST API๋ฅผ ์์ฑํ ๋๋ ๋ช ๊ฐ์ง ์ง์ผ์ผ ํ ๊ท์น๋ค์ด ์์ต๋๋ค. ๋ก์ด ํ๋ฉ์ด ๋ ผ๋ฌธ์์ ์ ์ํ REST ๋ฐฉ๋ฒ๋ก ์ ๋ณด๋ค ๋ ์ค์ฉ์ ์ผ๋ก ์ ์ฉํ๊ธฐ ์ํด ๋ ์ค๋๋ฅด๋ ๋ฆฌ์ฐจ๋์จ(Leonard Richardson)์ REST API๋ฅผ ์ ์ ์ฉํ๊ธฐ ์ํ 4๋จ๊ณ ๋ชจ๋ธ์ ๋ง๋ค์์ต๋๋ค.
REST ์ฑ์๋ ๋ชจ๋ธ์ ์ด 4๋จ๊ณ(0~3๋จ๊ณ)๋ก ๋๋์ด์ง๋๋ค.
์์ ์ด์ผ๊ธฐํ ๋ก์ด ํ๋ฉ์ ์ด ๋ชจ๋ธ์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ถฉ์กฑํด์ผ REST API๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค๊ณ ์ฃผ์ฅํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์๋ฐํ๊ฒ 3๋จ๊ณ๊น์ง ์งํค๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ 2๋จ๊ณ๊น์ง๋ง ์ ์ฉํด๋ ์ข์ API ๋์์ธ์ด๋ผ๊ณ ๋ณผ ์ ์๊ณ , ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ HTTP API ๋ผ๊ณ ๋ ๋ถ๋ฆ ๋๋ค.
REST ์ฑ์๋ ๋ชจ๋ธ - 0๋จ๊ณ
REST ์ฑ์๋ ๋ชจ๋ธ์ ๋ฐ๋ฅด๋ฉด, 0๋จ๊ณ์์๋ ๋จ์ํ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ธฐ๋ง ํด๋ ๋ฉ๋๋ค. ๋ฌผ๋ก ์ด ๊ฒฝ์ฐ, ํด๋น API๋ฅผ REST API๋ผ๊ณ ํ ์๋ ์์ผ๋ฉฐ, 0๋จ๊ณ๋ REST API๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๋จ๊ณ์
๋๋ค.
ํ์ค์ด๋ผ๋ ์ด๋ฆ์ ์ฃผ์น์์ ์์ฝ ๊ฐ๋ฅํ ์๊ฐ์ ํ์ธํ๊ณ , ์ด๋ค ํน์ ์๊ฐ์ ์์ฝํ๋ ์ํฉ์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
**๊ฒฐ๋ก , REST API ์ค๊ณ ์ ๊ฐ์ฅ ์ค์ํ ํญ๋ชฉ์ ๋ค์์ 2๊ฐ์ง๋ก ์์ฝํ ์ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ, URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค.
๋ ๋ฒ์งธ, ์์์ ๋ํ ํ์๋ HTTP Method(GET, POST, PUT, DELETE)๋ก ํํํ๋ค.
1) URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค. (๋ฆฌ์์ค๋ช ์ ๋์ฌ๋ณด๋ค๋ ๋ช ์ฌ๋ฅผ ์ฌ์ฉ)
>GET /members/delete/1
์์ ๊ฐ์ ๋ฐฉ์์ REST๋ฅผ ์ ๋๋ก ์ ์ฉํ์ง ์์ URI์ ๋๋ค. URI๋ ์์์ ํํํ๋๋ฐ ์ค์ ์ ๋์ด์ผ ํฉ๋๋ค. delete์ ๊ฐ์ ํ์์ ๋ํ ํํ์ด ๋ค์ด๊ฐ์๋ ์๋ฉ๋๋ค.
2) ์์์ ๋ํ ํ์๋ HTTP Method(GET, POST, PUT, DELETE ๋ฑ)๋ก ํํ
์์ ์๋ชป ๋ URI๋ฅผ HTTP Method๋ฅผ ํตํด ์์ ํด ๋ณด๋ฉด
DELETE /members/1
์ผ๋ก ์์ ํ ์ ์๊ฒ ์ต๋๋ค.
ํ์์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ GET, ํ์ ์ถ๊ฐ ์์ ํ์๋ฅผ ํํํ๊ณ ์ ํ ๋๋ POST METHOD๋ฅผ ์ฌ์ฉํ์ฌ ํํํฉ๋๋ค.
ํ์์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ URI
GET /members/show/1 (x)
GET /members/1 (o)
ํ์์ ์ถ๊ฐํ ๋
>GET /members/insert/2 (x) - GET ๋ฉ์๋๋ ๋ฆฌ์์ค ์์ฑ์ ๋ง์ง ์์ต๋๋ค.
POST /members/2 (o)
[์ฐธ๊ณ ]HTTP METHOD์ ์๋ง์ ์ญํ
POST, GET, PUT, DELETE ์ด 4๊ฐ์ง์ Method๋ฅผ ๊ฐ์ง๊ณ CRUD๋ฅผ ํ ์ ์์ต๋๋ค.
1) ์ฌ๋์ ๊ตฌ๋ถ์(/)๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ
http://restapi.example.com/houses/apartments
http://restapi.example.com/animals/mammals/whales
2) URI ๋ง์ง๋ง ๋ฌธ์๋ก ์ฌ๋์(/)๋ฅผ ํฌํจํ์ง ์๋๋ค.
URI์ ํฌํจ๋๋ ๋ชจ๋ ๊ธ์๋ ๋ฆฌ์์ค์ ์ ์ผํ ์๋ณ์๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ URI๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋ฆฌ์์ค๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ด๊ณ , ์ญ์ผ๋ก ๋ฆฌ์์ค๊ฐ ๋ค๋ฅด๋ฉด URI๋ ๋ฌ๋ผ์ ธ์ผ ํฉ๋๋ค. REST API๋ ๋ถ๋ช
ํ URI๋ฅผ ๋ง๋ค์ด ํต์ ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํผ๋์ ์ฃผ์ง ์๋๋ก URI ๊ฒฝ๋ก์ ๋ง์ง๋ง์๋ ์ฌ๋์(/)๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
http://restapi.example.com/houses/apartments/ (X)
http://restapi.example.com/houses/apartments (0)
3) ํ์ดํ(-)์ URI ๊ฐ๋
์ฑ์ ๋์ด๋๋ฐ ์ฌ์ฉ
URI๋ฅผ ์ฝ๊ฒ ์ฝ๊ณ ํด์ํ๊ธฐ ์ํด, ๋ถ๊ฐํผํ๊ฒ ๊ธด URI๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ํ์ดํ์ ์ฌ์ฉํด ๊ฐ๋
์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
4) ๋ฐ์ค(_)์ URI์ ์ฌ์ฉํ์ง ์๋๋ค.
๊ธ๊ผด์ ๋ฐ๋ผ ๋ค๋ฅด๊ธด ํ์ง๋ง ๋ฐ์ค์ ๋ณด๊ธฐ ์ด๋ ต๊ฑฐ๋ ๋ฐ์ค ๋๋ฌธ์ ๋ฌธ์๊ฐ ๊ฐ๋ ค์ง๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ๋ฐ์ค ๋์ ํ์ดํ(-)์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.(๊ฐ๋
์ฑ)
5) URI ๊ฒฝ๋ก์๋ ์๋ฌธ์๊ฐ ์ ํฉํ๋ค.
URI ๊ฒฝ๋ก์ ๋๋ฌธ์ ์ฌ์ฉ์ ํผํ๋๋ก ํด์ผ ํฉ๋๋ค. ๋์๋ฌธ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฆฌ์์ค๋ก ์ธ์ํ๊ฒ ๋๊ธฐ ๋๋ฌธ์
๋๋ค. RFC 3986(URI ๋ฌธ๋ฒ ํ์)์ URI ์คํค๋ง์ ํธ์คํธ๋ฅผ ์ ์ธํ๊ณ ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ณํ๋๋ก ๊ท์ ํ๊ธฐ ๋๋ฌธ์ด์ง์.
RFC 3986 is the URI (Unified Resource Identifier) Syntax document
6) ํ์ผ ํ์ฅ์๋ URI์ ํฌํจ์ํค์ง ์๋๋ค.
http://restapi.example.com/members/soccer/345/photo.jpg (X)
REST API์์๋ ๋ฉ์์ง ๋ฐ๋ ๋ด์ฉ์ ํฌ๋งท์ ๋ํ๋ด๊ธฐ ์ํ ํ์ผ ํ์ฅ์๋ฅผ URI ์์ ํฌํจ์ํค์ง ์์ต๋๋ค. Accept header๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ์๋ค.
GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg
REST ๋ฆฌ์์ค ๊ฐ์๋ ์ฐ๊ด ๊ด๊ณ๊ฐ ์์ ์ ์๊ณ , ์ด๋ฐ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
/๋ฆฌ์์ค๋ช
/๋ฆฌ์์ค ID/๊ด๊ณ๊ฐ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ช
ex) GET : /users/{userid}/devices (์ผ๋ฐ์ ์ผ๋ก ์์ โhasโ์ ๊ด๊ณ๋ฅผ ํํํ ๋)
๋ง์ฝ์ ๊ด๊ณ๋ช ์ด ๋ณต์กํ๋ค๋ฉด ์ด๋ฅผ ์๋ธ ๋ฆฌ์์ค์ ๋ช ์์ ์ผ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ โ์ข์ํ๋โ ๋๋ฐ์ด์ค ๋ชฉ๋ก์ ํํํด์ผ ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
GET : /users/{userid}/likes/devices (๊ด๊ณ๋ช
์ด ์ ๋งคํ๊ฑฐ๋ ๊ตฌ์ฒด์ ํํ์ด ํ์ํ ๋)
4-4. ์์์ ํํํ๋ Colllection๊ณผ Document
Collection๊ณผ Document์ ๋ํด ์๋ฉด URI ์ค๊ณ๊ฐ ํ ์ธต ๋ ์ฌ์์ง๋๋ค. DOCUMENT๋ ๋จ์ํ ๋ฌธ์๋ก ์ดํดํด๋ ๋๊ณ , ํ ๊ฐ์ฒด๋ผ๊ณ ์ดํดํ์
๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ปฌ๋ ์
์ ๋ฌธ์๋ค์ ์งํฉ, ๊ฐ์ฒด๋ค์ ์งํฉ์ด๋ผ๊ณ ์๊ฐํ์๋ฉด ์ดํดํ์๋๋ฐ ์ข๋ ํธํ์ค ๊ฒ ๊ฐ์ต๋๋ค. ์ปฌ๋ ์
๊ณผ ๋ํ๋จผํธ๋ ๋ชจ๋ ๋ฆฌ์์ค๋ผ๊ณ ํํํ ์ ์์ผ๋ฉฐ URI์ ํํ๋ฉ๋๋ค. ์๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
http:// restapi.example.com/sports/soccer
์ URI๋ฅผ ๋ณด์๋ฉด sports๋ผ๋ ์ปฌ๋ ์ ๊ณผ soccer๋ผ๋ ๋ํ๋จผํธ๋ก ํํ๋๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์ข ๋ ์๋ฅผ ๋ค์ด๋ณด์๋ฉด
http:// restapi.example.com/sports/soccer/players/13
sports, players ์ปฌ๋ ์ ๊ณผ soccer, 13(13๋ฒ์ธ ์ ์)๋ฅผ ์๋ฏธํ๋ ๋ํ๋จผํธ๋ก URI๊ฐ ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์ปฌ๋ ์ ์ ๋ณต์๋ก ์ฌ์ฉํ๊ณ ์๋ค๋ ์ ์ ๋๋ค. ์ข ๋ ์ง๊ด์ ์ธ REST API๋ฅผ ์ํด์๋ ์ปฌ๋ ์ ๊ณผ ๋ํ๋จผํธ๋ฅผ ์ฌ์ฉํ ๋ ๋จ์ ๋ณต์๋ ์ง์ผ์ค๋ค๋ฉด ์ข ๋ ์ดํดํ๊ธฐ ์ฌ์ด URI๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค.