λ“€μ–΄κ°€λ©°

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 : λ‹€μŒμœΌλ‘œ 전이될 νŽ˜μ΄μ§€κ°€ 무엇인지 λͺ…μ‹œλ˜μ–΄ μžˆμ§€ μ•ŠμŒ.


πŸ”– 참고자료

RESTful API κ΅¬ν˜„ν•˜κΈ°

REST APIλž€?