HATEOAS

RESTful API๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, RMM (Richardson Maturity Model) ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ์„œ API๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

REST API๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ, ๋ ˆ๋ฒจ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ผ์„œ API๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Level 0 : The Swamp of POX

    • ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค. ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฅผ ์›น ์„œ๋น„์Šค ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœ URI ๋งคํ•‘ ํ˜•ํƒœ๋งŒ ๊ฐ€์ง„๋‹ค.

    • http://domain/deleteArticles

  • Level 1 : Resources

    • ์„œ๋ฒ„์˜ ์ž์›์„ ๋ฆฌ์†Œ์Šค (์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž๋ฃŒ)ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„๋ฅผ ์–˜๊ธฐํ•œ๋‹ค.

    • ์™ธ๋ถ€๋กœ ๊ณต๊ฐœํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ข€ ๋” ์˜๋ฏธ์žˆ๋Š” URI๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

    • POST์™€ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ชจ๋“  ๋ฐ˜ํ™˜ ์ฝ”๋“œ๋ฅผ 200OK๋กœ, ๋‹จ์ˆœ ์ผ€์ด์Šค๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    • http://domain/article/1

  • Level 2 : HTTP Verbs

    • HTTP ์ƒํƒœ์ฝ”๋“œ, ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ์ ์ ˆํžˆ ์ด์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„์ด๋‹ค.

    • HTTP ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ ๋ฐ ์ ์ ˆํ•œ URI, ์—”๋“œํฌ์ธํŠธ, ์ƒํƒœ์ฝ”๋“œ ์ œ์–ด

    • Level 1์—์„œ ์ œ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ• + HTTP Methods์— ๋งž๊ฒŒ ์„ค๊ณ„ํ•œ๋‹ค.

      • ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ฝ๊ธฐ ํ˜•ํƒœ๋ฉด GET์„ ์‚ฌ์šฉํ•œ๋‹ค๋“ ๊ฐ€.

      • HTTP์—์„œ ์‚ฌ์šฉํ•˜๋Š” Method๋ฅผ ๊ฐ€์ง€๊ณ  API๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉ

    • ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” CRUD๋ฅผ ์ด์šฉํ•ด ์„œ๋น„์Šคํ•จ

      • ๋น„์Šทํ•œ URI๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค ํ•˜๋”๋ผ๋„ HTTP Method์— ๋”ฐ๋ผ์„œ ์ƒํƒœ๋‚˜ ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Level 3 : Hypermedia Controls

    • HATEOAS ๊ธฐ๋Šฅ์„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋‹จ๊ณ„๋ฅผ ์–˜๊ธฐํ•œ๋‹ค.

      • Level 2 + HATEOAS

    • ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ์–ด๋–ค๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ํ˜„์žฌ ์ž‘์—…์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™๋“ค์ด ์–ด๋–ค๊ฒƒ์ด ์žˆ๋Š”์ง€, ํ•ด๋‹น ์ž‘์—…์„ ํ†ตํ•ด ๋‹ค๋ค„์งˆ ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์ด ์–ด๋–ค๊ฒƒ๋“ค์ด ์žˆ๋Š”์ง€ ์ œ๊ณต

      • ์„œ๋ฒ„์˜ ๋‹ค์Œ ๋™์ž‘์„ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

spring์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • org.springframework.boot:spring-boot-starter-hateoas

HATEOAS

HATEOAS๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Hypermedia (๋งํฌ)๋ฅผ ํ†ตํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ์ „์ด๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

  • Hypermedia์— ์ž๊ธฐ ์ž์‹ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์•ผ ํ•œ๋‹ค.

  • ์ฆ‰, ํ˜„์žฌ ๋ฆฌ์†Œ์Šค์™€ ์—ฐ๊ด€๋œ (ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ) ์ž์› ์ƒํƒœ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿค” ๊ทธ๋Ÿผ ์ƒํƒœ ์ „์ด? ์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ์ผ๊นŒ.

GET https:*//my-server.com/article*

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๋Š” URI๊ฐ€ ์กด์žฌํ•  ๋•Œ, ๊ธ€์„ ์กฐํšŒํ•œ ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ ํ–‰๋™์œผ๋กœ ๋ฌด์—‡์„ ํ• ๊นŒ?

  • ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ์„ ์กฐํšŒ

  • ์ด์ „ ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ

  • ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ

์ด๋Ÿฌํ•œ ํ–‰๋™๋“ค์ด ๋ฐ”๋กœ ์ƒํƒœ ์ „์ด๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋“ค์ธ๋ฐ, ์ด๋Ÿฐ๊ฒƒ์„ โ€œ์‘๋‹ต ๋ณธ๋ฌธโ€์— ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

  • ๋ฐ”๋กœ Hypermedia (๋งํฌ)๋ฅผ ํ†ตํ•ด ๋„ฃ์–ด์ค€๋‹ค.

์ด๋ฅผ ํ†ตํ•œ ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. API ๋ฒ„์ „์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  2. ๋งํฌ ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

  3. ๋งํฌ๋ฅผ ํ†ตํ•ด ์ƒํƒœ ์ „์ด๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒŒ ๋ฐ”๋กœ Uniform Interface ์ œ์•ฝ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” REST API๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ โ€œHAL JSONโ€์„ ์ด์šฉํ•˜๊ธฐ ์ „๊นŒ์ง€ ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค.

HAL

Hypertext Application Language ์œผ๋กœ JSON, XMl ์ฝ”๋“œ ๋‚ด์˜ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋‹ค.

HAL์€ ๋‘ ๊ฐœ์˜ ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค.

  1. application/hal+json

  2. application/hal+xml

์ด HAL ํƒ€์ž…์„ ์ด์šฉํ•œ๋‹ค๋ฉด ์‰ฝ๊ฒŒ HATEOAS๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

HAL ํƒ€์ž…์—์„œ๋Š” ๋‘ ๊ฐ€์ง€(๋ฆฌ์†Œ์Šค, ๋งํฌ)์˜ ํŠน์ง•๋งŒ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค.

๋ฆฌ์†Œ์Šค : ์ผ๋ฐ˜์ ์ธ data ํ•„๋“œ

๋งํฌ : Hypermedia๋กœ _self ํ•„๋“œ๊ฐ€ ๋งํฌ์— ํฌํ•จ๋œ๋‹ค.

์ฐธ๊ณ  : https://wonit.tistory.com/454arrow-up-right

Last updated