REST๋ ์น์ ์ฐฝ์์(HTTP) ์ค์ ํ ์ฌ๋์ธ Roy Fielding์ 2000๋ ๋ ผ๋ฌธ์ ์ํด์ ์๊ฐ๋์๋ค. ํ์ฌ์ ์ํคํ ์ณ๊ฐ ์น์ ๋ณธ๋ ์ค๊ณ์ ์ฐ์์ฑ์ ๋ง์ด ์ฌ์ฉํ์ง ๋ชปํ๊ณ ์๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์, ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ํคํ ์ณ๋ฅผ ์๊ฐํ๋๋ฐ ๊ทธ๊ฒ์ด ๋ฐ๋ก Representational safe transfer (REST)์ด๋ค.
REST๋ ์์๋ก๋ ํฌ๊ฒ ๋ฆฌ์์ค, ๋ฉ์๋, ๋ฉ์ธ์ง 3๊ฐ์ง ์์๋ก ๊ตฌ์ฑ๋๋ค. ์๋ฅผ ๋ค์ด์ "์ด๋ฆ์ด Terry์ธ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ค." ๋ผ๋ ํธ์ถ์ด ์์ ๋, "์ฌ์ฉ์"๋ ์์ฑ๋๋ ๋ฆฌ์์ค, "์์ฑํ๋ค"๋ผ๋ ํ์๋ ๋ฉ์๋, ๊ทธ๋ฆฌ๊ณ "์ด๋ฆ์ด Terry์ธ ์์์๋"๋ ๋ฉ์์ง๊ฐ ๋๋ค. ์ด๋ฅผ REST ํํ๋ก ํํํด๋ณด๋ฉด, HTTP POST , http://myweb/users/
{
"user":{
"name":"terru"
}
}
์ ๊ฐ์ ํํ๋ก ํํ๋๋ฉฐ, ์์ฑํ๋ค์ ์๋ฏธ๋ฅผ ๊ฐ๋ ๋ฉ์๋๋ HTTP Post ๋ฉ์๋๊ฐ ๋๊ณ , ์์ฑํ๊ณ ์ ํ๋ ๋์์ด ๋๋ ์ฌ์ฉ์ ๋ผ๋ ๋ฆฌ์์ค๋ http://myweb/users ๋ผ๋ ํํ์ URI๋ก ํํ์ด ๋๋ฉฐ, ์์ฑํ๊ณ ์ ํ๋ ์ฌ์ฉ์์ ๋ํ ์ผํ ๋ด์ฉ์ JSON ๋ฌธ์๋ฅผ ์ด์ฉํด์ ํํ๋๋ค.
REST์์๋ ์์์ ์ ๊น ์ธ๊ธํ๋ฐ์ ๊ฐ์ด, ํ์์ ๋ํ ๋ฉ์๋๋ฅผ HTTP ๋ฉ์๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค. HTTP์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฉ์๋๊ฐ ์์ง๋ง REST์์๋ CRUD(Create Read Update Delete)์ ํด๋น ํ๋ 4๊ฐ์ง์ ๋ฉ์๋๋ง ์ฌ์ฉํ๋ค.
| ๋ฉ์๋ | ์๋ฏธ | Idempotent |
|---|---|---|
| POST | Create | No |
| GET | Select | Yes |
| PUT | Update | Yes |
| DELETE | Delete | Yes |
๊ฐ๊ฐ Post, Put, Get, Delete๋ ๊ฐ๊ฐ์ CRUD ๋ฉ์๋์ ๋์๋๋ค. ์ฌ๊ธฐ์ Idempotent๋ผ๋ ๋ถ๋ฅ๊ฐ ์ถ๊ฐ ํ๋๋ฐ, Idempotent๋ ์ฌ๋ฌ ๋ฒ ์ํ์ ํด๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. ์๋ฅผ๋ค์ด, a++ ๋ Idempotent ํ์ง ์๋ค๊ณ ํ์ง๋ง(ํธ์ถ์๋ง๋ค ๊ฐ์ด ์ฆ๊ฐ ๋๊ธฐ ๋๋ฌธ์), a=4์ ๊ฐ์ ๋ช ๋ น์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํด๋ Idempotentํ๋ค.(๊ฐ์ด ๊ฐ๊ธฐ ๋๋ฌธ์)
POST ์ฐ์ฐ์ ๊ฒฝ์ฐ์๋ ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํ๋ ์ฐ์ฐ์ด๊ธฐ ๋๋ฌธ์, Idempotentํ์ง ์์ง๋ง ๋๋จธ์ง GET, PUT, DELETE๋ ๋ฐ๋ณต ์ํํด๋ Idempotent ํ๋ค. GET ์ ๊ฒฝ์ฐ, ๊ฒ์๋ฌผ์ ์กฐํ์ ์นด์ดํธ๋ฅผ ๋๋ ค์ค๋ค๋๊ฐ ํ๋ ๊ธฐ๋ฅ์ ์ํํ์ ๋๋ Idempotentํ์ง ์์ ๋ฉ์๋๋ก ์ ์ํด์ผ ํ๋ค. Idempotent์ ๊ฐ๋ ์ ๋ํด์ ์ ์ค๋ช ์ ํ๋ ํ๋ฉด, REST๋ ๊ฐ ๊ฐ๋ณ API๋ฅผ ์ํ ์์ด ์ํํ๊ฒ ๋๋ค. ๊ทธ๋์, ํด๋น REST API๋ฅผ ๋ค๋ฅธ API์ ํจ๊ป ํธ์ถํ๋ค๊ฐ ์คํจํ์์ ๊ฒฝ์ฐ, ํธ๋ ์ ์ ๋ณต๊ตฌ๋ฅผ ์ํด์ ๋ค์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ, Idempotent ํ์ง ์์ ๋ฉ์๋๋ค์ ๊ฒฝ์ฐ๋ ๊ธฐ์กด ์ํ๋ฅผ ์ ์ฅํ๋ค๊ฐ ๋ค์ ์๋ณตํด์ค์ผ ํ๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, Idempotentํ ๋ฉ์๋์ ๊ฒฝ์ฐ์๋ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ ๋ฉ์๋๋ฅผ ์ํํด์ฃผ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด ๊ฒ์๋ฌผ ์กฐํ๋ฅผ ํ๋ API๊ฐ ์์๋, ์กฐํ์ ๋ง๋ค ์กฐํ์๋ฅผ ์ฌ๋ฆฌ๋ ์ฐ์ฐ์ ์ํํ๋ค๋ฉด ์ด ๋ฉ์๋๋ฅผ Idempotent ํ๋ค๊ณ ๋ณผ์ ์๊ณ , ์กฐํ๋ฅผ ํ๋ค๊ฐ ์คํจํ์์ ๋๋ ์ฌ๋ผ๊ฐ ์กฐํ์๋ฅผ ๋ค์ -1๋ก ๋นผ์ค์ผ ํ๋ค. ์ฆ, idempotenํ์ง ์์ ๋ฉ์๋์ ๋ํด์๋ ํธ๋ ์ ์ ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋ณ๋ค๋ฅธ ์ฃผ์๊ฐ ํ์ํ๋ค.
REST๋ ๋ฆฌ์์ค ์งํฅ ์ํคํ ์ณ ์คํ์ผ์ด๋ผ๋ ์ ์ ๋ต๊ฒ ๋ชจ๋ ๊ฒ์ ๋ฆฌ์์ค ์ฆ ๋ช ์ฌ๋ก ํํ์ ํ๋ฉฐ, ๊ฐ ์ธ๋ถ ๋ฆฌ์์ค์๋ id ๋ฅผ ๋ถ์ธ๋ค. ์ฆ, ์ฌ์ฉ์๋ผ๋ฅธ ๋ฆฌ์์ค ํ์ ์ http://myweb//user ๋ผ๊ณ ์ ์ํ๋ค๋ฉด, terry๋ผ๋ id๋ฅผ ๊ฐ๋ ๋ฆฌ์์ค๋ http://myweb/users/terry ๋ผ๋ ํํ๋ก ์ ์ํ๋ค. REST์ ๋ฆฌ์์ค๊ฐ ๋ช ์ฌ์ ํํ๋ฅผ ๋์ฐ๋ค ๋ณด๋, ๋ช ๋ น(Operation)์ฑ์ API๋ฅผ ์ ์ํ๋ ๊ฒ์์ ํผ๋์ด ์ฌ ์ ์๋ค. ์๋ฅผ ๋ค์ด์ "Push ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ธ๋ค"๋ ๋ณดํต ๊ธฐ์กด์ RPC(Remote Procedure Call)์ด๋ ํจ์์ฑ ์ ๊ทผํด์๋ /myweb/sendpush ํํ๋ก ์๋ชป ์ ์๊ฐ ๋ ์ ์์ง๋ง, ์ด๋ฌํ ๋์ฌํ์ ๋ช ์ฌํ์ผ๋ก ๋ฐ๊ฟ์ ์ ์ฉํด๋ณด๋ฉด ๋ฆฌ์์ค ํํ๊ฐ ํํํ๊ธฐ๊ฐ ์กฐ๊ธ ๋ ์์ํด์ง๋ค. "Push ๋ฉ์์ง ์์ฒญ์ ์์ฑํ๋ค."๋ผ๋ ํํ๋ก ์ ์๋ฅผ ๋ณ๊ฒฝํ๋ฉด, API ํฌ๋งท์ POST/myweb/push ํํ์ ๊ฐ์ด ๋ช ์ฌํ์ผ๋ก ์ ์๊ฐ ๋ ์ ์๋ค. ๋ฌผ๋ก ๋ชจ๋ ํํ์ ๋ช ๋ น์ด ์ด๋ฐ ํํ๋ก ์ ์๊ฐ ๊ฐ๋ฅํ ๊ฒ์ ์๋์ง๋ง, ๋๋๋ก์ด๋ฉด ๋ฆฌ์์ค ๊ธฐ๋ฐ์ ๋ช ์ฌ ํํ๋ก ์ ์๋ฅผ ํ๋๊ฒ RESTํํ์ ๋์์ธ์ด ๋๋ค.
REST API์ ๊ฐ๋จํ ์์ , ๊ทธ๋ฌ๋ฉด ๊ฐ๋จํ REST API์ ์์ ๋ฅผ ์ดํด๋ณด๋๋ก ํ์. ๊ฐ๋จํ ์ฌ์ฉ์ ์์ฑ API๋ฅผ ์ดํด๋ณด๋ฉด,
- ์ฌ์ฉ์ ์์ฑ ๋ค์์ http://myweb/users ๋ผ๋ ๋ฆฌ์์ค๋ฅผ ์ด๋ฆ์ terry, ์ฃผ์๋ seoul ์ด๋ผ๋ ๋ด์ฉ(๋ฉ์์ง)๋ก HTTP Post ๋ฅผ ์ด์ฉํด์ ์์ฑํ๋ ์ ์์ด๋ค.
HTTP Post, http://myweb/users/
{
"name":"terry",
"address":"seoul"
}
๋ค์์ ์์ฑ๋ ๋ฆฌ์์ค ์ค์์ http://myweb/users ๋ผ๋ ์ฌ์ฉ์ ๋ฆฌ์์ค์ค์, id๊ฐ terry ์ธ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์กฐํํด์ค๋ ๋ฐฉ์์ด๋ค. ์กฐํ์ด๊ธฐ ๋๋ฌธ์, HTTP Get์ ์ฌ์ฉํ๋ค. HTTP Get, http://myweb/users/terry ์ ๋ฐ์ดํธ ๋ค์์ http://myweb/users ๋ผ๋ ์ฌ์ฉ์ ๋ฆฌ์์ค์ค์, id๊ฐ terry ์ธ ์ฌ์ฉ์ ์ ๋ณด์ ๋ํด์, ์ฃผ์๋ฅผ โsuwonโ์ผ๋ก ์์ ํ๋ ๋ฐฉ์์ด๋ค. ์์ ์ HTTP ๋ฉ์๋ ์ค์ PUT์ ์ฌ์ฉํ๋ค.
HTTP PUT, http://myweb/users/terry
{
"name":"terry",
"address":"suwon"
}
๋ง์ง๋ง์ผ๋ก http://myweb/users ๋ผ๋ ์ฌ์ฉ์ ๋ฆฌ์์ค์ค์, id๊ฐ terry ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ญ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. HTTP DELETE, http://myweb/users/terry
API ์ ์๋ฅผ ๋ณด๋ฉด ์๊ฒ ์ง๋ง ์๋นํ ๊ฐ๋จํ๋ค. ๋จ์ํ๊ฒ ๋ฆฌ์์ฐ๋ฅผ URI๋ก ์ ํด์ค ํ์, ๊ฑฐ๊ธฐ์ HTTP ๋ฉ์๋๋ฅผ ์ด์ฉํด์ CRUD๋ฅผ ๊ตฌํํ๊ณ ๋ฉ์์ง๋ฅผ JSON์ผ๋ก ํํํ์ฌ HTTP Body์ ์ค์ด ๋ณด๋ด๋ฉด ๋๋ค. POST URI์ ๋ฆฌ์์ค id๊ฐ ์๋ค๋ ๊ฒ์ ๋นผ๋ฉด ํฌ๊ฒ ์ ๊ฒฝ์ธ ๋ถ๋ถ์ด ์๋ค.