How Did REST Come To Mean The Opposite of REST?

Carson Gross

#ํ‘œ์ง€ํŒ์„ ๋‘๋“œ๋ฆฌ๊ธฐ

You are wrong

HTTP ๊ธฐ๋ฐ˜์˜ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ REST API๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ ์ขŒ์ ˆ๊ฐ์„ ๋Š๋‚๋‹ˆ๋‹ค. ์˜ค๋Š˜์˜ ์˜ˆ์‹œ๋Š” SocialSite REST API์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ RPC์ž…๋‹ˆ๋‹ค. ์™„์ „ํžˆ RPC๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฐํ•ฉ์ด ๋“œ๋Ÿฌ๋‚˜ ์žˆ์–ด์„œ X ๋“ฑ๊ธ‰์„ ๋ฐ›์•„์•ผ ํ•  ์ •๋„์ž…๋‹ˆ๋‹ค.

REST ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์—์„œ ํ•˜์ดํผํ…์ŠคํŠธ๊ฐ€ ์ œ์•ฝ์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋ช…ํ™•ํžˆ ํ•˜๋ ค๋ฉด ๋ฌด์—‡์„ ํ•ด์•ผ ํ• ๊นŒ์š”? ๋‹ค์‹œ ๋งํ•ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ(๋”ฐ๋ผ์„œ API)์˜ ์—”์ง„์ด ํ•˜์ดํผํ…์ŠคํŠธ์— ์˜ํ•ด ๊ตฌ๋™๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด RESTfulํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, REST API๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋์ž…๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€ ์ž˜๋ชป๋œ ๋งค๋‰ด์–ผ์ด ์žˆ๋Š” ๊ฑด๊ฐ€์š”?

โ€“Roy Fielding, REST ์šฉ์–ด ์ฐฝ์‹œ์ž

ย ย ย REST APIs must be hypertext-driven

REST๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ์‚ฌ์ƒ ๊ฐ€์žฅ ์ž˜๋ชป ์‚ฌ์šฉ๋œ ๊ธฐ์ˆ  ์šฉ์–ด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋น„๊ตํ•  ๋งŒํ•œ ๋‹ค๋ฅธ ์šฉ์–ด๊ฐ€ ๋– ์˜ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ๋ˆ„๊ตฐ๊ฐ€ REST๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๊ฑฐ์˜ ํ•ญ์ƒ HTTP๋ฅผ ์‚ฌ์šฉํ•˜๋Š” JSON ๊ธฐ๋ฐ˜ API๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

REST ๋˜๋Š” REST ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์–ธ๊ธ‰ํ•˜๋Š” ๊ตฌ์ธ ๊ณต๊ณ ๋‚˜ ํšŒ์‚ฌ์—์„œ REST ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋…ผ์˜ํ•  ๋•Œ, ํ•˜์ดํผํ…์ŠคํŠธ๋‚˜ ํ•˜์ดํผ๋ฏธ๋””์–ด๋Š” ๊ฑฐ์˜ ์–ธ๊ธ‰๋˜์ง€ ์•Š์œผ๋ฉฐ ๋Œ€์‹  JSON, GraphQL(!) ๋“ฑ์ด ์–ธ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡๋ช‡ ๊ณ ์ง‘์Šค๋Ÿฌ์šด ์‚ฌ๋žŒ๋“ค์€ ์ด๋ ‡๊ฒŒ ๋ถˆํ‰ํ•ฉ๋‹ˆ๋‹ค: ํ•˜์ง€๋งŒ ์ด JSON API๋“ค์€ RESTfulํ•˜์ง€ ์•Š์•„์š”!

์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” REST์˜ ์งง๊ณ , ๋ถˆ์™„์ „ํ•˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„ ์ž˜๋ชป๋œ ์—ญ์‚ฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ , REST์˜ ์˜๋ฏธ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฑฐ์˜ ์™„๋ฒฝํ•˜๊ฒŒ ๋’ค๋ฐ”๋€Œ์–ด REST๊ฐ€ ์›๋ž˜ ๋Œ€์กฐํ•˜๋˜ ๊ฒƒ, ์ฆ‰ RPC๋ฅผ ์˜๋ฏธํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

#REST๋Š” ์–ด๋””์—์„œ ์™”์„๊นŒ?

