HTTP ๊ธฐ๋ฐ์ ๋ชจ๋ ์ธํฐํ์ด์ค๋ฅผ REST API๋ผ๊ณ ๋ถ๋ฅด๋ ์ฌ๋๋ค์ด ๋๋ฌด ๋ง์์ ธ์ ์ข์ ๊ฐ์ ๋๋๋๋ค. ์ค๋์ ์์๋ SocialSite REST API์ ๋๋ค. ๊ทธ๊ฒ์ RPC์ ๋๋ค. ์์ ํ RPC๋ก ๋ณด์ ๋๋ค. ๋๋ฌด ๋ง์ ๊ฒฐํฉ์ด ๋๋ฌ๋ ์์ด์ X ๋ฑ๊ธ์ ๋ฐ์์ผ ํ ์ ๋์ ๋๋ค.
REST ์ํคํ ์ฒ ์คํ์ผ์์ ํ์ดํผํ ์คํธ๊ฐ ์ ์ฝ์ด๋ผ๋ ๊ฐ๋ ์ ๋ช ํํ ํ๋ ค๋ฉด ๋ฌด์์ ํด์ผ ํ ๊น์? ๋ค์ ๋งํด, ์ ํ๋ฆฌ์ผ์ด์ ์ํ(๋ฐ๋ผ์ API)์ ์์ง์ด ํ์ดํผํ ์คํธ์ ์ํด ๊ตฌ๋๋์ง ์๋๋ค๋ฉด RESTfulํ ์ ์์ผ๋ฉฐ, REST API๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋์ ๋๋ค. ์ด๋๊ฐ ์๋ชป๋ ๋งค๋ด์ผ์ด ์๋ ๊ฑด๊ฐ์?
โRoy Fielding, REST ์ฉ์ด ์ฐฝ์์
REST๋ ์ปดํจํฐ ํ๋ก๊ทธ๋๋ฐ ์ญ์ฌ์ ๊ฐ์ฅ ์๋ชป ์ฌ์ฉ๋ ๊ธฐ์ ์ฉ์ด์ผ ๊ฒ์ ๋๋ค.
๋น๊ตํ ๋งํ ๋ค๋ฅธ ์ฉ์ด๊ฐ ๋ ์ค๋ฅด์ง ์์ต๋๋ค.
์ค๋๋ ๋๊ตฐ๊ฐ REST๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ ๋, ๊ฑฐ์ ํญ์ HTTP๋ฅผ ์ฌ์ฉํ๋ JSON ๊ธฐ๋ฐ API๋ฅผ ์ธ๊ธํ๋ ๊ฒ์ ๋๋ค.
REST ๋๋ REST ๊ฐ์ด๋๋ผ์ธ์ ์ธ๊ธํ๋ ๊ตฌ์ธ ๊ณต๊ณ ๋ ํ์ฌ์์ REST ๊ฐ์ด๋๋ผ์ธ์ ๋ ผ์ํ ๋, ํ์ดํผํ ์คํธ๋ ํ์ดํผ๋ฏธ๋์ด๋ ๊ฑฐ์ ์ธ๊ธ๋์ง ์์ผ๋ฉฐ ๋์ JSON, GraphQL(!) ๋ฑ์ด ์ธ๊ธ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ช๋ช ๊ณ ์ง์ค๋ฌ์ด ์ฌ๋๋ค์ ์ด๋ ๊ฒ ๋ถํํฉ๋๋ค: ํ์ง๋ง ์ด JSON API๋ค์ RESTfulํ์ง ์์์!
์ด ๊ฒ์๋ฌผ์์๋ REST์ ์งง๊ณ , ๋ถ์์ ํ๋ฉฐ, ๋๋ถ๋ถ ์๋ชป๋ ์ญ์ฌ๋ฅผ ์ ๊ณตํ๊ณ , REST์ ์๋ฏธ๊ฐ ์ด๋ป๊ฒ ๊ฑฐ์ ์๋ฒฝํ๊ฒ ๋ค๋ฐ๋์ด REST๊ฐ ์๋ ๋์กฐํ๋ ๊ฒ, ์ฆ RPC๋ฅผ ์๋ฏธํ๊ฒ ๋์๋์ง๋ฅผ ์ค๋ช ํ๊ณ ์ ํฉ๋๋ค.
REST๋ผ๋ ์ฉ์ด๋ REpresentational State Transfer์ ์ฝ์๋ก, Fielding์ ๋ฐ์ฌ ํ์ ๋ ผ๋ฌธ 5์ฅ์์ ๋น๋กฏ๋์์ต๋๋ค. Fielding์ (๋น์ ์๋ก ๋ฑ์ฅํ) ์๋ ์์ด๋ ์น์ ๋คํธ์ํฌ ์ํคํ ์ฒ๋ฅผ ์ค๋ช ํ๋ฉฐ, ๋ค๋ฅธ ๋คํธ์ํฌ ์ํคํ ์ฒ, ํนํ RPC ์คํ์ผ์ ๋คํธ์ํฌ ์ํคํ ์ฒ์ ๋์กฐํ์ต๋๋ค.
๊ทธ๊ฐ ๊ธ์ ์ผ๋ ์์ (1999-2000๋ )์ JSON API๋ ์กด์ฌํ์ง ์์์ต๋๋ค. ๊ทธ๋ ์ฌ๋๋ค์ด โ์น์ ์ํโํ๋ฉฐ HTML์ HTTP๋ก ์ฃผ๊ณ ๋ฐ๋ ๋น์์ ์น์ ์ค๋ช ํ๊ณ ์์์ต๋๋ค. JSON์ ์์ง ๋ง๋ค์ด์ง์ง ์์์ผ๋ฉฐ, JSON์ ๊ด๋ฒ์ํ ์ฑํ์ 10๋ ๋ค์ ์ผ์ด์์ต๋๋ค.
REST๋ _๋คํธ์ํฌ ์ํคํ ์ฒ_๋ฅผ ์ค๋ช ํ์ผ๋ฉฐ, RESTful API๋ก ๊ฐ์ฃผ๋๊ธฐ ์ํด ์ถฉ์กฑ๋์ด์ผ ํ๋ API์ ๋ํ _์ ์ฝ_์ผ๋ก ์ ์๋์์ต๋๋ค. ์ด ์ธ์ด๋ ํ๋ฌธ์ ์ด์ด์ ํผ๋์ ์ผ์ผ์ผฐ์ง๋ง, ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๊ฐ ์ดํดํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๋ช ํํฉ๋๋ค.
REST์๋ ๋ง์ ์ ์ฝ๊ณผ ๊ฐ๋ ์ด ํฌํจ๋์ด ์์ง๋ง, REST๋ฅผ ๋ค๋ฅธ ๋คํธ์ํฌ ์ํคํ ์ฒ์ ๋น๊ตํ ๋ ๊ฐ์ฅ ๊ตฌ๋ณ๋๊ณ ์ค์ํ ํน์ง์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ํต์ผ๋ ์ธํฐํ์ด์ค ์ ์ฝ์ผ๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ, ๊ทธ ๊ฐ๋ ๋ด์์ ํนํ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ์์ง์ผ๋ก์์ ํ์ดํผ๋ฏธ๋์ด(HATEOAS) ๋๋ Fielding์ด ์ ํธํ๋ โํ์ดํผ๋ฏธ๋์ด ์ ์ฝโ์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
์ด ํต์ผ๋ ์ธํฐํ์ด์ค ์ ์ฝ์ ์ดํดํ๊ธฐ ์ํด, ์ํ ๊ณ์ข์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐํํ๋ ๋ ๊ฐ์ง HTTP ์๋ต์ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ๋ HTML(ํ์ดํผํ ์คํธ)๋ก, ๋ ๋ฒ์งธ๋ JSON์ ๋๋ค:
HTTP/1.1 200 OK
<html>
<body>
<div>๊ณ์ข ๋ฒํธ: 12345</div>
<div>์์ก: $100.00 USD</div>
<div>๋งํฌ:
<a href="/accounts/12345/deposits">์
๊ธ</a>
<a href="/accounts/12345/withdrawals">์ถ๊ธ</a>
<a href="/accounts/12345/transfers">์ด์ฒด</a>
<a href="/accounts/12345/close-requests">ํด์ง ์์ฒญ</a>
</div>
<body>
</html>
HTTP/1.1 200 OK
{
"account_number": 12345,
"balance": {
"currency": "usd",
"value": 100.00
},
"status": "good"
}
์ด ๋ ์๋ต์ ์ค์ํ ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ _HTML ์๋ต_์ด RESTful์ด๊ณ _JSON ์๋ต_์ ๊ทธ๋ ์ง ์์ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
HTML ์๋ต์ ์์ ํ ์์ฒด ์ค๋ช ์ ์ ๋๋ค.
์ด ์๋ต์ ๋ฐ์ ์ ์ ํ ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ๋ ์ํ ๊ณ์ข๊ฐ ๋ฌด์์ธ์ง, ์์ก์ด ๋ฌด์์ธ์ง ๋ฑ์ ์์ง ๋ชปํฉ๋๋ค. ๊ทธ๊ฒ์ ๋จ์ํ ํ์ดํผ๋ฏธ๋์ด, HTML์ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ ๋ฟ์ ๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์ด ๋ฐ์ดํฐ์ ๊ด๋ จ๋ API ์๋ํฌ์ธํธ์ ๋ํด HTML ์์ฒด ๋ด์์ ํ์ ๊ฐ๋ฅํ URL๊ณผ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค(๋งํฌ์ ํผ) ์ธ์๋ ์๋ฌด๊ฒ๋ ์์ง ๋ชปํฉ๋๋ค. ๋ง์ฝ ๋ฆฌ์์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด ํด๋น ๋ฆฌ์์ค์์ ์ฌ์ฉํ ์ ์๋ ์์ ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด(์: ๊ณ์ข๊ฐ ๋ง์ด๋์ค๊ฐ ๋๋ ๊ฒฝ์ฐ), HTML ์๋ต์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์์ ์ธํธ๋ฅผ ํ์ํ๋๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ โ๋ง์ด๋์คโ๊ฐ ๋ฌด์์ธ์ง, ๋๋ ์ํ ๊ณ์ข๊ฐ ๋ฌด์์ธ์ง์กฐ์ฐจ ์์ง ๋ชปํ ์ฑ ์ด ์๋ก์ด HTML์ ๋ ๋๋งํฉ๋๋ค.
์ด์ ๊ฐ์ด ํ์ดํผํ ์คํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ์์ง ์ญํ ์ ํฉ๋๋ค: HTML ์๋ต์ ์์คํ ๊ณผ ์ํธ ์์ฉ์ ๊ณ์ํ๊ธฐ ์ํด ํ์ํ ๋ชจ๋ API ์ ๋ณด๋ฅผ ์์ฒด ๋ด์ ๋ด๊ณ ์์ต๋๋ค.
์ด์ ๋ ๋ฒ์งธ JSON ์๋ต๊ณผ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ๊ฒฝ์ฐ ๋ฉ์์ง๋ ์์ฒด ์ค๋ช
์ ์ด์ง ์์ต๋๋ค. ์คํ๋ ค ํด๋ผ์ด์ธํธ๋ ์ ์ ํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ํ๊ธฐ ์ํด status
ํ๋๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํฉ๋๋ค.
๋ํ, ํด๋ผ์ด์ธํธ๋ JSON ์๋ต ์ธ๋ถ์ ๋ค๋ฅธ ์ ๋ณด ์์ค(์: Swagger API ๋ฌธ์)์์ ํ์๋ โ๋์ญ ์ธโ ์ ๋ณด, ์ฆ URL, ๋งค๊ฐ๋ณ์ ๋ฑ์ ์์์ผ ๊ณ์ข์์ ์ฌ์ฉํ ์ ์๋ ์์
์ ์ ์ ์์ต๋๋ค.
JSON ์๋ต์ ์์ฒด ์ค๋ช ์ ์ด์ง ์์ผ๋ฉฐ ํ์ดํผ๋ฏธ๋์ด ๋ด์ ๋ฆฌ์์ค์ ์ํ๋ฅผ ์ธ์ฝ๋ฉํ์ง ์์ผ๋ฏ๋ก REST์ ํต์ผ๋ ์ธํฐํ์ด์ค ์ ์ฝ์ ์ถฉ์กฑํ์ง ๋ชปํ๋ฉฐ, ๋ฐ๋ผ์ RESTfulํ์ง ์์ต๋๋ค.
REST API๋ ํ์ดํผ๋ฏธ๋์ด ๊ตฌ๋์ด์ด์ผ ํ๋ค์์ Fielding์ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค:
REST API๋ ์ด๊ธฐ URI(๋ถ๋งํฌ)์ ์์๋๋ ์ฒญ์ค์๊ฒ ์ ํฉํ ํ์คํ๋ ๋ฏธ๋์ด ์ ํ์ ์งํฉ์ ์ ์ธํ๊ณ ๋ ์ฌ์ ์ง์ ์์ด ๋ค์ด๊ฐ์ผ ํฉ๋๋ค. ๊ทธ ์์ ๋ถํฐ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ์ ํ์ ์์ ๋ ํํ์ ์กด์ฌํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ํด๋น ํํ์ ์กฐ์ํ์ฌ ์์ํ๋ ์๋ฒ ์ ๊ณต ์ ํ์ ์ํด ๊ตฌ๋๋์ด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ RESTful ์์คํ ์์๋ ๋จ์ผ URL์ ํตํด ์์คํ ์ ์ง์ ํ ์ ์์ด์ผ ํ๋ฉฐ, ๊ทธ ์์ ๋ถํฐ ์์คํ ๋ด์์ ์ํ๋๋ ๋ชจ๋ ํ์ ๋ฐ ์์ ์ ์์ฒด ์ค๋ช ์ ์ธ ํ์ดํผ๋ฏธ๋์ด๋ฅผ ํตํด ์ ๊ณต๋์ด์ผ ํฉ๋๋ค: ์๋ฅผ ๋ค์ด HTML์ ๋งํฌ์ ํผ์ ํตํด. ์ ์ ํ RESTful ์์คํ ์์๋ ์ง์ ์ ์ดํ API์ ๋ํ ์ถ๊ฐ ์ ๋ณด๊ฐ ํ์ํ์ง ์์์ผ ํฉ๋๋ค.
์ด๊ฒ์ด RESTful ์์คํ ์ ๋๋ผ์ด ์ ์ฐ์ฑ์ ์์ฒ์ ๋๋ค: ๋ชจ๋ ์๋ต์ด ์์ฒด ์ค๋ช ์ ์ด๊ณ ํ์ฌ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์์ ์ ์ธ์ฝ๋ฉํ๊ธฐ ๋๋ฌธ์ ์๋ฅผ ๋ค์ด API ๋ฒ์ ๊ด๋ฆฌ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค! ์ค์ ๋ก, API๋ฅผ ๋ฌธ์ํํ ํ์์กฐ์ฐจ ์์ต๋๋ค!
์ํฉ์ด ๋ฐ๋๋ฉด ํ์ดํผ๋ฏธ๋์ด ์๋ต์ด ๋ณ๊ฒฝ๋๋ฉฐ, ๊ทธ๊ฒ ์ ๋ถ์ ๋๋ค.
๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ๋งค์ฐ ์ ์ฐํ๊ณ ํ์ ์ ์ธ ๊ฐ๋ ์ ๋๋ค.
์ค๋๋ ๋๋ถ๋ถ์ ์น ๊ฐ๋ฐ์์ ๋๋ถ๋ถ์ ํ์ฌ๋ _๋ ๋ฒ์งธ ์์ _๋ฅผ RESTful API๋ผ๊ณ ๋ถ๋ฅผ ๊ฒ์ ๋๋ค.
๊ทธ๋ค์ ์๋ง๋ ์ฒซ ๋ฒ์งธ ์๋ต์ _API ์๋ต_์ผ๋ก ๊ฐ์ฃผํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ์ HTML์ผ ๋ฟ์ด์ฃ !
(๋ถ์ํ HTML, ์กด์ค๋ฐ์ ์ ์๊ตฐ์.)
API๋ ํญ์ JSON์ด๊ฑฐ๋, ์๋๋ฉด ์ข ๋ ๊ณ ๊ธ์ค๋ฌ์ด ๊ฒฝ์ฐ Protobuf ๊ฐ์ ๊ฒ์ด์ฃ , ๋ง๋์?
ํ๋ ธ์ต๋๋ค.
์ฌ๋ฌ๋ถ ๋ชจ๋ ํ๋ ธ๊ณ , ๋ถ๋๋ฌ์ํด์ผ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์๋ต์ _API ์๋ต_์ด๋ฉฐ, ์ค์ ๋ก RESTfulํ ์๋ต์ ๋๋ค!
๋ ๋ฒ์งธ ์๋ต์ ์ค์ ๋ก ์๊ฒฉ ํ๋ก์์ ํธ์ถ(RPC) ์คํ์ผ์ API์ ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ๊ฒฐํฉ๋์ด ์์ผ๋ฉฐ, ์ด๋ Fielding์ด 2008๋ ์ ๋ถํํ๋ SocialSite API์ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค: ํด๋ผ์ด์ธํธ๋ JSON ์๋ต ์์ฒด ์ธ๋ถ์ ๋ค๋ฅธ ์์ค์์ ํ์๋ ๋ฆฌ์์ค์ ๊ด๋ จ๋ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์์์ผ ํฉ๋๋ค.
์ด API๋ ์ ์ ์ ์ผ๋ก REST์ ๊ฑฐ์ ๋ฐ๋์ ํด๋นํฉ๋๋ค.
์ด ์คํ์ผ์ API๋ฅผ โRESTlessโ๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด๋ป๊ฒ ์ ๊ณ์ 99.9%๊ฐ RESTfulํ์ง ์์ API๋ค์ RESTfulํ๋ค๊ณ ๋ถ๋ฅด๊ฒ ๋ ๊ฑธ๊น์?
ํฅ๋ฏธ๋ก์ด ์ด์ผ๊ธฐ์ ๋๋ค:
Roy Fielding์ 2000๋ ์ ๊ทธ์ ๋ ผ๋ฌธ์ ๋ฐํํ์ต๋๋ค.
๋น์ทํ ์๊ธฐ์, XML-RPC๋ผ๋ ๋ช ๋ฐฑํ RPC์์ ์๊ฐ์ ๋ฐ์ ํ๋กํ ์ฝ์ด ๋ฑ์ฅํ์ผ๋ฉฐ, HTTP๋ฅผ ์ฌ์ฉํ์ฌ API๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฃผ๋ชฉ๋ฐ๊ธฐ ์์ํ์ต๋๋ค. XML-RPC๋ Microsoft์ ๋ ํฐ ํ๋ก์ ํธ์ธ SOAP์ ์ผ๋ถ์์ต๋๋ค. XML-RPC๋ ์ฃผ๋ก ์ํฐํ๋ผ์ด์ฆ ์ธ๊ณ์์ ๋์จ ์ฌ๋ฌ RPC ์คํ์ผ ํ๋กํ ์ฝ์ ์ ํต์ ์ด์ด๋ฐ์์ผ๋ฉฐ, ๋ง์ ์ ์ ํ์ดํ๊ณผ ์ด๊ธฐ XML ๊ทน๋ํ์ ์์๋ค์ด ํฌํจ๋์์ต๋๋ค.
๋ํ ์ด ์์ ์ ๋ฑ์ฅํ ๊ฒ์ด AJAX์์ต๋๋ค. ๋น๋๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ์ XML์ด์ฃ . ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ XML์ ๋๋ค. ์ด์ ๋ชจ๋๊ฐ ์๊ณ ์๋ ๊ฒ์ฒ๋ผ, AJAX๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋ฒ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ๊ทธ ์๋ต์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ง์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํ์ฌ ์น ํ๋ก๊ทธ๋๋ฐ์ ์๋ก์ด ์ธ๊ณ๋ฅผ ์ด์์ต๋๋ค.
๋ฌธ์ ๋: ์ด๋ฌํ ์์ฒญ์ ์ด๋ค ํ์์ ๊ฐ์ ธ์ผ ํ ๊น์? ๋น์ฐํ XML์ด ๋ ๊ฒ์ด์์ต๋๋ค. ์ด๋ฆ์๋ ๋์ ์์์์. ๊ทธ๋ฆฌ๊ณ ์๋ก์ด SOAP/XML-RPC ํ์ค์ด ๋์์ผ๋, ๊ทธ๊ฒ ์ ํฉํ ๊ฒ์ผ๊น์?
์ผ๋ถ ์ฌ๋๋ค์ Fielding์ด ์ค๋ช ํ ์น์ ๋ค๋ฅธ ์ํคํ ์ฒ๋ฅผ ์ธ์งํ๊ณ , SOAP ๋์ REST๊ฐ โ์น ์๋น์คโ๋ก ๋ถ๋ฆฌ๊ธฐ ์์ํ ๊ฒ์ ์ ๊ทผํ๋ ์ ํธ ๋ฉ์ปค๋์ฆ์ด ๋์ด์ผ ํ๋์ง ๋ฌป๊ธฐ ์์ํ์ต๋๋ค. ์น์ ๋งค์ฐ ์ ์ฐํ๊ณ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๋ ๊ฒ์ผ๋ก ์ ์ฆ๋๊ณ ์์๊ธฐ ๋๋ฌธ์, ๋ธ๋ผ์ฐ์ ์ ์ธ๊ฐ์๊ฒ ์ ์๋ํ๋ ๋์ผํ ๋คํธ์ํฌ ์ํคํ ์ฒ, ์ฆ REST๊ฐ API์๋ ์ ๋ง์ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋์์ต๋๋ค.
์ด๋ ๊ทธ๋ด๋ฏํ๊ฒ ๋ค๋ ธ์ต๋๋ค, ํนํ XML์ด API์ ํ์์ด์์ ๋ ๋์ฑ ๊ทธ๋ฌ์ต๋๋ค: XML์ ํ์คํ HTML๊ณผ ๋งค์ฐ ๋น์ทํ๊ฒ ์๊ฒผ์ต๋๋ค, ๊ทธ๋ ์ฃ ? XML API๊ฐ RESTful ์ ์ฝ ์กฐ๊ฑด, ํนํ ํต์ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฒ์ ์ถฉ์กฑํ ์ ์๋ค๊ณ ์์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ฌ๋๋ค์ ์ด ๊ฒฝ๋ก๋ฅผ ํ์ํ๊ธฐ ์์ํ์ต๋๋ค.
์ด ๋ชจ๋ ์ผ์ด ๋ฒ์ด์ง๋ ๋์, ๋ ๋ค๋ฅธ ์ค์ํ ๊ธฐ์ ์ด ํ์ ์ค์ด์์ต๋๋ค: JSON
JSON์ SOAP/RPC-XML์ ์๋ฐ์ ๋น๊ตํ ๋ ๋ฌธ์ ๊ทธ๋๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์์ต๋๋ค: ๋จ์ํ๊ณ , ๋์ ์ด๋ฉฐ, ์ฌ์ ์ต๋๋ค. ์ง๊ธ์ JSON์ด ๋๋ถ๋ถ์ ์น API์์ ์ง๋ฐฐ์ ์ธ ํ์์ด ๋ ๊ฒ์ด ๋ฏฟ๊ธฐ ์ด๋ ค์ธ ์ ๋๋ก, ์ค์ ๋ก JSON์ด ์ ํํ๋ ๋ฐ๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค. 2008๋ ๊น์ง๋ API ๊ฐ๋ฐ์ ๋ํ ๋ ผ์๋ ์ฃผ๋ก XML์ ๊ดํ ๊ฒ์ด์๊ณ , JSON์ ๋ํ ๊ฒ์ ์๋์์ต๋๋ค.
2008๋ ์ Martin Fowler๋ Richardson Maturity Model์ ๋์คํํ ๊ธฐ์ฌ๋ฅผ ๋ฐํํ์ผ๋ฉฐ, ์ด ๋ชจ๋ธ์ ์ฃผ์ด์ง API๊ฐ ์ผ๋ง๋ RESTfulํ์ง ํ๋จํ๋ ๋ฐ ์ฌ์ฉ๋์์ต๋๋ค.
์ด ๋ชจ๋ธ์ ๋ค ๊ฐ์ง โ๋ ๋ฒจโ์ ์ ์ํ์ผ๋ฉฐ, ์ฒซ ๋ฒ์งธ ๋ ๋ฒจ์ โPlain Old XMLโ ๋๋ โThe Swamp of POXโ๋ก ๋ถ๋ ธ์ต๋๋ค.
๊ทธ ํ, API๋ ๋ค์ ์์ด๋์ด๋ค์ ์ฑํํจ์ ๋ฐ๋ผ ๋ โ์ฑ์ํโ REST API๋ก ๊ฐ์ฃผ๋ ์ ์์์ต๋๋ค:
GET
, POST
, DELETE
๋ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ)๋ ๋ฒจ 3์ ํต์ผ๋ ์ธํฐํ์ด์ค๊ฐ ๋ค์ด๊ฐ๋ ๊ณณ์ผ๋ก, ์ด ๋ ๋ฒจ์ด ๊ฐ์ฅ ์ฑ์ํ๊ณ ์ง์ ํ โREST์ ์๊ดโ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๋ถํํ๋ REST๋ผ๋ ์ฉ์ด์ ์์ด ๋ ๊ฐ์ง ์ผ์ด ์ผ์ด๋ฌ์ต๋๋ค:
JSON์ SOAP/XML-RPC๊ฐ ๋๋ฌด ๊ณผ๋ํ๊ฒ ์ค๊ณ๋ ๋ฐ๋ฉด, JSON์ ๋จ์ํ๊ณ โ๊ทธ๋ฅ ์๋โํ๋ฉฐ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฌ์ ๊ธฐ ๋๋ฌธ์ ์น ์๋น์ค/API ์ธ๊ณ์์ ๋น ๋ฅด๊ฒ ์๋ฆฌ๋ฅผ ์ก์์ต๋๋ค.
์ด ๋ณํ์ ํจ๊ป ์น ๊ฐ๋ฐ ์ธ๊ณ๋ J2EE ๋ง์ธ๋์ ์ ์กฑ์๋ฅผ ํ์คํ ๋จ์ณ๋ด๊ณ , SOAP/XML-RPC๋ฅผ ์ํฐํ๋ผ์ด์ฆ ์ ์ฉ์ผ๋ก ํ์ ์์ผฐ์ต๋๋ค.
REST ์ ๊ทผ๋ฒ์ SOAP/XML-RPC์ฒ๋ผ XML์ ๋๋ฌด ์ฝ๋งค์ด์ง ์์์ผ๋ฉฐ, ์๋ํฌ์ธํธ์ ๋ํ ํ์์ฑ์ ๋ ์๊ตฌํ๊ธฐ ๋๋ฌธ์, REST๋ JSON์ด ์ฃผ๋๊ถ์ ์ก๊ธฐ ์ํ ์์ฐ์ค๋ฌ์ด ์ฅ์๊ฐ ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ก์ต๋๋ค.
์ด ์ค์ํ ๋ณํ ๋์, ๋๋ถ๋ถ์ JSON API๊ฐ RMM์ ๋ ๋ฒจ 2์์ ๋ฉ์ถ๋ค๋ ๊ฒ์ด ์ ์ ๋ ๋ถ๋ช ํด์ก์ต๋๋ค.
์ผ๋ถ๋ ์๋ต์ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ ํฌํจ์์ผ ๋ ๋ฒจ 3์ ๋๋ฌํ๋ ค ํ์ง๋ง, ๊ฑฐ์ ๋ชจ๋ API๊ฐ ์ฌ์ ํ ๋ฌธ์๋ฅผ ๊ฒ์ํด์ผ ํ๋ค๋ ์ฌ์ค์ โREST์ ์๊ดโ์ด ๋ฌ์ฑ๋์ง ์์์์ ์์ฌํ์ต๋๋ค.
์๋ต ํ์์ผ๋ก JSON์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ํํธ๊ฐ ๋์ด์ผ ํ์ต๋๋ค: JSON์ ๋ถ๋ช ํ ํ์ดํผํ ์คํธ๊ฐ ์๋๋๋ค. ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ ๊ทธ ์์ ์ ์ฉํ ์ ์์ง๋ง, ์ด๋ ์์ฐ์ค๋ฝ์ง ์์ต๋๋ค. XML์ ์ ์ด๋ ์ด๋ป๊ฒ๋ HTML์ฒ๋ผ ๋ณด์๊ธฐ ๋๋ฌธ์ ํ์ดํผ๋ฏธ๋์ด๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฐ๋ฅ์ฑ์ด ์์์ต๋๋ค.
JSON์ ๋จ์งโฆ ๋ฐ์ดํฐ์ผ ๋ฟ์ด์์ต๋๋ค. ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ ์ถ๊ฐํ๋ ๊ฒ์ ์ด์ํ๊ณ , ํ์คํ๋์ง ์์์ผ๋ฉฐ, ํต์ผ๋ ์ธํฐํ์ด์ค ์ ์ฝ์์ ์ค๋ช ๋ ๋ฐฉ์์ผ๋ก ๊ฑฐ์ ์ฌ์ฉ๋์ง ์์์ต๋๋ค.
์ด๋ฌํ ์ด๋ ค์์๋ ๋ถ๊ตฌํ๊ณ REST๋ผ๋ ์ฉ์ด๋ ๋ถ์ด ์์์ต๋๋ค: REST๋ SOAP์ ๋ฐ๋์์ผ๋ฉฐ, JSON API๋ SOAP์ด ์๋์์ต๋๋ค. ๋ฐ๋ผ์ JSON API๋ REST์์ต๋๋ค.
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ์ฌ์ ์ด๋ฅด๊ฒ ๋ ํ ๋ฌธ์ฅ์ผ๋ก ์ค๋ช ํ ์ ์๋ ๊ณผ์ ์ ๋๋ค.
JSON API ์ธ๊ณ๊ฐ ์ง์ ์ผ๋ก RESTfulํ API๋ฅผ ์ผ๊ด๋๊ฒ ๋ฌ์ฑํ์ง ๋ชปํ์์๋ ๋ถ๊ตฌํ๊ณ , ์์ฑ๋ RESTless API๊ฐ โRESTfulโ์ธ์ง ์ฌ๋ถ์ ๋ํ ๋ง์ ๋ ผ์์ด ์์์ต๋๋ค. URL ๋ ์ด์์์ ๋ํ ๋ ผ์, ์ฃผ์ด์ง ์์ ์ ์ ์ ํ HTTP ๋์ฌ์ ๋ํ ๋ ผ์, ๋ฏธ๋์ด ํ์ ์ ๋ํ ๋ถ๊ฝ ํ๋ ๋ ผ์ ๋ฑ์ด ์์์ต๋๋ค.
์ ๋ ๋น์ ์ด๋ ธ๊ณ , ์ ์ฒด ์ํฉ์ด ๋ถํฌ๋ช ํ๊ณ , ์์์ฃผ์์ ์ด๋ฉฐ, ๋ฉ๊ฒ ๋๊ปด์ก๊ธฐ ๋๋ฌธ์ REST๋ผ๋ ๊ฐ๋ ์ ๋ํด ๊ฑฐ์ ํฌ๊ธฐํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ธํฐ๋ท์์ ์ฌ๋๋ค์ด ์ธ์ฐ๋ ์ฃผ์ ์ฒ๋ผ ๋๊ปด์ก์ต๋๋ค.
์ ๊ฐ ๊ฑฐ์ ์ ํ์ง ๋ชปํ๋ (ํน์ ์ ํ์ด๋ ์ดํดํ์ง ๋ชปํ๋) ๊ฒ์ ํต์ผ๋ ์ธํฐํ์ด์ค์ ๊ฐ๋ ๊ณผ ๊ทธ๊ฒ์ด RESTful ์์คํ ์์ ์ผ๋ง๋ ์ค์ํ์ง์ ๋ํ ๊ฒ์ด์์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ์ ๊ฐ intercooler.js๋ฅผ ๋ง๋ค๊ณ , ๋ช๋ช ๋๋ํ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ด RESTfulํ๋ค๊ณ ๋งํ๊ธฐ ์์ํ์ ๋ ๋ค์ ์ด ๊ฐ๋ ์ ๊ด์ฌ์ ๊ฐ๊ฒ ๋์์ต๋๋ค.
RESTful? ๊ทธ๊ฑด JSON API์ ๋ํ ์ด์ผ๊ธฐ์ธ๋ฐ, ์ด๋ป๊ฒ ๋ด ์์ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ RESTfulํ ์ ์์๊น?
๊ทธ๋์ ์ ๋ ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์กฐ์ฌํ๊ณ , Fielding์ ๋ ผ๋ฌธ์ ์๋กญ๊ฒ ์ฝ์ด๋ณด์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋๊ฒ๋ intercooler๊ฐ RESTful์ผ ๋ฟ๋ง ์๋๋ผ, ์ ๊ฐ ๋ค๋ฃจ๊ณ ์๋ โRESTfulโ JSON API๋ค์ด ์ ํ RESTfulํ์ง ์๋ค๋ ์ฌ์ค์ ๋ฐ๊ฒฌํ์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ ๋์ ์ ๋ ์ธํฐ๋ท์ ์ง๋ฃจํ๊ฒ ๋ง๋ค๊ธฐ ์์ํ์ต๋๋ค:
๊ฒฐ๊ตญ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ JSON API์ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ ์ถ๊ฐํ๋ ค๋ ์๋๋ฅผ ํฌ๊ธฐํ์ต๋๋ค. ์ด๋ฌํ ์ปจํธ๋กค๋ค์ด ํน์ ์ ๋ฌธ ์ํฉ์์๋ ์ ์๋ํ์ง๋ง (์: ํ์ด์ง), ์ผ๋ฐ์ ์ธ ์ธ๊ฐ ์งํฅ ์ธํฐ๋ท์์ REST๊ฐ ์ฐพ์ ๋๊ณ ๋ช ๋ฐฑํ ์ ์ฉ์ฑ์ ๋ฌ์ฑํ์ง ๋ชปํ์ต๋๋ค. (๊ทธ ์ด์ ์ ๋ํ ์ ์ด๋ก ์ด ์์ต๋๋ค.)
์ด๋ ๊ฒ ํด์ REST๋ RESTless ์ํ๋ก ๊ตณ์ด์ก๊ณ , REST๋ผ๋ ์๋ฏธ๋ RMM์ ๋ ๋ฒจ 1 ๋๋ 2์ ์๋ JSON API๋ก ์ฒ์ฒํ ์๋ฆฌ์ก์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ํญ์ ๋ ๋ฒจ 3์ ๋๋ฌํ์ฌ REST์ ์๊ด์ ๋๋ฆด ๊ฐ๋ฅ์ฑ์ด ์์์ต๋๋ค.
๊ทธ๋ฌ๋ Single Page Applications(SPA)๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
SPA๊ฐ ๋ฑ์ฅํ๋ฉด์ ์น ๊ฐ๋ฐ์ ์๋์ RESTful ์ํคํ ์ฒ์ ์์ ํ ๋จ์ ๋์์ต๋๋ค. SPA ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋คํธ์ํน ์ํคํ ์ฒ๋ JSON RPC ์คํ์ผ๋ก ์ด๋ํ์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ก ์ ๋ฌธํ๋์์ต๋๋ค.
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ ๋ถ๋ช ํ RESTfulํ ์์ ์ ์ ํ ํ์ง ์์์ต๋๋ค. ๊ทธ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ DOM ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ํ์ํ ๋ AJAX API๋ฅผ ํธ์ถํ๋ฉฐ ์์ ์ ์งํํ์ต๋๋ค. ์ด๋ ์ด๊ธฐ ์น๋ณด๋ค๋ ๋๊บผ์ด ํด๋ผ์ด์ธํธ ์์ฑ๊ณผ ๋ ๋น์ทํ์ต๋๋ค.
๋ฐฑ์๋ ์์ง๋์ด๋ค์ ์ด๋ ์ ๋ ๋คํธ์ํฌ ์ํคํ ์ฒ์ ๋ํด ์ฌ์ ํ ์ ๊ฒฝ์ ์ผ์ผ๋ฉฐ, ๊ทธ๋ค์ด ํ๊ณ ์๋ ์์ ์ ์ค๋ช ํ๊ธฐ ์ํด โRESTโ๋ผ๋ ์ฉ์ด๋ฅผ ๊ณ์ ์ฌ์ฉํ์ต๋๋ค.
๋น๋ก ๊ทธ๋ค์ด RESTful API๋ฅผ ์ํ swagger ๋ฌธ์๋ฅผ ๊ฒ์ํ๊ฑฐ๋ RESTful API์ API ๋ณ๋์ฑ์ ๋ํด ๋ถํํ๋๋ผ๋ ๋ง์ด์ฃ . ์ค์ ๋ก RESTful API๋ฅผ ์์ฑํ๊ณ ์๋ค๋ฉด ๋ฐ์ํ์ง ์์์ ์ผ๋ค์ ๋๋ค.
๊ฒฐ๊ตญ 2010๋ ๋ ํ๋ฐ์ ์ด๋ฅด๋ฌ ์ฌ๋๋ค์ ์ฐธ์ ๋งํผ ์ฐธ์์ต๋๋ค: REST, ์ฌ์ง์ด RESTless ์ํ์์๋, ์ ์ ๋ณต์กํด์ง๋ SPA ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ๋ฅผ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ๋ ๋๊บผ์ด ํด๋ผ์ด์ธํธ์ฒ๋ผ ๋ณํ๊ณ , ๋๊บผ์ด ํด๋ผ์ด์ธํธ ๋ฌธ์ ๋ ๋๊บผ์ด ํด๋ผ์ด์ธํธ ์๋ฃจ์ ์ ํ์๋ก ํ์ผ๋ฉฐ, ํ์ดํผ๋ฏธ๋์ด ํด๋ผ์ด์ธํธ ์๋ฃจ์ ์ด ์๋๋ผ๋ ๊ฒ์ด ๋ช ๋ฐฑํด์ก์ต๋๋ค.
๊ฒฐ๊ตญ GraphQL์ด ์ถ์๋๋ฉด์ ์ํฉ์ ํ์คํ ๋ฌด๋์ก์ต๋๋ค.
GraphQL์ RESTful๊ณผ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ์์ต๋๋ค: GraphQL์ ์ฌ์ฉํ๋ API์ ์์ ํ๋ ค๋ฉด ๋ฐ๋์ ๋ฌธ์๊ฐ ํ์ํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ๋งค์ฐ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์์ต๋๋ค. GraphQL์๋ ๋ค์ดํฐ๋ธ ํ์ดํผ๋ฏธ๋์ด ์ปจํธ๋กค์ด ์์ต๋๋ค. GraphQL์ ์คํค๋ง๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฌ๋ฌ ๋ฉด์์ ์ ๋ฐ์ดํธ๋ ๊ฐ๋จํ XML-RPC ๋ฒ์ ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
์ฌ๊ธฐ์ ์ ๋ ์ด๋ ๊ฒ ๋งํ๊ณ ์ถ์ต๋๋ค: ๊ทธ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค!
๋ง์ ๊ฒฝ์ฐ ์ฌ๋๋ค์ GraphQL์ ์ ๋ง๋ก ์ข์ํฉ๋๋ค. ๋๊บผ์ด ํด๋ผ์ด์ธํธ ์คํ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ค๋ฉด, ๊ทธ๊ฒ์ด ์์ฃผ ํฉ๋ฆฌ์ ์ ๋๋ค:
์ด ์ง๋ฌธ์ ๋ํ ๊ฐ๋จํ ๋๋ต์ HATEOAS๊ฐ ๋๋ถ๋ถ์ ํ๋ API ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๊ฑฐ์ 20๋ ์ด ์ง๋ ์ง๊ธ๋ HATEOAS๋ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ ๋๋ฆฌ ์ฑํ๋์ง ๋ชปํ์ต๋๋ค. ๋ฐ๋ฉด GraphQL์ ์ค์ง์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ ๊ด๋ฒ์ํ๊ฒ ํ์ฐ๋๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์ GraphQL์ REST๊ฐ ์๋๋ฉฐ, REST๊ฐ ๋๊ณ ์ ํ์ง๋ ์๊ณ , REST๊ฐ ๋๋ ค๊ณ ํ์ง๋ ์์ต๋๋ค.
ํ์ง๋ง ์ค๋๋ ๋๋ค์์ ๊ฐ๋ฐ์์ ํ์ฌ๋ค์ ์ฌ์ ํ GraphQL ๊ธฐ๋ฅ์ API์ ์ด์ ์ ์ผ๋ก ์ถ๊ฐํ๋ฉด์๋, ๊ทธ๋ค์ด ๊ตฌ์ถํ๋ ๊ฒ์ด REST๋ผ๊ณ ๊ณ์ ๋ถ๋ฅด๊ณ ์์ต๋๋ค.
๋ถํํ๋, voidfunc์ ๋ง์ด ๋ง์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค:
์๋ฌด๋ฆฌ ํ์งํ์ ๋๋๋ ค๋ ์์ฉ์์ต๋๋ค. ๊ทธ ์ ์์ ์ค๋ ์ ์ ์ก์ต๋๋ค. REST๋ ์ฌ๋๋ค์ด HTTP+JSON RPC๋ฅผ ์ํด ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด์ผ ๋ฟ์ ๋๋ค.
์ฐ๋ฆฌ๋ RESTfulํ์ง ์์ JSON API๋ฅผ ๊ณ์ REST๋ผ๊ณ ๋ถ๋ฅผ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ด ์ด์ ๋ ๋ชจ๋๊ฐ ๋ถ๋ฅด๋ ๋ช ์นญ์ด๋๊น์.
์ ๊ฐ ์ ์ ๋ ์ด์ฌํ ํ์งํ์ ๋๋๋ฆฌ๋๋ผ๋, 50๋ ํ์๋ Global Omni Corp.๋ ์ฌ์ ํ ๊ทธ๋ค์ RESTful JSON API์ swagger ๋ฌธ์ ์์ ์ ์ํ ์ผ์๋ฆฌ๋ฅผ ๊ด๊ณ ํ๊ณ ์์ ๊ฒ์ ๋๋ค.
์ํฉ์ ์ ๋ง์ ์ด์ง๋ง, ์ฌ๊ฐํ์ง๋ ์์ต๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , REST๋ฅผ ์ค๋ช ํ ๊ธฐํ๋ ์ฌ์ ํ ์์ผ๋ฉฐ, ํนํ ํต์ผ๋ ์ธํฐํ์ด์ค ๊ฐ๋ ์ ์๋์ ๋งฅ๋ฝ์์ ๋ค์ด๋ณธ ์ ์ด ์๊ณ , REST๊ฐ JSON API์ ๊ฐ๋ค๊ณ ๊ฐ์ ํ๋ ์๋ก์ด ์ธ๋์ ์น ๊ฐ๋ฐ์๋ค์๊ฒ ์ค๋ช ํ ๊ธฐํ๊ฐ ์์ต๋๋ค.
์ฌ๋๋ค์ ๋ฌด์ธ๊ฐ ์๋ชป๋์๋ค๊ณ ๋๋๋๋ค, ๊ทธ๋ฆฌ๊ณ ์๋ง๋ REST, ์ง์ ํ ์ค์ REST, RESTless๊ฐ ์๋ REST๊ฐ ๊ทธ์ ๋ํ ๋ต๋ณ์ ์ผ๋ถ๊ฐ ๋ ์ ์์ ๊ฒ์ ๋๋ค.
์ต์ํ REST์ ์์ด๋์ด๋ ํฅ๋ฏธ๋กญ๊ณ , ์ผ๋ฐ์ ์ธ ์ํํธ์จ์ด ์์ง๋์ด๋ง ์ง์์ผ๋ก์ ์ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ ๋ ํฐ ๋ฉํํฌ์ธํธ๋ ์์ต๋๋ค: ์๋์ ์ผ๋ก ๋๋ํ ์ฌ๋๋ค(์ด๊ธฐ ์น ๊ฐ๋ฐ์๋ค), ์ธํฐ๋ท์ ํํ์ ๋๋ฆฌ๋ฉฐ, REST๋ผ๋ ์ฉ์ด์ ๋ํ ๊ฝค ๋ช ํํ(๋๋๋ก ํ๋ฌธ์ ์ธ) ์ฌ์์ ๊ฐ์ง๊ณ ์๋ ์ด๋ค๋ 20๋ ๋์ ๊ทธ ์๋ฏธ๋ฅผ ์๋์ ์๋ฏธ์ ์ผ์น์ํฌ ์ ์์๋ค๋ ์ ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ดํ ๋ก ๋ช ๋ฐฑํ๊ฒ ์๋ชป๋ ์ ์๋ค๋ฉด, ๋ค๋ฅธ ๋ฌด์์ ์๋ชป ์๊ฐํ๊ณ ์์ ์ ์์๊น์?