[Mastering Spring 5.0] 6.2 HATEOAS
Mastering Spring 5.0 μ€ν°λ
REST μ±μλ λͺ¨λΈ (Richardson Maturity Model)
Richardson Maturity Model μμλ Restful Web Service λ₯Ό λ€μμ λ¨κ³λ‘ λλμ΄ μ±μλλ₯Ό μ μνκ³ μλ€.
-
Level 0 :
μ격 νλ‘μμ νΈμΆ (Remote Procedure Invocation)
μ κΈ°λ°ν ννλ‘ resource κ΅¬λΆ μμ΄ μ€κ³λ HTTP API (http://server/getPosts
,http://server/deletePosts
,http://server/doThis
,http://server/doThat
λ±) -
Level 1 :
resource
λ₯Ό URI ν΅ν΄ λνλΈλ€. (λͺ μ¬ μ¬μ©) κ·Έλ¬λ,HTTP METHOD(GET,POST,PUT,DELETE λ±)
μ¬μ©νμ§ μλλ€. (http://server/accounts
,http://server/accounts/10
) -
Level 2 :
resource
λ₯Ό URI + HTTP Method λ₯Ό μ¬μ©νμ¬ μ κ·Όνλ€. (κ³μ μ μμ νλ €λ©΄ PUT, κ³μ μ μμ±νλ €λ©΄ POST λ©μλλ₯Ό μννλ€.) -
Level 3 : HATEOAS. μμ²ν μ 보 λΏλ§ μλλΌ μμ²ν μ 보μ κ΄λ ¨ν URI λ₯Ό ν¬ν¨ν¨μΌλ‘μ¨, μλΉμ€ μλΉμκ° ν μ μλ λ€μ μ‘°μΉμ λν΄μλ μ 곡νλ€.
HATEOAS
HATEOAS (Hypermedia as the Engine of Application State) λ RESTful μν€ν
μ³λ₯Ό κ³ μ νκ² μ μ§νλ REST μμ© νλ‘κ·Έλ¨ μν€ν
μ³μ μ μ½ μ¬νμ΄λ€.
Hypermedia λΌλ μ©μ΄λ μ΄λ―Έμ§, ν
μ€νΈ, λμμ λ± λ€λ₯Έ νμμ λ―Έλμ΄μ λν λ§ν¬κ° ν¬ν¨λ κ²μ μλ―Ένλ€.
Hypermedia μ μ μ¬ν κ°λ
μ RESTful μλΉμ€μλ μ μ©νμ¬, μμ²ν 리μμ€μ λν λ°μ΄ν° λΏλ§ μλλΌ κ΄λ ¨ 리μμ€ λλ μμ‘΄ 리μμ€μ URI λ§ν¬ λ₯Ό μλ΅μ ν¬ν¨μμΌ μλΉμ€ μλΉμμκ² μ 곡νλ ννλΌκ³ λ³Ό μ μλ€.
κΈ°μ‘΄ RESTful API μ λ¨μ
- API μ μλν¬μΈνΈκ° μ ν΄μ§λ©΄ μ΄λ₯Ό μ½κ² λ³κ²½νκΈ°κ° μ΄λ ΅λ€. API κ° λ³κ²½λ¨μ λ°λΌ μ΄λ₯Ό μ¬μ©νλ λͺ¨λ ν΄λΌμ΄μΈνΈ λ€μ΄ ν¨κ» μμ λμ΄μΌ νλ€.
- API κ° μμ λμ΄μΌ νλ κ²½μ° API URL μ λ²μ λͺ μ μΆκ°νκ±°λ λ€λ₯Έ API λ₯Ό μ§μμ μΌλ‘ μΆκ°νκ² λλ€. κ·Έλ κ² λλ©΄ API URL κ΄λ¦¬κ° μ΄λ €μμ§λ€.
- REST API μ νΉμ μμ μ μννκΈ° μν΄ λ°μ΄ν°λ₯Ό μμ§ν΄μΌ νλ€κ±°λ, ν΄λΉ μμ μ΄ κ°λ₯νμ§ μ¬λΆλ₯Ό νλ¨νλ λ‘μ§ λͺ¨λ ν΄λΌμ΄μΈνΈμμ κ°μ Έκ°μΌ νλ€.
HATEOAS μ€νλ§λΆνΈμ μ μ©νκΈ°
1. μμ‘΄μ± μΆκ°νκΈ°
μ€νλ§ λΆνΈμλ spring-boot-starter-hateoas
λΌλ HATEOAS λ₯Ό μν μ€νν°λ₯Ό μ 곡νλ€. λ°λΌμ κ΄λ ¨ μ’
μμ±μ pom.xml
λλ build.gradle
μ μΆκ°νλ€.
pom.xml
|
|
build.gradle
|
|
μλλ spring-boot-starter-hateoas
μ μ€μν μμ‘΄μ± μ€ νλλ HATEOAS κΈ°λ₯μ μ 곡νλ spring-hateoas
μ΄λ€.
|
|
2. 리μμ€ λ§ν¬λ₯Ό λ°ννλ 컨νΈλ‘€λ¬ ꡬμ±
Response κ°μ {name} μ κ΄λ ¨λ λͺ¨λ μλ΅μ κ²μνκΈ° μν λ§ν¬λ₯Ό λ°ννλλ‘ μ€μ νλ€. κΈ°μ‘΄ ResponseEntity
λμ Resource<Todo>
κ°μ²΄λ₯Ό 리ν΄νλλ‘ μμ€λ₯Ό μμ νλ€.
Resource classλ‘ λλ©μΈ κ°μ²΄λ₯Ό wrapping ν΄μ£Όκ³ linkλ₯Ό μΆκ°ν μ μλ€.
|
|
3. μλ΅μ HATEOAS λ§ν¬ μ 보 νμΈνκΈ°
curl λͺ λ Ήμ΄ νΉμ POSTMAN μΌλ‘ μμ²νλ€.
|
|
|
|
ν΄λΉ URL μ μμ²νλ©΄ _links
ν€ κ°μ λͺ¨λ ν μΌμ μ‘°νν μ μλ λ§ν¬κ° ν¬ν¨λλ€.
μ°Έκ³
- Building a Hypermedia-Driven RESTful Web Service - https://spring.io/guides/gs/rest-hateoas/
- Hypermedia-driven REST API : https://m.blog.naver.com/tmondev/220391644590
- [νκΈν νλ‘μ νΈ] 1. Richardson μ±μλ λͺ¨λΈ(Richardson Maturity Model) : http://jinson.tistory.com/190
- On choosing a hypermedia type for your API - HAL, JSON-LD, Collection+JSON, SIREN, Oh My! - https://sookocheff.com/post/api/on-choosing-a-hypermedia-format/