REST๋ผ๋Š” ์šฉ์–ด๋Š” REpresentational State Transfer์˜ ์•ฝ์ž๋กœ, Fielding์˜ ๋ฐ•์‚ฌ ํ•™์œ„ ๋…ผ๋ฌธ 5์žฅ์—์„œ ๋น„๋กฏ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Fielding์€ (๋‹น์‹œ ์ƒˆ๋กœ ๋“ฑ์žฅํ•œ) ์›”๋“œ ์™€์ด๋“œ ์›น์˜ ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜, ํŠนํžˆ RPC ์Šคํƒ€์ผ์˜ ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜์™€ ๋Œ€์กฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฐ€ ๊ธ€์„ ์ผ๋˜ ์‹œ์ (1999-2000๋…„)์— JSON API๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์‚ฌ๋žŒ๋“ค์ด โ€œ์›น์„ ์„œํ•‘โ€œํ•˜๋ฉฐ HTML์„ HTTP๋กœ ์ฃผ๊ณ ๋ฐ›๋˜ ๋‹น์‹œ์˜ ์›น์„ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. JSON์€ ์•„์ง ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ, JSON์˜ ๊ด‘๋ฒ”์œ„ํ•œ ์ฑ„ํƒ์€ 10๋…„ ๋’ค์˜ ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

REST๋Š” _๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜_๋ฅผ ์„ค๋ช…ํ–ˆ์œผ๋ฉฐ, RESTful API๋กœ ๊ฐ„์ฃผ๋˜๊ธฐ ์œ„ํ•ด ์ถฉ์กฑ๋˜์–ด์•ผ ํ•˜๋Š” API์— ๋Œ€ํ•œ _์ œ์•ฝ_์œผ๋กœ ์ •์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์–ธ์–ด๋Š” ํ•™๋ฌธ์ ์ด์–ด์„œ ํ˜ผ๋ž€์„ ์ผ์œผ์ผฐ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

#REST์˜ ํ•ต์‹ฌ: ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค & HATEOAS

REST์—๋Š” ๋งŽ์€ ์ œ์•ฝ๊ณผ ๊ฐœ๋…์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, REST๋ฅผ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜์™€ ๋น„๊ตํ•  ๋•Œ ๊ฐ€์žฅ ๊ตฌ๋ณ„๋˜๊ณ  ์ค‘์š”ํ•œ ํŠน์ง•์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ์•ฝ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ฐœ๋… ๋‚ด์—์„œ ํŠนํžˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ์˜ ์—”์ง„์œผ๋กœ์„œ์˜ ํ•˜์ดํผ๋ฏธ๋””์–ด(HATEOAS) ๋˜๋Š” Fielding์ด ์„ ํ˜ธํ•˜๋Š” โ€œํ•˜์ดํผ๋ฏธ๋””์–ด ์ œ์•ฝโ€œ์ด๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค ์ œ์•ฝ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ์€ํ–‰ ๊ณ„์ขŒ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ HTTP ์‘๋‹ต์„ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” HTML(ํ•˜์ดํผํ…์ŠคํŠธ)๋กœ, ๋‘ ๋ฒˆ์งธ๋Š” JSON์ž…๋‹ˆ๋‹ค:

#HTML ์‘๋‹ต

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>

#JSON ์‘๋‹ต

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ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

#์ฐฝ์‹œ์ž: RESTful API๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด ๊ตฌ๋™์ด์–ด์•ผ ํ•œ๋‹ค

REST API๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด ๊ตฌ๋™์ด์–ด์•ผ ํ•œ๋‹ค์—์„œ Fielding์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•ฉ๋‹ˆ๋‹ค:

REST API๋Š” ์ดˆ๊ธฐ URI(๋ถ๋งˆํฌ)์™€ ์˜ˆ์ƒ๋˜๋Š” ์ฒญ์ค‘์—๊ฒŒ ์ ํ•ฉํ•œ ํ‘œ์ค€ํ™”๋œ ๋ฏธ๋””์–ด ์œ ํ˜•์˜ ์ง‘ํ•ฉ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์‚ฌ์ „ ์ง€์‹ ์—†์ด ๋“ค์–ด๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ ์ „ํ™˜์€ ์ˆ˜์‹ ๋œ ํ‘œํ˜„์— ์กด์žฌํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ํ‘œํ˜„์„ ์กฐ์ž‘ํ•˜์—ฌ ์•”์‹œํ•˜๋Š” ์„œ๋ฒ„ ์ œ๊ณต ์„ ํƒ์— ์˜ํ•ด ๊ตฌ๋™๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ RESTful ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‹จ์ผ URL์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์— ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋“  ํƒ์ƒ‰ ๋ฐ ์ž‘์—…์€ ์ž์ฒด ์„ค๋ช…์ ์ธ ํ•˜์ดํผ๋ฏธ๋””์–ด๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ์˜ˆ๋ฅผ ๋“ค์–ด HTML์˜ ๋งํฌ์™€ ํผ์„ ํ†ตํ•ด. ์ ์ ˆํ•œ RESTful ์‹œ์Šคํ…œ์—์„œ๋Š” ์ง„์ž…์  ์ดํ›„ API์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด RESTful ์‹œ์Šคํ…œ์˜ ๋†€๋ผ์šด ์œ ์—ฐ์„ฑ์˜ ์›์ฒœ์ž…๋‹ˆ๋‹ค: ๋ชจ๋“  ์‘๋‹ต์ด ์ž์ฒด ์„ค๋ช…์ ์ด๊ณ  ํ˜„์žฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์„ ์ธ์ฝ”๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๋ฅผ ๋“ค์–ด API ๋ฒ„์ „ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค! ์‹ค์ œ๋กœ, API๋ฅผ ๋ฌธ์„œํ™”ํ•  ํ•„์š”์กฐ์ฐจ ์—†์Šต๋‹ˆ๋‹ค!

