λ€μ΄κ°λ©°
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 : λ€μμΌλ‘ μ μ΄λ νμ΄μ§κ° 무μμΈμ§ λͺ μλμ΄ μμ§ μμ.
π μ°Έκ³ μλ£