REST API๋ฅผ ๋ง๋ ์ฅ๋ณธ์ธ Fielding์ 2008๋ ์ REST APIs must be hypertext-driven ๋ผ๋ ๊ธ์ ์์ฑํ๋ค. ํด๋น ๊ธ์ ๋ด์ฉ์ ๋ณด๋ฉด Fielding์ด ์ค๊ณํ REST API๋ ๋ค์์ ๊ท์น์ ๋ฐ๋ผ์ผํ๋ค.
- ์์์ ์๋ณ์์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๊ตฌ๋ถ๋์ด์ผ ํ๋ค.
- ํ์ค ํ๋กํ ์ฝ์ ์๋ ๊ทธ๋๋ก ์จ๋ผ.
- API ๋ฌธ์์ URL ๋ชฉ๋ก์ ๋์ดํ์ง ๋ง๋ผ. ๋์ , ์๋ต ํํ๋ฅผ ์ ์ ์ํด๋ผ.
- ๊ณ ์ ๋ ์์ ์ด๋ฆ, ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง๋ง๋ผ.
- ํ์ ์ด ์ง์ ๋ ์์์ ๊ฐ์ง์ง ๋ง๋ผ.
- ์ฌ์ ์ง์์์ด ์ง์ ํ ์ ์๊ฒ ํ๋ผ.
์ด๋ฌํ ๊ท์น์ ๋ฐ๋ฅด์ง ์์๊ฑฐ๋ฉด REST API๋ผ ๋ถ๋ฅด์ง๋ ๋ง๊ณ , ๋ค๋ฅธ ์ ํ์ด๋ฅผ ๊ณจ๋ผ ์ฐ๋ผ๋ ๋ง๊น์ง ํ ์ ๋๋ก REST API์ ํต์ฌ์ด๋ผ๊ณ ๊ฐ์กฐํ๊ณ ์๋ค. ๋๋์ฒด ์ด๋ค ๋ด์ฉ์ด๊ธธ๋ Fielding์ด ์ด๋ ๊ฒ๊น์ง ํ๊ฐ ๋ฌ๋์ง ์ข ๋ ์์ธํ ์์๋ณด์.
Fielding์ REST API
1. ์์์ ์๋ณ์์ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๊ตฌ๋ถ๋์ด์ผ ํ๋ค.
์ฐ๋ฆฌ๋ ๋ณดํต ์๋ฒ์ REST API๋ฅผ ์ค๊ณํ ๋ ๋ค์๊ณผ ๊ฐ์ด HTTP ๋ฉ์๋์ ์์์ ํด๋นํ๋ URL์ ๊ณตํต์ ์ผ๋ก ์ ์ํ์ฌ ์ ๊ทผ ๊ฒฝ๋ก๋ฅผ ์ด์ด๋๊ณ ์๋ค.
GET /orders/{id}
ํ์ง๋ง, Fielding์ ์ด๋ ๊ฒ ํ์ง ๋ง๋ผ๊ณ ๋งํ๋ค. ์์์ ์๋ณํ๋ ๊ฒ๊ณผ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ๋ถํ๋ผ๊ณ ํ๋ค. ์ฆ, /orders/{id}์ HTTP๋ผ๋ ์ ๊ทผ ํ๋กํ ์ฝ์ ๊ตฌ๋ถํ๋ผ๋ ๊ฒ์ด๋ค. ์๋ํ๋ฉด ์์์ ์๋ณํ๋ ๊ฒฝ๋ก๋ ํ๋์ง๋ง ์ ๊ทผํ๋ ํ๋กํ ์ฝ์ ์ฌ๋ฌ๊ฐ์ง ์ผ ์ ์๊ณ , ๊ฐ์ ์์์ด๋ผ๋ Accept ํค๋์ ๋ฐ๋ผ JSON, XML, HTML ๋ฑ ๋ค๋ฅธ ํํ๋ก ํํ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
http://api.example.com/orders/42
https://api.example.com/orders/42
ftp://api.example.com/orders/42
2. ํ์ค ํ๋กํ ์ฝ์ ์๋ ๊ทธ๋๋ก ์จ๋ผ.
์ด๋ค API๋ฅผ ๋ง๋ค๋ ํ์ค ํ๋กํ ์ฝ์ ๋ณํํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ด์ผ ํ๋ค๋ ์ด์ผ๊ธฐ์ด๋ค. ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ์ ์ทจ์ํ๋ API๋ฅผ ์ค๊ณํ๋ ค๊ณ ํ๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ด ์ค๊ณ๋ฅผ ํ๋ค๊ณ ํ์.
POST /orders/{id}
Custom-Action: CANCEL
์ด๊ฑด ์๋ฒ์์ HTTP ํค๋์ ์ปค์คํ
ํค๋๋ฅผ ์ง์ ํ์ฌ CANCEL์ด๋ผ๋ ํ๋์ ๋ํ๋ธ๋ค. ์ด๋ ํ์ค ํ๋กํ ์ฝ์ด ์๋ ๋ณธ์ธ๋ง์ ํ๋กํ ์ฝ์ ์ถ๊ฐํ ๊ผด์ด ๋๋ฏ๋ก ์ด๋ฅผ ์ดํดํ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ง ํต์ ์ ํ ์ ์๊ฒ ๋๋ค. ๊ทธ๋์ ์ด๋ ๊ฒ ์ค๊ณํ์ง ๋ง๊ณ ์๋์ ๊ฐ์ด ํ์ค์ ์ฌ์ฉํ๋ผ๋ ๊ฒ์ด๋ค.
DELETE /orders/{id}
3. API ๋ฌธ์์ URL ๋ชฉ๋ก์ ๋์ดํ์ง ๋ง๋ผ. ๋์ , ์๋ต ํํ๋ฅผ ์ ์ ์ํด๋ผ.