์ƒํ™ฉ์ด ๋ฐ”๋€Œ๋ฉด ํ•˜์ดํผ๋ฏธ๋””์–ด ์‘๋‹ต์ด ๋ณ€๊ฒฝ๋˜๋ฉฐ, ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋งค์šฐ ์œ ์—ฐํ•˜๊ณ  ํ˜์‹ ์ ์ธ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

#์—…๊ณ„: ๋†๋‹ด์ด ์•„๋‹ˆ๋ผ, RESTful API๋Š” JSON์ด๋‹ค

์˜ค๋Š˜๋‚  ๋Œ€๋ถ€๋ถ„์˜ ์›น ๊ฐœ๋ฐœ์ž์™€ ๋Œ€๋ถ€๋ถ„์˜ ํšŒ์‚ฌ๋Š” _๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ_๋ฅผ RESTful API๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ์•„๋งˆ๋„ ์ฒซ ๋ฒˆ์งธ ์‘๋‹ต์„ _API ์‘๋‹ต_์œผ๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ์ € HTML์ผ ๋ฟ์ด์ฃ !

(๋ถˆ์Œํ•œ HTML, ์กด์ค‘๋ฐ›์„ ์ˆ˜ ์—†๊ตฐ์š”.)

API๋Š” ํ•ญ์ƒ JSON์ด๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ์ข€ ๋” ๊ณ ๊ธ‰์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ Protobuf ๊ฐ™์€ ๊ฒƒ์ด์ฃ , ๋งž๋‚˜์š”?

You are wrong

ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘ ํ‹€๋ ธ๊ณ , ๋ถ€๋„๋Ÿฌ์›Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์‘๋‹ต์€ _API ์‘๋‹ต_์ด๋ฉฐ, ์‹ค์ œ๋กœ RESTfulํ•œ ์‘๋‹ต์ž…๋‹ˆ๋‹ค!

๋‘ ๋ฒˆ์งธ ์‘๋‹ต์€ ์‹ค์ œ๋กœ ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ(RPC) ์Šคํƒ€์ผ์˜ API์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” Fielding์ด 2008๋…„์— ๋ถˆํ‰ํ–ˆ๋˜ SocialSite API์™€ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค: ํด๋ผ์ด์–ธํŠธ๋Š” JSON ์‘๋‹ต ์ž์ฒด ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ์†Œ์Šค์—์„œ ํŒŒ์ƒ๋œ ๋ฆฌ์†Œ์Šค์™€ ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด API๋Š” ์ •์‹ ์ ์œผ๋กœ REST์˜ ๊ฑฐ์˜ ๋ฐ˜๋Œ€์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด ์Šคํƒ€์ผ์˜ API๋ฅผ โ€œRESTlessโ€œ๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

#โ€œRESTโ€œ๊ฐ€ โ€œ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 ํ‘œ์ค€์ด ๋‚˜์™”์œผ๋‹ˆ, ๊ทธ๊ฒŒ ์ ํ•ฉํ•œ ๊ฒƒ์ผ๊นŒ์š”?

#์›น ์„œ๋น„์Šค์— REST๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ์„๊นŒ?

