๋ค์ด๊ฐ๋ฉฐ
Self-Descriptive ๋ ๋ง ๊ทธ๋๋ก ๋ฉ์์ง๊ฐ ์ค์ค๋ก ์ค๋ช ์ด ๋์ด์ผ ํ๋ค๋ ๋ป์ด๋ค. ์๋ต ๋ฉ์์ง์ ์์๋ง ๋ณด๊ณ ๊ทธ ๋ป์ ์ ์ ์์ด์ผ ํ๋ค. ๋ง์ฝ ์๋ฒ์ API ๊ฐ ๋ณ๊ฒฝ๋๊ฑฐ๋ URI ๊ฐ ๋ณ๊ฒฝ๋๋ ๋ฑ ๊ธฐ๋ฅ์ด ์์ ๋๋ค ํ๋๋ผ๋ ํด๋ผ์ด์ธํธ๋ ๋ฌธ์ ์์ด ๋์๊ฐ์ผ ํ๋ค. ์ด๋ด ๋ ์๋ก์๋ก Self-Descriptive messages ๋ฅผ ํ์ฉํ๋ค๋ฉด ๊ฐ๋ฐ์๊ฐ ์์ฒญ์ ์๋ฏธ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์ด ์ดํด๋๋ฅผ ๋์ผ ์ ์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก REST API ๋ฅผ ๊ตฌํํ๋๋ฐ Self-Descriptive ๋ API ์ ์ดํด๋, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค.
Self Descriptive
RESTful ์ํคํ ์ฒ์ ์ ์ฝ์ฌํญ ์ค ํ๋๋ก, ํด๋ผ์ด์ธํธ๊ฐ ์ถ๊ฐ์ ์ธ ๋ฌธ์ ์์ด๋ ์๋ต ๋ฉ์์ง๋ง ๋ณด๊ณ ๊ทธ ์๋ฏธ๋ฅผ ์ดํดํ ์ ์๋๋ก ํ๋ ๊ฐ๋ ์ด๋ค. ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ง์กฑํ ์ ์๋ค.
โ HTTP ์ํ ์ฝ๋ ํ์ฉ : ์ผ๋ฐ์ ์ธ ์น ๊ฐ๋ฐ์ ํ๋ค๋ฉด ์ง์ผ์ง๋ ๋ด์ฉ์ด๋ค.
โ Content-Type ๋ฐ Accept ํค๋ ํ์ฉ : Content-Type ์ ์๋ตํ body ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
HTTP/1.1 200 OK
Content-Type: application/json
[ { "id": "example123", "name": "ํ๊ธธ๋" } ]
์ฌ๊ธฐ๊น์ง๋ ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋งโฆ ์ ์์๋ฅผ ์์ธํ ์ดํด๋ณด๋ฉด id, name ์ด ๋ฌด์์ ์๋ฏธํ๋๊ฐ์ ๋ํ ํด์ค์ ์๋ค. ์ด ๊ฒฝ์ฐ Self Descriptive ์ ์๋ฐฐ๋๋ค ๋ณผ ์ ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณผ ์ ์๋ค.
๋ฐฉ๋ฒ 1. media-type ์ ์
IANA ์ ๋ฏธ๋์ด ํ์ ์ ๋ฑ๋กํ ์ ์๋ค. id ๊ฐ ๋ฌด์์ด๊ณ name ์ด ๋ฌด์์ธ์ง ์ ์ํ์ฌ ๋ฑ๋กํ๋ฉด ๋๊ณ , ์ด ๋ฉ์์ง๋ฅผ ๋ฐ๋ ์ฌ๋์ ๋ช ์ธ๋ฅผ ์ฐพ์๊ฐ ์ ์์ผ๋ฏ๋ก ์๋ฏธ๋ฅผ ์จ์ ํ ํด์ํ ์ ์๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ ๋งค๋ฒ media type ์ ์ ์ํ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ผ ํ ์ ์๋ค โฆ
๋ฐฉ๋ฒ 2. profile ๋งํฌ ํค๋
id, name ์ด ๋ฌด์์ธ์ง ์ ์ํ ๋ฌธ์๋ฅผ ์์ฑํ์ฌ Link ํค๋์ profile relation ์ผ๋ก ํด๋น ๋ช ์ธ๋ฅผ ๋งํฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๊ฐ Link ํค๋์ profile ์ ์ดํดํด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ profile ๋งํฌ ํค๋๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ์ง ์๋๋ค๊ณ ํ๋ค (!!!)
๋ฐฉ๋ฒ 3. HAL ์ ๋งํฌ ๋ฐ์ดํฐ์ profile ๋งํฌ ํค๋ ์ถ๊ฐ
๋งค๋ฒ media type ์ ์ ์ํ๋ ๊ฒ ๋ฒ๊ฑฐ๋กญ๊ณ , profile ๋งํฌ ํค๋๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ HAL(Hypertext Application Language)์ ๋ช ์ธ์ ๋งํฌ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ถ์ฒํ๋ค. ์ด๋ฅผ HATEOAS ๋ผ๊ณ ํ๋๋ฐโฆ
HATEOAS (hypermedia as the engine of application state)
ํ์ฌ์ URI ์์ ๋ค์์ผ๋ก ์ ์ด๋ ์ ์๋ URI ๋ฅผ ํ์ํด์ฃผ๋ ๊ฒ์ ๋งํ๋ค. ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ๋ฐํ๋ ์ฌ๋๋ค์ด ํน์ ๋ฉ์๋๋ก๋ถํฐ ์ฌ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง๊ณ , API ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ๊ธฐ์กด์ ๋งํฌ๋ฅผ ํตํด ์๋ก์ด ์๋ํฌ์ธํธ๋ฅผ ์ฐพ์์ ์์ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ ์ธก ์ฝ๋๋ฅผ ์์ ํ ์ผ์ด ์ ์ด์ง๋ค.
์์๋ฅผ ํตํด ์์๋ณด์.
< HTML ์ ๊ฒฝ์ฐ >
#์์
GET / todos HTTP/1.1
Host: example.org
HTTP/1.1 200 OK
Content-Type : text/html
<html>
<body>
<a href="https://todos/1"> ํ์ฌ ๊ฐ๊ธฐ</a>
<a href="https://todos/2"> ์ง์ ๊ฐ๊ธฐ</a>
<body>
<html>
โ Self-Descriptive : ๋ชจ๋ ํ๊ทธ๋ ํด์ ๋ฐฉ๋ฒ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ฐพ์ ์ ์๊ณ , ํํธ๋ง์ ๋จ์๋ก ํด์ํ ์ ์๋ค.
โ HATEOAS : a ํ๊ทธ๋ฅผ ํตํด ๋ค์์ผ๋ก ์ ์ด๋ ํ์ด์ง๋ฅผ ๋ช ์ํจ.
< JSON ์ ๊ฒฝ์ฐ >
GET / todos HTTP/1.1
Host:L exampele.org
HTTP/1.1 200 OK
Content-Type: application/json
[
{"id": 1, "title": "ํ์ฌ ๊ฐ๊ธฐ"},
{"id": 2, "title": "์ง์ ๊ฐ๊ธฐ"},
]
โ Self-Descriptive : id ๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง, title ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ ๊ธธ์ด ์์.
โ HATEOAS : ๋ค์์ผ๋ก ์ ์ด๋ ํ์ด์ง๊ฐ ๋ฌด์์ธ์ง ๋ช ์๋์ด ์์ง ์์.
๐ ์ฐธ๊ณ ์๋ฃ