Hypermedia Clients

Carson Gross

์ข…์ข…, ์šฐ๋ฆฌ๋Š” 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๋ฅผ ๋” ์ •๊ตํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ •๋ณด์˜ ๋ ˆ์ด์•„์›ƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค: ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ ํ•„๋“œ๋ฅผ ๊ฐ•์กฐํ•˜๊ฑฐ๋‚˜ ์ˆจ๊ฒจ์•ผ ํ•œ๋‹ค๋Š” ์ง€์‹œ์‚ฌํ•ญ ๋“ฑ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ด์•ผ๊ธฐ์˜ ์ผ๋ถ€๋ถ„์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด 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์™€ ๊ฐ™์€ ๊ธฐ์ˆ ์ด ๋งค์šฐ ์ธ์ƒ์ ์ด๊ณ  ํŠน๋ณ„ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. Hyperview๋Š” ๋ชจ๋ฐ”์ผ ์นœํ™”์ ์ธ ์ƒˆ๋กœ์šด ํ•˜์ดํผ๋ฏธ๋””์–ด, HXML์— ๋Œ€ํ•œ ๋ช…์„ธ๋ฅผ ์ œ๊ณตํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, HXML์„ ์ดํ•ดํ•˜๊ณ  ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ดํผ๋ฏธ๋””์–ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†์—ˆ๋‹ค๋ฉด, Hyperview๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ JSON๊ณผ ๊ฐ™์€ ๋˜ ๋‹ค๋ฅธ ์ด๋ก ์ƒ์˜ ํ•˜์ดํผ๋ฏธ๋””์–ด์— ๋ถˆ๊ณผํ•  ๊ฒƒ์ด๋ฉฐ, ๊ฐ•๋ ฅํ•˜๊ณ  ์‹ค์šฉ์ ์ธ ์™„์ „ํ•œ RESTful ํ•˜์ดํผ๋ฏธ๋””์–ด ์†”๋ฃจ์…˜์€ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ดํผ๋ฏธ๋””์–ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด๋Š” ์ž์ „๊ฑฐ๊ฐ€ ์—†๋Š” ๋ฌผ๊ณ ๊ธฐ์™€ ๊ฐ™์œผ๋ฉฐ, ์ž์ „๊ฑฐ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

#๊ฒฐ๋ก 

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

์ด์ œ๋Š” ๋งŽ์€ ์ด๋Ÿฌํ•œ ๋…ผ์˜๊ฐ€ ๋ง๋ณด๋‹ค ์•ž์„œ ๋‚˜๊ฐ”๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค: RESTful ํ•˜์ดํผ๋ฏธ๋””์–ด API๊ฐ€ ์œ ์šฉํ•˜๋ ค๋ฉด, ์ œ๋Œ€๋กœ ๋œ ํ•˜์ดํผ๋ฏธ๋””์–ด ํด๋ผ์ด์–ธํŠธ์— ์˜ํ•ด ์†Œ๋น„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๊ฒฐ๊ตญ ํ•˜์ดํผ๋ฏธ๋””์–ด ์ปจํŠธ๋กค์€ ํŠน์ • ๋„๋ฉ”์ธ์˜ ๋‘๊บผ์šด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‚ญ๋น„๋  ๋ฟ์ž…๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€, ํ•˜์ดํผ๋ฏธ๋””์–ด API๊ฐ€ ์ •๋ง๋กœ ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด ์ •๋ณด๋ฅผ ๋งŽ์ด ํฌํ•จํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. โ€œLevel 3โ€œ์˜ Richardson ์„ฑ์ˆ™๋„ ๋ชจ๋ธ, ์ฆ‰ ํ•˜์ดํผ๋ฏธ๋””์–ด ์ปจํŠธ๋กค๋งŒ์œผ๋กœ๋Š” โ€œREST์˜ ์˜๊ด‘โ€œ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ, ํ•˜์ดํผ๋ฏธ๋””์–ด API๋ฅผ ์‹ค์ œ๋กœ ์ž‘๋™์‹œํ‚ค๋ ค๋ฉด ์‹ค์šฉ์ ์ธ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ๋ฒจ ๊ธฐ์ˆ ์„ ๋งŽ์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๊ฒƒ์„ ์†Œ๋น„ํ•  ์ œ๋Œ€๋กœ ๋œ ํ•˜์ดํผ๋ฏธ๋””์–ด ํด๋ผ์ด์–ธํŠธ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ HATEOAS๋Š” ์ธ๊ฐ„์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์ด๋Ÿฌํ•œ ๊ฐœ๋…์ด ํƒœ๋™ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ, ๊ทธ ๋‹น์‹œ์—๋Š” ํด๋ผ์ด์–ธํŠธ/์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ผ๋งˆ๋‚˜ ํŠน๋ณ„ํ•œ์ง€ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

REST๋Š” ๋‹จ์ˆœํžˆ API์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. Roy Fielding์ด ๊ทธ์˜ ๋…ผ๋ฌธ์—์„œ ๋ถ„๋ช…ํžˆ ๋ฐํžŒ ๊ฒƒ์ฒ˜๋Ÿผ, ๊ทธ๊ฒƒ์€ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค.

Mike์™€ ๊ฐ™์€ ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์„ ์ œ์™ธํ•˜๊ณ ๋Š”, ์šฐ๋ฆฌ๋Š” REST ์ด์•ผ๊ธฐ์— ๋Œ€ํ•œ ๋” ํฐ ๋ถ€๋ถ„(์‚ฌ์‹ค์€ ํ›จ์”ฌ ๋” ํฐ ๋ถ€๋ถ„)์„ ๋ฌด์‹œํ•ด ์™”์Šต๋‹ˆ๋‹ค.

Creating A Hypermedia Client Is Hard Joke
</>