์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ Fielding์ด ์„ค๋ช…ํ•œ ์›น์˜ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ธ์ง€ํ•˜๊ณ , SOAP ๋Œ€์‹  REST๊ฐ€ โ€œ์›น ์„œ๋น„์Šคโ€œ๋กœ ๋ถˆ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•œ ๊ฒƒ์— ์ ‘๊ทผํ•˜๋Š” ์„ ํ˜ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๋ฌป๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›น์€ ๋งค์šฐ ์œ ์—ฐํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ž…์ฆ๋˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ธŒ๋ผ์šฐ์ €์™€ ์ธ๊ฐ„์—๊ฒŒ ์ž˜ ์ž‘๋™ํ–ˆ๋˜ ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ ์•„ํ‚คํ…์ฒ˜, ์ฆ‰ REST๊ฐ€ API์—๋„ ์ž˜ ๋งž์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๊ทธ๋Ÿด๋“ฏํ•˜๊ฒŒ ๋“ค๋ ธ์Šต๋‹ˆ๋‹ค, ํŠนํžˆ XML์ด API์˜ ํ˜•์‹์ด์—ˆ์„ ๋•Œ ๋”์šฑ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค: XML์€ ํ™•์‹คํžˆ HTML๊ณผ ๋งค์šฐ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค, ๊ทธ๋ ‡์ฃ ? XML API๊ฐ€ RESTful ์ œ์•ฝ ์กฐ๊ฑด, ํŠนํžˆ ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‚ฌ๋žŒ๋“ค์€ ์ด ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ์ผ์ด ๋ฒŒ์–ด์ง€๋Š” ๋™์•ˆ, ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ด ํƒ„์ƒ ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค: JSON

JSON์€ SOAP/RPC-XML์˜ ์ž๋ฐ”์™€ ๋น„๊ตํ•  ๋•Œ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค: ๋‹จ์ˆœํ•˜๊ณ , ๋™์ ์ด๋ฉฐ, ์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ JSON์ด ๋Œ€๋ถ€๋ถ„์˜ ์›น API์—์„œ ์ง€๋ฐฐ์ ์ธ ํ˜•์‹์ด ๋œ ๊ฒƒ์ด ๋ฏฟ๊ธฐ ์–ด๋ ค์šธ ์ •๋„๋กœ, ์‹ค์ œ๋กœ JSON์ด ์œ ํ–‰ํ•˜๋Š” ๋ฐ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. 2008๋…„๊นŒ์ง€๋„ API ๊ฐœ๋ฐœ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์ฃผ๋กœ XML์— ๊ด€ํ•œ ๊ฒƒ์ด์—ˆ๊ณ , JSON์— ๋Œ€ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

#REST API์˜ ๊ณต์‹ํ™”

2008๋…„์— Martin Fowler๋Š” Richardson Maturity Model์„ ๋Œ€์ค‘ํ™”ํ•œ ๊ธฐ์‚ฌ๋ฅผ ๋ฐœํ‘œํ–ˆ์œผ๋ฉฐ, ์ด ๋ชจ๋ธ์€ ์ฃผ์–ด์ง„ API๊ฐ€ ์–ผ๋งˆ๋‚˜ RESTfulํ•œ์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋ธ์€ ๋„ค ๊ฐ€์ง€ โ€œ๋ ˆ๋ฒจโ€œ์„ ์ œ์•ˆํ–ˆ์œผ๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ๋ ˆ๋ฒจ์€ โ€œPlain Old XMLโ€ ๋˜๋Š” โ€œThe Swamp of POXโ€œ๋กœ ๋ถˆ๋ ธ์Šต๋‹ˆ๋‹ค.

Richardson Maturity Model

๊ทธ ํ›„, API๋Š” ๋‹ค์Œ ์•„์ด๋””์–ด๋“ค์„ ์ฑ„ํƒํ•จ์— ๋”ฐ๋ผ ๋” โ€œ์„ฑ์ˆ™ํ•œโ€ REST API๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค:

๋ ˆ๋ฒจ 3์€ ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ณณ์œผ๋กœ, ์ด ๋ ˆ๋ฒจ์ด ๊ฐ€์žฅ ์„ฑ์ˆ™ํ•˜๊ณ  ์ง„์ •ํ•œ โ€œREST์˜ ์˜๊ด‘โ€œ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

#โ€œ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์˜€์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ํ˜„์žฌ์— ์ด๋ฅด๊ฒŒ ๋œ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

#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ํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์ €๋Š” ์ธํ„ฐ๋„ท์„ ์ง€๋ฃจํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค:

#์˜ค๋Š˜๋‚ ์˜ REST ์ƒํƒœ

๊ฒฐ๊ตญ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ 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 ๋ ˆ๋ฒจ 3 (HATEOAS)

