์ข ์ข , ์ฐ๋ฆฌ๋ REST ๋ฐ HATEOAS์ ๋ํ ์จ๋ผ์ธ ํ ๋ก ์์ ์ฐธ์ ์ ์์ ์ ๋๋ก ๊ณ ์ง์ํ๊ฒ ํ๋ํ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๋ง์ ํ๊ณค ํฉ๋๋ค:
JSON์ ํ์ดํผ๋ฏธ๋์ด๊ฐ ์๋๋๋ค. ์๋ํ๋ฉด ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด JSON์ ๋ณด์ธ์:
{
"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 50.00
},
"status": "open"
}
}
๋ณด์ จ์ฃ ? ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ด ์์ต๋๋ค.
๊ทธ๋์ ์ด JSON์ ํ์ดํผ๋ฏธ๋์ด๊ฐ ์๋๋ฉฐ, ๋ฐ๋ผ์ ์ด JSON์ ๋ฐํํ๋ API๋ RESTfulํ์ง ์์ต๋๋ค.
์ด์ ๋ํด, ๊ฐ๋์ ๋๋ํ๊ณ ๊ฒฝํ์ด ๋ง์ ์น ๊ฐ๋ฐ์๊ฐ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์์ ๋ณด์ด๊ธฐ๋ ํฉ๋๋ค:
์ข์์, REST ์ ๋ฌธ๊ฐ๋, ๊ทธ๋ผ ์ด JSON์ ์ด๋ค๊ฐ์?
{
"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 50.00
},
"status": "open",
"links": {
"deposits": "/accounts/12345/deposits",
"withdrawals": "/accounts/12345/withdrawals",
"transfers": "/accounts/12345/transfers",
"close-requests": "/accounts/12345/close-requests"
}
}
}
๋ณด์ธ์, ์ด์ ์ด ์๋ต์ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ด ์์ต๋๋ค(์ผ๋ฐ ์ฌ๋๋ค์ ์ด๊ฒ์ ๋งํฌ๋ผ๊ณ ๋ถ๋ฅด์ฃ ). ๊ทธ๋์ ์ด JSON์ ํ์ดํผ๋ฏธ๋์ด์ ๋๋ค.
์ด์ ์ด JSON API๋ RESTful์ ๋๋ค. ๊ธฐ๋ถ์ด ์ข ๋์์ก๋์?
๐
์ฐ๋ฆฌ๋ ์จ๋ผ์ธ ๋ ผ์ ์๋๋ฐฉ์ด ์ด๋ ์ ๋ ์์ ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์ธ์ ํด์ผ ํฉ๋๋ค. ์ด JSON ์๋ต์ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ด ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ค์ ๋ก JSON ์๋ต์ ์์ต๋๋ค. ๊ทธ๋์ ์ด JSON ์๋ต์ RESTful์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์์๊น์?
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ๊ณ ์ง์ค๋ฝ๊ธฐ ๋๋ฌธ์ ์ฆ๊ฐ์ ์ธ ์๋ณด๋ฅผ ํ๊ธฐ ์ ์ ๋ช ๊ฐ์ง โ์ฌ์ค์ ๋ง์ด์ฃ โ ํ๊ณ๋ฅผ ๋๊ณ ์ถ์ต๋๋ค:
๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ฒ์ ์ธํฐ๋ท์์ REST์ ๋ํ ๊ธฐ์ ์ ์ธ ๋ ผ์์ ํน๋ณํ ์ฆ๊ฒ๊ฒ ๋ง๋๋ ๊ณ ์ง์ํ ๊ผฌ์น๊ผฌ์น ์บ๊ธฐ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ ๊น์ โ์ฌ์ค์ ๋ง์ด์ฃ โ ์์๊ฐ ์์ผ๋ฉฐ, ๊ทธ๊ฒ์ JSON API ์์ฒด๊ฐ ์๋๋ผ, ์์ด์ด์ ๋ฐ๋ํธ, ์ฆ JSON์ ๋ฐ๋ ํด๋ผ์ด์ธํธ์ ๊ด๋ จ๋ ๊ฒ์ ๋๋ค.
์ด ์ ์๋ ๋นRESTful JSON API ์์ ์ ๋ ๊น์ ๋ฌธ์ ๋ ์ด JSON ์๋ต์ด ์ ๋๋ก ๋ ํ์ดํผ๋ฏธ๋์ด ์์คํ ์ ์ฐธ์ฌํ๊ธฐ ์ํด์๋, ์ด JSON์ ์๋นํ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ํ RESTful ์ํคํ ์ฒ ์คํ์ผ์ด ์์คํ ์ ์ฒด์ ๋ถ์ฌํ๋ ์ ์ฝ์ ์ถฉ์กฑํด์ผ ํ๋ค๋ ์ ์ ๋๋ค.
ํนํ, ํด๋ผ์ด์ธํธ๋ REST์ ์ ๋ํผ ์ธํฐํ์ด์ค๋ฅผ ์ถฉ์กฑํด์ผ ํ๋ฉฐ, ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ์ฃผ์ด์ง ํ์ดํผ๋ฏธ๋์ด๋ฅผ ์ฌ์ฉ์์๊ฒ ํ์ํ๋ ๊ฒ ์ธ์ ์๋ต์ โํํโ๋ ์ธ๋ถ ์ฌํญ์ ๋ํด ์๋ฌด๊ฒ๋ ์์ง ๋ชปํด์ผ ํฉ๋๋ค. ์ ๋๋ก ์๋ํ๋ RESTful ์์คํ ์์๋ ํด๋ผ์ด์ธํธ๊ฐ ํน์ ํ์ดํผ๋ฏธ๋์ด ํํ์ด ๋ํ๋ด๋ ๋๋ฉ์ธ์ ๋ํด โout of bandโ ์ง์์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ ์๋ JSON-as-hypermedia๋ฅผ ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
{
"account": {
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 50.00
},
"status": "open",
"links": {
"deposits": "/accounts/12345/deposits",
"withdrawals": "/accounts/12345/withdrawals",
"transfers": "/accounts/12345/transfers",
"close-requests": "/accounts/12345/close-requests"
}
}
}
์ด์ , ์ด API์ ํด๋ผ์ด์ธํธ๋ ์ด JSON์ ์๋ฅผ ๋ค์ด, HTML๋ก ๋ณํํ๊ธฐ ์ํด ์ผ๋ฐ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ธก ํ ํ๋ฆฟ ์ธ์ด๋ฅผ ํตํด JSON ๊ฐ์ฒด์ ๋ชจ๋ ์์ฑ์ ๋ฐ๋ณตํ๋ฉด์ ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค: ์ด JSON ์๋ต์๋ ํํ ์ ๋ณด๊ฐ ๋ง์ง ์์ต๋๋ค. ์ด๊ฒ์ ๊ด๋ จ๋ ๊ณ์ ์ ๋ํ ์๋นํ ์์์ ์ธ ๋ฐ์ดํฐ ํํ์ด๋ฉฐ, ๋ช ๊ฐ์ง ์ถ๊ฐ URL์ด ์์ ๋ฟ์ ๋๋ค.
REST์ ์ ๋ํผ ์ธํฐํ์ด์ค ์ ์ฝ์ ๋ง์กฑ์ํค๋ ค๋ ํด๋ผ์ด์ธํธ๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๋ ์ด ๊ณ์ ์ ์ต์ข ์ฌ์ฉ์์๊ฒ ํ์ํ๊ธฐ ์ํด ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํด์ผ ํ ๊ฒ์ ๋๋ค.
๊ฒฐ๊ตญ, ๊ทธ๊ฒ์ ์ด๋ฆ/๊ฐ ์๊ณผ ๋์์ ์ํ ์ผ๋ จ์ ์ผ๋ฐ์ ์ธ ๋ฒํผ ๋๋ ๋งํฌ ์ธํธ๋ก ํํ๋ ๊ฒ์ ๋๋ค, ๊ทธ๋ ์ง ์๋์?
JSON ์๋ต์ ํ์์ ๋ํด ๋ฌด๊ด์ฌํ๊ฒ ๋จ์ ์์ผ๋ ค๋ฉด ๋ ์ด์ ํ ์ ์๋ ์ผ์ด ๊ฑฐ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฐ๋ฆฌ์ JSON API๋ฅผ ๋ ์ ๊ตํ๊ฒ ๋ง๋ค์ด ์ ๋ณด์ ๋ ์ด์์์ ์ด๋ป๊ฒ ํด์ผ ํ ์ง์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจ์์ผ์ผ ํฉ๋๋ค: ์๋ฅผ ๋ค์ด, ์ผ๋ถ ํ๋๋ฅผ ๊ฐ์กฐํ๊ฑฐ๋ ์จ๊ฒจ์ผ ํ๋ค๋ ์ง์์ฌํญ ๋ฑ์ด ํ์ํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ด์ผ๊ธฐ์ ์ผ๋ถ๋ถ์ ๋ถ๊ณผํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ธก์์ ์ด๋ฌํ ์๋ก์ด JSON API ์์๋ฅผ ์ ์ ํ๊ฒ ํด์ํ๋๋ก ์ ๋ฐ์ดํธํด์ผ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ ์ด์ ๋จ์ํ API ์ค๊ณ์๊ฐ ์๋๋ฉฐ, ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ ์์ฑ ์ฌ์ ์๋ ์ฐธ์ฌํ๊ฒ ๋ฉ๋๋ค. ๋๋ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฒ์, ์ฐ๋ฆฌ์ API ํด๋ผ์ด์ธํธ๊ฐ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ ๋น์ฆ๋์ค์๋ ์ฐธ์ฌํ๋๋ก ์๊ตฌํ๋ ๊ฒ์ ๋๋ค.
Mike Amundsen์ ํ๋ฅญํ ์ฑ ์ ํตํด ์ฌ๋ฐ๋ฅธ, ์ผ๋ฐ์ ์ธ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ฑ ์์ ๋ณผ ์ ์๋ฏ์ด, ์ข์ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ฐ๋จํ์ง ์์ผ๋ฉฐ, ๋ํ ๋๋ถ๋ถ์ ์์ง๋์ด๊ฐ JSON API๋ฅผ ์๋นํ๊ธฐ ์ํด ๊ตฌ์ถํ ๊ฒ์ด ์๋๋๋ค, ์ฌ์ง์ด JSON API์ ์ ์ ๋ ์ ๊ตํ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค๊ณผ ํํ ์ ๋ณด๊ฐ ํฌํจ๋๋๋ผ๋ ๋ง์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ JSON ์๋ต์ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ๊ธฐ ์์ํ๋ฉด, Roy Fielding์ ๋ ผ๋ฌธ์์ ๋์จ ํ ๊ตฌ์ ์ด ๋ ์ค๋ฆ ๋๋ค:
๊ทธ๋ฌ๋, ์ ๋ํผ ์ธํฐํ์ด์ค๋ ํ์คํ๋ ํ์์ผ๋ก ์ ๋ณด๋ฅผ ์ ์กํ๊ธฐ ๋๋ฌธ์, ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๋ง์ถ ํ์๋ณด๋ค ํจ์จ์ฑ์ด ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
-Roy Fielding, https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_5
HTML์ ๋ํ ๋นํ ์ค ํ๋๋ ๊ทธ๊ฒ์ด โํํโ ์ ๋ณด์ โ์๋ฏธ๋ก ์ โ ์ ๋ณด๋ฅผ ํผํฉํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ข ์ข ์ ํ์ ์ธ JSON API ์๋ต์ ๊ฐ๊ฒฐํจ๊ณผ ๋ถ๋ฆฌํ๊ฒ ๋น๊ต๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ค์ํ ์ ์, HTML์ด ์น์ด๋ผ๋ ๋ ํฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ ์ ๊ตฌ์ฑ ์์๋ก ์๋ํ๋ ์ด์ ๋ ๋ฐ๋ก ๊ทธ ํํ ์ ๋ณด์ ์น ๋ธ๋ผ์ฐ์ (์ฆ, ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ)๊ฐ ๊ทธ๊ฒ์ ์ธ๊ฐ์ด ์ํธ์์ฉํ ์ ์๋ UI๋ก ๋ณํํ๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ์ ๋๋ก ๋ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ฐ๋ฆฌ์ JSON API์ ์ถ๊ฐํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์, JSON API ์๋ต์์ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ ์ ๊ณตํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ REST ์ด์ผ๊ธฐ์ ์ผ๋ถ์ผ ๋ฟ, ์ ์ฒด ์ด์ผ๊ธฐ๋ ์๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์ด๊ฒ์ด ์ ๋ง๋ก ์ด๋ ค์ด ๋ถ๋ถ์ด ์๋๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์ฌ์ค, ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ด๋ ค์ด ๋ถ๋ถ์ด๋ฉฐ, ์ข์ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ ๋ง ์ด๋ ค์ด ๋ถ๋ถ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ ํญ์ ์กด์ฌํ๋ค๊ณ ์๊ฐํ์ง๋ง, ์ผ์์ ์ธ ์น ์์ฒญ์์ HTML์ ๋จ์ํ ํ์ฑํ๊ณ ๋ ๋๋งํ๋ ๋ฐ ์ผ๋ง๋ ๋ง์ ๊ธฐ์ ์ด ๋ค์ด๊ฐ๋์ง ์ ์ ์๊ฐํด ๋ณด์ธ์. ๊ทธ๊ฒ์ ๊ทน๋๋ก ๋ณต์กํฉ๋๋ค.
๊ทธ๋์, ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์น ๊ธฐ๋ฐ ํ์ดํผ๋ฏธ๋์ด-๊ตฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, ํ์ค ์น ๊ธฐ๋ฐ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ์ธ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ง๋ ์ข์ ์๊ฐ์ผ ๊ฒ์ ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ ๋งค์ฐ ๊ฐ๋ ฅํ๊ณ , ์ ํ ์คํธ๋ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๊ฐ์ ๋์๋ง ๋ฐ์ผ๋ฉด, ๋ ๋์ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๊ฐ ๋ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก, ๋ชจ๋ REST ์ ์ฝ์ ์ถฉ์กฑํ๋ ์ข์ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ด๋ ต์ต๋๋ค. ๋ฐ๋ผ์ ์๋ก์ด ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ๋ณด๋ค๋ ๊ธฐ์กด ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ๊ณ ํ์ฅํ๋ ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ ๊ธด ํ์ง๋ง, ์๋ก์ด ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ์ ์ ํ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Hyperview์ ๊ฐ์ ๊ธฐ์ ์ด ๋งค์ฐ ์ธ์์ ์ด๊ณ ํน๋ณํ ์ด์ ์ ๋๋ค. Hyperview๋ ๋ชจ๋ฐ์ผ ์นํ์ ์ธ ์๋ก์ด ํ์ดํผ๋ฏธ๋์ด, HXML์ ๋ํ ๋ช ์ธ๋ฅผ ์ ๊ณตํ ๋ฟ๋ง ์๋๋ผ, HXML์ ์ดํดํ๊ณ ๋ ๋๋งํ ์ ์๋ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํฉ๋๋ค.
ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๊ฐ ์์๋ค๋ฉด, Hyperview๋ ์์์ ์ธ๊ธํ JSON๊ณผ ๊ฐ์ ๋ ๋ค๋ฅธ ์ด๋ก ์์ ํ์ดํผ๋ฏธ๋์ด์ ๋ถ๊ณผํ ๊ฒ์ด๋ฉฐ, ๊ฐ๋ ฅํ๊ณ ์ค์ฉ์ ์ธ ์์ ํ RESTful ํ์ดํผ๋ฏธ๋์ด ์๋ฃจ์ ์ ์๋ ๊ฒ์ ๋๋ค.
ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๊ฐ ์๋ ํ์ดํผ๋ฏธ๋์ด๋ ์์ ๊ฑฐ๊ฐ ์๋ ๋ฌผ๊ณ ๊ธฐ์ ๊ฐ์ผ๋ฉฐ, ์์ ๊ฑฐ๋ฅผ ํ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ์ผ ๋ฟ์ ๋๋ค.
RESTful ํ์ดํผ๋ฏธ๋์ด ์์คํ ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ผ๋ง๋ ์ค์ํ์ง ๊นจ๋ซ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. ์ด๋ ๋น์ฐํ ์ผ์ ๋๋ค. ์๋ํ๋ฉด ์ด๊ธฐ REST์ ๋ํ ๋ ผ์๋ ๋๋ถ๋ถ API ์ค๊ณ์ ๊ดํ ๊ฒ์ด์๊ณ , ๋ผ์ด์ธํธ๋ ๋ง์ด ์ธ๊ธ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด์ ๋ ๋ง์ ์ด๋ฌํ ๋ ผ์๊ฐ ๋ง๋ณด๋ค ์์ ๋๊ฐ๋ค๋ ๊ฒ์ ๊นจ๋ซ์ต๋๋ค: RESTful ํ์ดํผ๋ฏธ๋์ด API๊ฐ ์ ์ฉํ๋ ค๋ฉด, ์ ๋๋ก ๋ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ์ ์ํด ์๋น๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ๊ฒฐ๊ตญ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ ํน์ ๋๋ฉ์ธ์ ๋๊บผ์ด ํด๋ผ์ด์ธํธ์์ ๋ญ๋น๋ ๋ฟ์ ๋๋ค.
๊ฒ๋ค๊ฐ, ํ์ดํผ๋ฏธ๋์ด API๊ฐ ์ ๋ง๋ก ์๋ํ๊ฒ ํ๋ ค๋ฉด ํ๋ ์ ํ ์ด์ ๋ ์ด์ด ์ ๋ณด๋ฅผ ๋ง์ด ํฌํจํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค. โLevel 3โ์ Richardson ์ฑ์๋ ๋ชจ๋ธ, ์ฆ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค๋ง์ผ๋ก๋ โREST์ ์๊ดโ์ ๋ฌ์ฑํ๊ธฐ์ ์ถฉ๋ถํ์ง ์๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค.
์ค์ ๋ก, ํ์ดํผ๋ฏธ๋์ด API๋ฅผ ์ค์ ๋ก ์๋์ํค๋ ค๋ฉด ์ค์ฉ์ ์ธ ํ๋ ์ ํ ์ด์ ๋ ๋ฒจ ๊ธฐ์ ์ ๋ง์ด ์ถ๊ฐํด์ผ ํ๋ฉฐ, ๊ทธ๊ฒ์ ์๋นํ ์ ๋๋ก ๋ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ ํ์ํฉ๋๋ค.
์ ๊ฐ HATEOAS๋ ์ธ๊ฐ์ ์ํ ๊ฒ์ด๋ค๋ฅผ ์์ฑํ ๋๋ ์ด๋ฌํ ๊ฐ๋ ์ด ํ๋ํ๊ณ ์์์ง๋ง, ๊ทธ ๋น์์๋ ํด๋ผ์ด์ธํธ/์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ผ๋ง๋ ํน๋ณํ์ง ๊นจ๋ซ์ง ๋ชปํ์ต๋๋ค.
REST๋ ๋จ์ํ API์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. Roy Fielding์ด ๊ทธ์ ๋ ผ๋ฌธ์์ ๋ถ๋ช ํ ๋ฐํ ๊ฒ์ฒ๋ผ, ๊ทธ๊ฒ์ ์์คํ ์ํคํ ์ฒ์ ๋๋ค.
Mike์ ๊ฐ์ ๋ช๋ช ์ฌ๋๋ค์ ์ ์ธํ๊ณ ๋, ์ฐ๋ฆฌ๋ REST ์ด์ผ๊ธฐ์ ๋ํ ๋ ํฐ ๋ถ๋ถ(์ฌ์ค์ ํจ์ฌ ๋ ํฐ ๋ถ๋ถ)์ ๋ฌด์ํด ์์ต๋๋ค.