๋ณดํต ์ด๋ ๊ฒ API ๋ฌธ์๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ์์ผ๋ก ์๋ฒ-ํด๋ผ์ด์ธํธ ๊ฐ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ํธ์์ฉ ํด์ผํ๋์ง ์๋ ค ์ฃผ์์ ๊ฒ์ด๋ค. ํ์ง๋ง, Fielding์ API ๋ฌธ์์ ๋ชฉ๋ก์ ์ฌ์ฉํ๋ ๋์ ์ ์๋ต์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง๋ฅผ ์ ์ํ๋๋ฐ ๋
ธ๋ ฅ์ ์์ผ๋ผ๊ณ ํ๋ค.
{
"orderId": 42,
"status": "PAID",
"links": [
{ "rel": "cancel", "href": "/orders/42", "method": "DELETE" },
{ "rel": "refund", "href": "/orders/42/refund", "method": "POST" }
]
}
์ด๋ ๊ฒ ์๋ต ์์ฒด์ ๋ค์ ํ๋์ผ๋ก ๋ฌด์์ ํ ์ ์๋์ง๋ฅผ ์ ์ํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ๋ฌธ์ ์์ด๋ ์๋ต๋ง์ผ๋ก ๋ค์ ํ๋์ ๊ฒฐ์ ํ ์ ์๋๋ก ํ๋ผ๋ ๊ฒ์ด๋ค.
4. ๊ณ ์ ๋ ์์ ์ด๋ฆ, ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง๋ง๋ผ.
์ฐ๋ฆฌ๋ ๋ณดํต ์๋ฒ์์ ์ด๋ค API๋ฅผ ๋ง๋ค๊ณ , ํด๋ผ์ด์ธํธ๋ ์ด API์ URL์ ํ๋์ฝ๋ฉํ์ฌ ์ํธ์์ฉํ๋๋ก ๋ง๋ ๋ค.
restTemplate.getForObject("/api/v2/orders/42/items", Item.class);
ํ์ง๋ง, ์ฌ๊ธฐ์ ์๋ฒ๊ฐ ์ ๊ทผ ๊ฒฝ๋ก๋ฅผ /api/v3/orders/42/items๋ก ๋ณ๊ฒฝํ๋ค๋ฉด ํด๋ผ์ด์ธํธ๋ ์ด์ ์ํฅ์ ๋ฐ์ ์ ๋ฐ์ ์๋ค. ๊ทธ๋์ ํด๋ผ์ด์ธํธ๊ฐ ๊ณ ์ ๋ ์์ ์ด๋ฆ๊ณผ ๊ณ์ธต์ ๊ฒฐํฉ๋์ง ์๋๋ก ์ค๊ณ๋ฅผ ํ๋ผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ ํ์์ผ๋ก ์๋ต ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ์ ์๋ค.
{
"orderId": 42,
"links": [
{ "rel": "items", "href": "/api/v2/orders/42/items" }
]
}
์ด๋ ๊ฒ ๋๋ฉด ํด๋ผ์ด์ธํธ๋ "rel"์ ํด๋นํ๋ items๋ง ์ฐธ์กฐํ๋ฉด ๋ค์ ์ ๊ทผ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๊ณ , ์ด๋ ์๋ฒ๊ฐ ์ ๊ทผ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํด๋ rel์ด ๋ฐ๋์ง ์๋ ์ด์ ํด๋ผ์ด์ธํธ์๊ฒ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
5. ํ์ ์ด ์ง์ ๋ ์์์ ๊ฐ์ง์ง ๋ง๋ผ.
๋ณดํต ์์ฒญ/์๋ต์ ๊ณผ์ ์์ ์ฐ๋ฆฌ๋ ์ด๋ค ํ์ ์ผ๋ก ๋ณํํด์ผ ํ ์ง ์ด๋ฏธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ต๊ฐ์ ๋ฐ์ ๋ ๋ค์๊ณผ ๊ฐ์ด ํ์ ์ ๋ฏธ๋ฆฌ ์ง์ ํด์ ์ญ์ง๋ ฌํ ํ ์ ์๋๋ก ํ๋ค.
Order order = restTemplate.getForObject("/orders/42", Order.class);
ํ์ง๋ง, Fielding์ ์ด๋ ๊ฒ ํ์
์ ์ง์ ํ๋ฉด ์๋ฒ์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์์กดํ๊ฒ ๋๊ณ ์๋ฒ์ ๋ณ๊ฒฝ์ด ๊ณง ํด๋ผ์ด์ธํธ์ ๋ณ๊ฒฝ์ผ๋ก ์ด์ด์ง๋ค๋๊ฑธ ๊ฐ์กฐํ๋ค. ๊ทธ๋์ ๋ค์๊ณผ ๊ฐ์ด ํ์
์ ๋ถ๋ฆฌ๋ฅผ ํ๋ผ๊ณ ๋งํ๋ค.
public class Resource {
private Map<String, Object> data;
private List<Link> links;
}
Resource resource = restTemplate.getForObject(someLink, Resource.class);
์์๋ก Resource๋ผ๋ ํ์
์ ์ ์ํ๊ณ ์ฌ๊ธฐ์๋ ์ด๋ ํ ์์กด ๊ฐ์ฒด๋ ์์ด ๋จ์ํ ๋ฐ์ดํฐ์ ์ด๋ค ๋งํฌ๋ง ์กด์ฌํ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฒ์์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํด๋ Resource์์ ๋ณ๊ฒฝ๋๋ ์ง์ ์ด ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์๊ฒ ์ํฅ์ ๋ผ์น์ง ์๋๋ค.
๋ค๋ง ์ด ๋ฐฉ์์๋ ํ๊ณ๊ฐ ์๋ค. ํด๋ผ์ด์ธํธ๋ ๊ฒฐ๊ตญ data.get("orderId") ์ฒ๋ผ ํค ์ด๋ฆ์ ๋ํ ์ฌ์ ์ง์์ด ํ์ํ๋ค. Fielding์ ์ด๋ฅผ Self-descriptive messages(์๊ธฐ ์์ ์ ๋ฉ์์ง)๋ก ํด๊ฒฐํ๋ ค ํ๋ค.
์๋ต์ Content-Type์ application/vnd.example.order+json ๊ฐ์ ์ปค์คํ
๋ฏธ๋์ด ํ์
์ ๋ช
์ํ์ฌ, "์ด ์๋ต์ ์ด๋ฐ ๋ช
์ธ๋ฅผ ๋ฐ๋ฅธ๋ค"๋ฅผ ์๋ต ์์ฒด๊ฐ ์ค๋ช
ํ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค. application/json์ด RFC 8259๋ผ๋ ํ์ค ๋ฌธ์์ "JSON์ ์ด๋ฐ ํํ๋ค"๋ผ๊ณ ์ ์๋์ด ์๋ฏ์ด, application/vnd.example.order+json๋ "์ด ๋ฏธ๋์ด ํ์
์ ์๋ต์ orderId, status ๊ฐ์ ํ๋๋ฅผ ํฌํจํ๋ค"๋ ๋ช
์ธ๋ฅผ ๋ง๋ค์ด์ ๊ณต๊ฐํด์ผ ํ๋ค.
6. ์ฌ์ ์ง์์์ด ์ง์ ํ ์ ์๊ฒ ํ๋ผ.
๋ง์ง๋ง ๊ท์น์ ์ง๊ธ๊น์ง ๋์จ ๋ด์ฉ๋ค์ ๋ชจ๋ ์ข
ํฉํ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ํํ ํ๋ ๋ฐฉ์์ฒ๋ผ API ๋ฌธ์์ ๊ฐ์๊ฑธ ์ ๊ณตํ์ง ์์๋ ๋จ ํ๋ฒ์ ๋ฃจํธ URL ์ ๊ทผ์ผ๋ก ๋ชจ๋ ์์์ ์ ๊ทผ ๊ฒฝ๋ก๋ฅผ ๊ฐ ๊ฒฝ๋ก๋ง๋ค์ ์๋ต์ผ๋ก ํ์
ํ ์ ์์ด์ผ ํ๋ค๋ ๋ป์ด๋ค.
์ฆ, ํด๋ผ์ด์ธํธ๊ฐ `https://api.example.com`์ ๊ฐ์ ๊ฒฝ๋ก๋ก ์ ๊ทผํ๋ฉด ์ดํ์ ๋ชจ๋ ๊ฒฝ๋ก๋ ์๋ต์ ํฌํจ๋ links์์ ์ฐพ์ ๋๋จธ์ง๋ฅผ ์ ๊ทผํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ ๋ฆฌ
์ง๊ธ๊น์ง REST API ์๋ฒ์ง Fielding์ด ์ฃผ์ฅํ ์ง์ง REST API์ ๋ํด์ ์ดํด๋ณด์๋ค. ์ฃผ์ฅํ๋ ๊ท์น๋ค์ ๋ณด๋ค๋ณด๋ฉด ํ ๊ฐ์ง ๊ณตํต์ ์ธ ํน์ง์ ๋ฐ๊ฒฌํ ์ ์๋๋ฐ, ๋ฐ๋ก ์ถ์ํ์ด๋ค.
๊ฐ์ฒด์งํฅ์์ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ๋ถ๋ถ์ ์ถ์ํ์ ๋์์ผ๋ก ๋ณด๋ฏ์ด, Fielding์ ์๋ฒ์์ ๋ณ๊ฒฝ์ ์ทจ์ฝํ ๋ถ๋ถ๋ค์ธ ๊ตฌ์ฒด์ ์ธ URL ๊ตฌ์กฐ, ๋๋ฉ์ธ ํ์
, ํ๋กํ ์ฝ์ ์์กดํ์ง ๋ง๊ณ ์๋ต์ด ์ ๊ณตํ๋ ๋งํฌ๋ผ๋ ์ถ์ํ์ ์์กดํ๋ผ๊ณ ๋งํ๊ณ ์๋ค.
ํ๋์ REST API
ํ์ค๊ณผ์ ๊ดด๋ฆฌ
์ง๊ธ๊น์ง์ REST API ๊ท์น์ ๋ณด๋ฉด, ํ์ฌ ๋ณดํธ์ ์ผ๋ก ๋งํ๊ณ ๊ตฌํํ๊ณ ์๋ REST API์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ค๋ ๊ฒ์ ๋๊ผ์ ๊ฒ์ด๋ค. ๋๋ถ๋ถ์ ์๋ฒ๋ API ๋ฌธ์๋ฅผ ์ ๊ณตํ๊ณ ์๊ณ , ํด๋ผ์ด์ธํธ๋ ์ด๋ฌํ ์์ ์ ๊ทผ ๊ฒฝ๋ก ๋ฐ ๊ณ์ธต์ ํ๋์ฝ๋ฉํด์ ์์ฒญ/์๋ต์ ๊ณผ์ ์ ๊ฑฐ์น๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์๋ชป๋ REST API๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ผ๊น? Fielding์ ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๊ทธ๋ ๋ค. ์ฐ๋ฆฌ๋ REST API๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ํ์ค์์ ๊ทธ ๊ท์น์ ๋ค ์งํค์ง ์๋ ๋ฐ๋ ์ด์ ๊ฐ ์๋ค.
์ ์งํค์ง ์์๊น?
๊ธฐ์กด์ ์ค๊ณ ๋ฐฉ์๋ ์ถฉ๋ถํ REST API์ ์กฐ๊ฑด์ ์ผ๋ถ ๋ง์กฑํ๊ณ ์์ง๋ง, ์ด๋ก ์ ์ธ REST๋ฅผ ๋ชจ๋ ์งํค๊ธฐ ์ํด์๋ ๊ฒฐ๋ก ์ ์ผ๋ก๋ HATEOAS๋ฅผ ์ง์ผ ๊ฐ๋ฐํด์ผ ํ๋ค.
HATEOAS
HATEOAS๋ Hypermedia As The Engine Of Application State์ ์ฝ์๋ก ์์์ ์ค๋ช
ํ๋ 3, 4, 6๋ฒ์ ๋ชจ๋ ํฌํจํ๋ ๊ฐ๋
์ด๋ค. ์ฆ, ๋ฆฌ์์ค์ ๋ํ ํ์ฌ ์ํ์ ํจ๊ป ๋ฆฌ์์ค๊ฐ ์ ์ด๋ ์ ์๋ ์ํ๋ฅผ ํฌํจํ๋ ๊ฒ์ด๋ค.
์๊น ์์ ๋ก ๋ค์๋ ์๋ต์ ๋ค์๋ณด๋ฉด ๋ฌด์จ ๋ง์ธ์ง ๊ฐ์ด ์ฌ ๊ฒ์ด๋ค.
{
"orderId": 42,
"status": "PAID",
"links": [
{ "rel": "cancel", "href": "/orders/42", "method": "DELETE" },
{ "rel": "refund", "href": "/orders/42/refund", "method": "POST" }
]
}
์ฌ๊ธฐ์ ๋ณด๋ฉด ํ์ฌ, orderId๊ฐ 42์ธ ์ฃผ๋ฌธ์ ๋ํ ์ํ๊ฐ "PAID"์์ ์ ์ํ๊ณ ์๊ณ ๋ค์์ผ๋ก ์ ์ด ๊ฐ๋ฅํ ์ํ๋ก๋ links์ ํฌํจ๋ cancel, refund๊ฐ ์๋ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ๋ ๋ ์ด์ ๊ตฌ์ฒด์ ์ธ URL์ด ์๋ rel์ ํฌํจ๋ ์ถ์ํ ๋ ํํ๋ก ๊ฐ ์์์ ์ํ๋ฅผ ์กฐ์ํ ์ ์๊ฒ ๋๋ค.
ํ์ง๋ง ๋๋ถ๋ถ์ API๋ HATEOAS๊น์ง๋ ๊ตฌํํ์ง ์๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๋ฐ ๋น์ฉ์ด ํฌ๋ค.
๋ชจ๋ ์๋ต์ "์ง๊ธ ์ํ์์ ๊ฐ๋ฅํ ํ์"๋ฅผ ํฌํจ์์ผ ์๋ต์ ๋ง๋ค๊ฒ ๋๋ฉด, ์๋ฒ๋ ๋งค ์๋ต๋ง๋ค ํ์ฌ ์ํ์ ์ ์ ํ ๋งํฌ๋ฅผ ๋์ ์ผ๋ก ์์ฑํด์ค์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ , ์๋ต ์์ฒด์ ํฌ๊ธฐ๋ ์ปค์ง ๋ฟ๋๋ฌ ๋งํฌ๋ฅผ ํตํด ํธ์ถํด์ผ ํ๋ ํน์ฑ์ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๊ณผ์ ์์ ๋ถํ์ํ ๋คํธ์ํฌ ํธ์ถ ๋น์ฉ์ด ํ ๋ฒ ์ด์ ๋ฐ์ํ ์ ์๋ค.
๋๊ตฐ๋ค๋ 5๋ฒ ํญ๋ชฉ์์ ์ปค์คํ ๋ฏธ๋์ด ํ์ ์ API๋ง๋ค ์ ์ํ๊ณ ๋ช ์ธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฑด ์์ฒญ๋ ๋น์ฉ์ด๋ค. - ํด๋ผ์ด์ธํธ๊ฐ ํ์ฉํ๊ธฐ ์ด๋ ต๋ค.
์๊น Resource์ ์์ ์ฒ๋ผ ํ์ ์ด ํน์ ๋์ง ์๋ ์๊ฐ ํ์ ์์ ์ฑ์ด ๋จ์ด์ง๋ค. JACKSON ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ๊ฒ์ ํตํด ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ณผ์ ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์์ฑํด์ผ ํ๋ ์ค์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค. - ๋๋ถ๋ถ์ ์๋น์ค์์๋ ๊ณผ์ ์ค๊ณ๋ค.
HATEOAS๋ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฌ์ธ์ง ๋ชจ๋ฅด๋ ๋ฒ์ฉ์ ์ธ ์ํฉ์์ ๊ฐ์น๊ฐ ํฌ๋ค. ํ์ง๋ง ํ์ค์์๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ์ ํ์ด ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. API ๋ณ๊ฒฝ์ด ์์ผ๋ฉด ํ ๋ด ์ปค๋ฎค๋์ผ์ด์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ์ํฉ์์, ๋ชจ๋ ์๋ต์ ๋งํฌ๋ฅผ ๋์ ์ผ๋ก ์์ฑํ๋ ๊ฑด ๋น์ฉ ๋๋น ํจ๊ณผ๊ฐ ๋ฎ๋ค.
๋ง๋ฌด๋ฆฌ
Fielding์ ๊ธฐ์ค์ ๋ฐ๋ฅด๋ฉด ์ฐ๋ฆฌ๋ REST API๊ฐ ์๋๋ผ HTTP API๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ์ด๋ค. ํ์ง๋ง, ์ด๋ ์๋ชป๋ ์ ํ์ด๋ผ๊ธฐ ๋ณด๋ค๋ ํํ ๋งํ๋ฏ ํธ๋ ์ด๋ ์คํ์ ๊ณผ์ ์ด๋ผ๊ณ ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค. ๊ณต๊ฐ API์ฒ๋ผ ํด๋ผ์ด์ธํธ๋ฅผ ํต์ ํ ์ ์๋ ํ๊ฒฝ์์๋ Fielding์ ์์น์ด ์ฌ์ ํ ์ ํจํ ์ค๊ณ ์ง์นจ์ด ๋ ์ ์๋ค.
ํ์ง๋ง, ํ์ค์ ๋ง์ ์๋น์ค์์๋ API ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋๋ ๋น๋๊ฐ ๋์ง ์๊ณ , ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ฐ์ ์กฐ์ง์ด ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด๋ฌํ ์ํฉ์์ ๋ณ๊ฒฝ์ ์ฌํ๋ฅผ ๋ง๊ธฐ ์ํด HATEOAS๋ฅผ ๋์
ํ๋๊ฑด ์ด์ฉ๋ฉด ์ค๋ฒ ์์ง๋์ด๋ง ์ผ ์๋ ์๋ค๊ณ ์๊ฐํ๋ค. ์ค์ ๋ก ๋๋ถ๋ถ์ ์๋น์ค๋ Open API๋๋ผ๋ HATEOAS๋ฅผ ํฌ๊ธฐํ๊ณ , API ๋ฒ์ ๋์ ํตํด ๋ณ๊ฒฝ์ ์ฌํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ง์ด ํ์ธํ ์ ์๋ค.
์ ๊ธฐํ ์ ์ REST API๋ ๊ฒฐ๊ตญ ๊ฐ์ฒด์งํฅ์์ ์ค์ํ๊ฒ ์๊ฐํ๋ โ๋ณ๊ฒฝ์ ์ทจ์ฝํ ๋ถ๋ถ์ ์๋ฐฉํ๋ค.โ๋ ์ฌ๊ณ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค๋ ์ ์ด๋ค. ๊ฐ์ฒด์งํฅ์์๋ ์ถ์ํ๋ฅผ ํธ๋ ์ด๋ ์คํ์ ๊ณผ์ ์ผ๋ก ๋ณด๋๋งํผ REST API๋ ๊ฐ์์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ ํธ๋ ์ด๋ ์คํ ํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค.
์ฐธ๊ณ
- ์คํ๋ง์์๋ ์ด๋ฌํ HATEOAS๋ฅผ ์งํค๋ฉด์ ๊ฐ๋ฐํ ์ ์๋๋ก HATEOAS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ณ ์๋ค.
- Roy Fielding์ Architectural Styles and the Design of Network-based Software Architectures, 2000 ๋ ผ๋ฌธ์ ์ฝ์ด๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค.
- https://witch.work/en/translations/misappropriated-rest-dissertation
'๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| RPC(Remote Procedure Call)๋ ๋ฌด์์ผ๊น? (0) | 2026.03.20 |
|---|---|
| 1๊ฐ์ ์ฌ๊ณ ๊ฐ ์์ ๋ ๋์์ 100๋ช ์ ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ฉด? (2) | 2026.03.17 |
| ์๋ฐ๋ก GitHub Actions ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ธฐ (4) | 2026.03.02 |
| ๊ฐ๋น์ง ์ปฌ๋ ํฐ (0) | 2026.02.09 |
| ํ๋ ฅ, ์ฑ ์, ์ญํ (0) | 2026.02.08 |