๋”ฐ๋ผ์„œ GraphQL์€ REST๊ฐ€ ์•„๋‹ˆ๋ฉฐ, REST๊ฐ€ ๋˜๊ณ ์ž ํ•˜์ง€๋„ ์•Š๊ณ , REST๊ฐ€ ๋˜๋ ค๊ณ  ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜ค๋Š˜๋‚  ๋Œ€๋‹ค์ˆ˜์˜ ๊ฐœ๋ฐœ์ž์™€ ํšŒ์‚ฌ๋“ค์€ ์—ฌ์ „ํžˆ GraphQL ๊ธฐ๋Šฅ์„ API์— ์—ด์ •์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ๋„, ๊ทธ๋“ค์ด ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด REST๋ผ๊ณ  ๊ณ„์† ๋ถ€๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

#์ด ์ƒํ™ฉ์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ์š”?

๋ถˆํ–‰ํžˆ๋„, voidfunc์˜ ๋ง์ด ๋งž์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค:

์•„๋ฌด๋ฆฌ ํ‘œ์ง€ํŒ์„ ๋‘๋“œ๋ ค๋„ ์†Œ์šฉ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ ์ „์Ÿ์€ ์˜ค๋ž˜ ์ „์— ์กŒ์Šต๋‹ˆ๋‹ค. REST๋Š” ์‚ฌ๋žŒ๋“ค์ด HTTP+JSON RPC๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” RESTfulํ•˜์ง€ ์•Š์€ JSON API๋ฅผ ๊ณ„์† REST๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ด์ œ๋Š” ๋ชจ๋‘๊ฐ€ ๋ถ€๋ฅด๋Š” ๋ช…์นญ์ด๋‹ˆ๊นŒ์š”.

์ œ๊ฐ€ ์ ์  ๋” ์—ด์‹ฌํžˆ ํ‘œ์ง€ํŒ์„ ๋‘๋“œ๋ฆฌ๋”๋ผ๋„, 50๋…„ ํ›„์—๋„ Global Omni Corp.๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋“ค์˜ RESTful JSON API์˜ swagger ๋ฌธ์„œ ์ž‘์—…์„ ์œ„ํ•œ ์ผ์ž๋ฆฌ๋ฅผ ๊ด‘๊ณ ํ•˜๊ณ  ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Roy Fielding์€ ์Šน์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์ƒํ™ฉ์€ ์ ˆ๋ง์ ์ด์ง€๋งŒ, ์‹ฌ๊ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , REST๋ฅผ ์„ค๋ช…ํ•  ๊ธฐํšŒ๋Š” ์—ฌ์ „ํžˆ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค ๊ฐœ๋…์„ ์›๋ž˜์˜ ๋งฅ๋ฝ์—์„œ ๋“ค์–ด๋ณธ ์ ์ด ์—†๊ณ , REST๊ฐ€ JSON API์™€ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ์ƒˆ๋กœ์šด ์„ธ๋Œ€์˜ ์›น ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์€ ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ REST, ์ง„์ •ํ•œ ์‹ค์ œ REST, RESTless๊ฐ€ ์•„๋‹Œ REST๊ฐ€ ๊ทธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ REST์˜ ์•„์ด๋””์–ด๋Š” ํฅ๋ฏธ๋กญ๊ณ , ์ผ๋ฐ˜์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง ์ง€์‹์œผ๋กœ์„œ ์•Œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ๋” ํฐ ๋ฉ”ํƒ€ํฌ์ธํŠธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค: ์ƒ๋Œ€์ ์œผ๋กœ ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ๋“ค(์ดˆ๊ธฐ ์›น ๊ฐœ๋ฐœ์ž๋“ค), ์ธํ„ฐ๋„ท์˜ ํ˜œํƒ์„ ๋ˆ„๋ฆฌ๋ฉฐ, REST๋ผ๋Š” ์šฉ์–ด์— ๋Œ€ํ•œ ๊ฝค ๋ช…ํ™•ํ•œ(๋•Œ๋•Œ๋กœ ํ•™๋ฌธ์ ์ธ) ์‚ฌ์–‘์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ด๋“ค๋„ 20๋…„ ๋™์•ˆ ๊ทธ ์˜๋ฏธ๋ฅผ ์›๋ž˜์˜ ์˜๋ฏธ์™€ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์—†์—ˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ดํ† ๋ก ๋ช…๋ฐฑํ•˜๊ฒŒ ์ž˜๋ชป๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ๋ฌด์—‡์„ ์ž˜๋ชป ์ƒ๊ฐํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

</>