๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Computer Science/- Network

HATEOAS๋ฅผ ๋ชจ๋ฅด๋ฉด ๋‹น์‹ ์ด ์•Œ๊ณ  ์žˆ๋Š” REST API๋Š” REST API๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์žฅ๋‹ดํ• ๊ฒŒ์š”.

by Wonit 2021. 3. 24.

์ด ๊ธ€์€ ๊ทธ๋Ÿฐ REST API ๋กœ ๊ดœ์ฐฎ์€๊ฐ€? ์˜ ์ด์‘์ค€ ๊ฐœ๋ฐœ์ž๋‹˜์˜ ๋ฐœํ‘œ ์ž๋ฃŒ์— ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์„ ์ฐจ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.


REST API๋ž€ ๋ฌด์—‡์ผ๊นŒ

 

๋‚œ ์ง€๊ธˆ๊นŒ์ง€ REST API์— ๋Œ€ํ•ด์„œ ์ƒ๋‹น ๋ถ€๋ถ„์„ ์˜คํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

 

REST API๋ผ๊ณ  ํ•จ์€ GET, POST, PUT, PATCH, DELETE๋“ฑ๊ณผ ๊ฐ™์€ HTTP ๋ฉ”์„œ๋“œ๋ฅผ URI๋ฅผ ํ†ตํ•ด์„œ ์ž˜ ์ด์šฉํ•˜๋Š” ๊ฒƒ, ์ด๋ฅผํ…Œ๋ฉด ์ •๋ณด ์กฐํšŒ๋‚˜ ์ˆ˜์ •์€ /user ์ด๋ผ๋Š” ํ•˜๋‚˜์˜ URI์— ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉ, ์ด๋ผ๊ณ  ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๊ทธ๊ฑด REST API์˜ ์•„์ฃผ ์ž‘์€ ์ผ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์˜€๋‹ค.

 

๋”์šฑ ์‹ ๊ธฐํ•œ๊ฑด ์‹ค๋ ฅ ์ข‹์€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฐธ์—ฌํ•œ ๊ธˆ์œต ๊ฒฐ์ œ์›์˜ ์˜คํ”ˆ ๋ฑ…ํ‚น API์—์„œ๋„ REST API๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

 

์‚ฌ์‹ค REST API๋ผ๊ณ  ํ•˜๋ฉด ์•ˆ๋˜์ง€๋งŒ REST API๋ผ๊ณ  ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

 

ํ•ด๋‹น API๋Š” ์ž…๊ธˆ ์ด์ฒด๋ฅผ ์š”์ฒญํ•˜๋Š” Open API ์ธ๋ฐ, ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

 

์ด๊ฑด REST API๊ฐ€ ์•„๋‹ˆ๋‹ค.

 

์™œ REST API๊ฐ€ ์•„๋‹Œ์ง€๋Š” ์•„๋ž˜์—์„œ ์ด์•ผ๊ธฐ๋ฅผ ํ•˜๊ฒ ์ง€๋งŒ, REST API๋ฅผ ๋งŒ๋“  ๋กœ์ด ํ•„๋”ฉ์€ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ REST ๋ผ๊ณ  ํ•  ๊ฒƒ์ด๋ผ๋ฉด REST API๋ผ๊ณ  ํ•˜์ง€ ๋ง๋˜๊ฐ€ HTTP API๋ผ๊ณ  ๋ช…๋ช…ํ•ด์ค„ ๊ฒƒ์„ ๋‹น๋ถ€ํ–ˆ์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

์—ฌ๋Ÿฌ๋ถ„์€ ์ด Response Message๊ฐ€ ์™œ REST API๊ฐ€ ์•„๋‹Œ์ง€ ๊ธ€์„ ์ฝ๊ธฐ ์ „ ๊นŒ์ง€๋Š” ํŒ๋‹จํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

 

(๋‚ด๊ฐ€ ๊ทธ๋Ÿฐ REST API ๋กœ ๊ดœ์ฐฎ์€๊ฐ€? ๋ฅผ ๋ณด์ง€ ์•Š์•˜์„ ๋•Œ ์ฒ˜๋Ÿผ)

 

์ง„์ •ํ•œ REST API๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์‹๊ฒฌ์„ ์—ฌ๋Ÿฌ๋ถ„๋“ค์—๊ฒŒ ๋‚˜๋ˆŒํ…Œ๋‹ˆ ๊ธ€์„ ๋‹ค ์ฝ๊ณ  ์ง„์ •ํ•œ REST API๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค.

REST API

์ž˜ ์•Œ๋‹ค ์‹ถ์ด API๋Š” Application Programming Interface ๋ž€ ๋œป์œผ๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋‚ด๋ถ€์— ๋Œ€ํ•ด์„œ ๋ชฐ๋ผ๋„ API ์ ‘์ ๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ด์™€ ๋น„์Šทํ•˜๊ฒŒ REST API๋Š”

REpresentational State Transfer

๋ผ๋Š” ๋œป์œผ๋กœ, ์ธํ„ฐ๋„ท ์ƒ์˜ ์‹œ์Šคํ…œ ๊ฐ„ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” REST API์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์„ ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์œผ๋ ค ํ•œ๋‹ค. HeeJeongKwon ๋‹˜์˜ REST API ์—์„œ ์ž์„ธํžˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ธํ„ฐ๋„ท ์ƒ์˜ ์‹œ์Šคํ…œ์ด๋ผ๊ณ  ํ•จ์€

  • client to client
  • client to server
  • server to server

๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฐ ์ƒํ˜ธ ์‹œ์Šคํ…œ ์šด์šฉ์„ฑ์„ ์ œ๊ณตํ•จ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ๊ฐ๊ฐ์˜ ๋…๋ฆฝ์ ์ธ ์ง„ํ™”๋ฅผ ๋‹ฌ์„ฑํ–ˆ๋‹ค.

 

์ด๋Ÿฐ ๋…๋ฆฝ์ ์ธ ์ง„ํ™”๋Š” ์›น ์ƒํƒœ๊ณ„์—์„œ Client ๋งŒ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ก ํŠธ ์—”๋“œ๋ผ๋Š” ๋ถ„์•ผ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์—ˆ๊ณ , ๋˜ํ•œ ์„œ๋ฒ„๋งŒ ๋‹ด๋‹นํ•˜๋Š” ๋ฐฑ์—”๋“œ ๋ผ๋Š” ๋ถ„์•ผ๋กœ ๊ณ ๋„ํ™” ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

์ด๋Ÿฐ REST API๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด๋“ค์ด ํ•„์š”ํ•˜๋‹ค.

REST API์˜ ์ œ์•ฝ ์กฐ๊ฑด๋“ค

์•„๋ž˜์— ๋‚˜์˜ค๋Š” ๊ฒƒ๋“ค์€ REST API์˜ ํ•„์ˆ˜ ์ œ์•ฝ ์กฐ๊ฑด์ด๋‹ค.

 

๋งŒ์•ฝ ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ง€์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด๋Š” REST API๋ผ๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค.

 

  • Clinet-Server
    • client๋Š” server ์—์„œ ์–ด๋–ค ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋”๋ผ๋„ ๋‚ด๋ถ€ ์ž‘์—…์„ ์•Œ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
    • ์ด๋Š” ํ”Œ๋žซํผ์˜ ์ด์‹์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ ๋…๋ฆฝ์ ์ด๋ผ ๋ณ„๋„์˜ ์ง„ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Stateless
    • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๊ฐ ์š”์ฒญ์—๋Š” ๊ทธ ์š”์ฒญ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค.
  • Cache
    • ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ๋‚ด์˜ ๋ฐ์ดํ„ฐ์— ํ•ด๋‹น ์š”์ฒญ์€ ์บ์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ๋ถˆ๊ฐ€๋Šฅ ํ•œ์ง€ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
    • ๋ณดํ†ต HTTP Header์— cache-control ํ—ค๋”๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • Uniform Interface
    • ์•„๋ž˜์—์„œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์„ ํ•˜๊ฒ ๋‹ค.
    • ๋ณดํ†ต ๋งŽ์€ REST API๋ผ๋Š” ๊ฒƒ๋“ค์—์„œ ์ง€์ผœ์ง€์ง€ ์•Š๋Š”๋‹ค.
  • ๋“ฑ๋“ฑ 2๊ฐ€์ง€๊ฐ€ ๋” ์žˆ์œผ๋‚˜ ์ƒ๋žตํ•œ๋‹ค.

์—ฌ๋Ÿฌ ์ œ์•ฝ ์กฐ๊ฑด๋“ค์ด ์žˆ๋Š”๋ฐ, ์‚ฌ์‹ค HTTP API๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ œ์•ฝ ์กฐ๊ฑด๋“ค์€ ์ž˜ ์ง€์ผœ์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ Uniform Interface์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

Uniform Interface

Uniform Interface์€ URL๋กœ ์ง€์ •๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์กฐ์ž‘์„ ํ†ต์ผํ•˜๊ณ  ํ•œ์ •๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ณ ์Šคํƒ€์ผ์ด๋‹ค.

 

์ด๋Ÿฐ Uniform Interface๊ฐ€ REST API๋ฅผ ๊ตฌ๋ถ„ ์ง“๋Š” ๊ฐ€์žฅ ํฐ ํ•ต์‹ฌ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


Uniform Interface ์—๋Š” 4๊ฐ€์ง€ ์ œ์•ฝ์กฐ๊ฑด๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž.

Uniform Interface์˜ 4๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด

  1. Resource-Based
  2. Manipluation Of Resources Through Representations
  3. Self-Descriptive Message
  4. Hypermedia As The Engine of Application State

๋‚˜๋Š” 1๋ฒˆ๊ณผ 2๋ฒˆ์—๋งŒ ๊ด€์‹ฌ์„ ๊ฐ€์กŒ์—ˆ๋‹ค.

 

1๋ฒˆ๊ณผ 2๋ฒˆ์„ ํ•ฉ์ณ์„œ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ํ•˜์ž๋ฉด

URI๋กœ ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ Http Method๋ฅผ ํ†ตํ•ด์„œ ํ‘œํ˜„ํ•˜๊ณ  ๊ตฌ๋ถ„ํ•œ๋‹ค!

์ด๋‹ค.

 

์•„๋ž˜ URL์„ ๋ด๋ณด์ž.

https://my-server.com/page?user=guest/menu=login

์ด ๊ฒƒ์€ ์˜ˆ์ „์— HTML์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค.

 

page์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ guest ์ธ์ง€ user์ธ์ง€ admin ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ณ  menu ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ๋ฉ”๋‰ด์ธ์ง€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

ํ•˜์ง€๋งŒ REST API๋ฅผ ์ ์šฉํ•œ๋‹ค๋ฉด

HTTP Method : get
https://my-server.com/user/login

๋ฅผ ํ†ตํ•ด์„œ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์งง์€ URI๋ฅผ ํ†ตํ•ด์„œ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•ด์ง€๊ฒŒ ๋œ๋‹ค.


์•„๋ž˜์˜ URL์€ login ์ด๋ผ๋Š” URI๋กœ POST ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค๋Š” ๋œป์ด ๋˜๋Š”๋ฐ, ์ด ๊ฒƒ์„ ๋ฏธ๋ฃจ์–ด ๋ณด์•˜์„ ๋•Œ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ POST ์š”์ฒญ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ˆ ๋กœ๊ทธ์ธ์„ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ง์ž‘ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

 

HTTP Method : POST
https://my-server.com/user/login

์ง„์งœ ๋ฌธ์ œ์ธ 3๋ฒˆ๊ณผ 4๋ฒˆ์„ ์•Œ์•„๋ณด์ž.

์ด์ œ ์™œ ์ œ์ผ ์•ž์—์„œ ๋‚˜์˜จ ๊ธˆ์œต๊ฒฐ์ œ์›์˜ ์˜คํ”ˆ API๊ฐ€ REST API๊ฐ€ ์•„๋‹Œ์ง€ ์•Œ ์ฐจ๋ก€์ด๋‹ค.

Self-Descriptive Message

๋ง ๊ทธ๋Œ€๋กœ ๋ฉ”์‹œ์ง€ ์Šค์Šค๋กœ๊ฐ€ ์ž์‹ ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.


์ฆ‰, API ๋ฌธ์„œ๊ฐ€ REST API ์‘๋‹ต ๋ณธ๋ฌธ์— ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๋ฌผ๋ก  API ๋ฌธ์„œ ์ „์ฒด๋ฅผ ์‘๋‹ต์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ ํ•œ๋‹ค.

 

์ ์–ด๋„ API ๋ฌธ์„œ๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€๋Š” ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค.

 

์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์—์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ญ๊ฐ€ ์ข‹์„๊นŒ?

 

์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์„œ๋ฒ„๊ฐ€ ๋ณ€ํ•ด์„œ Response Data๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

๊ทธ๋Ÿผ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ํ•ด๋‹น API ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด์„œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Hypermedia As The Engine of Application State

์ดํ•˜ ์ด๊ฒƒ์„ HATEOAS ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.


HATEOAS๊ฐ€ ๋ง ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ ํ•œ ์ค„๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

๋˜ํ•œ Hypermedia (๋งํฌ)์— ์ž๊ธฐ ์ž์‹ ์— ๋Œ€ํ•ดํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์•ผ ํ•œ๋‹ค.

์ƒํƒœ ์ „์ด? ๋ฌด์Šจ ๋ง์ผ๊นŒ?

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๊ฒŒ์‹œ ๊ธ€์„ ์กฐํšŒํ•˜๋Š” URI๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด๋ณด์ž.

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

๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ํ•ด๋‹น ๊ธ€์„ ์กฐํšŒํ•œ ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ ํ–‰๋™์œผ๋กœ ์–ด๋–ค ํ–‰๋™์„ ํ• ๊นŒ?

 

  • ๋‹ค์Œ ๊ฒŒ์‹œ๋ฌผ ์กฐํšŒ
  • ๊ฒŒ์‹œ๋ฌผ์„ ๋‚ด ํ”ผ๋“œ์— ์ €์žฅ
  • ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ

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

 

๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ๋„ฃ์„๊นŒ?

 

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

 

๊ทธ๋Ÿผ ๊ธฐ์กด์— ์‘๋‹ต ๋ฉ”์‹œ์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

{
  "data": {
    "id": 1000,
    "name": "๊ฒŒ์‹œ๊ธ€ 1",
    "content": "HAL JSON์„ ์ด์šฉํ•œ ์˜ˆ์‹œ JSON",
    "self": "http://localhost:8080/api/article/1000", // ํ˜„์žฌ api ์ฃผ์†Œ
    "profile": "http://localhost:8080/docs#query-article", // ํ•ด๋‹น api์˜ ๋ฌธ์„œ
    "next": "http://localhost:8080/api/article/1001", // ๋‹ค์Œ article์„ ์กฐํšŒํ•˜๋Š” URI
    "comment": "http://localhost:8080/api/article/comment", // article์˜ ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ
    "save": "http://localhost:8080/api/feed/article/1000", // article์„ ๋‚ด ํ”ผ๋“œ๋กœ ์ €์žฅ
  },
}

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

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

์šฐ์„  ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ญ๊ฐ€ ์ข‹์„์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ญ๊ฐ€ ์ข‹์„๊นŒ?

  1. API ๋ฒ„์ „์„ ๋ช…์„ธํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  2. ๋งํฌ ์ •๋ณด๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
  3. ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ ์ƒํƒœ ์ „์ด๊ฐ€ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ธ๋‹ค๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, JPA์—์„œ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ API ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

 

๊ทธ๋Ÿผ ๋งํฌ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ํด๋ผ์ด์–ธํŠธ์—์„  ์ผ์ผ์ด ๋Œ€์‘ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์ด๊ฑธ ์™„๋ฒฝํ•˜๊ฒŒ ํ• ๊นŒ?

 

๋ฐ”๋กœ HAL JSON์„ ์ด์šฉํ•œ๋‹ค.

HAL

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

 

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

  1. application/hal+json
  2. application/hal+xml

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

 

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

๋ฆฌ์†Œ์Šค์™€ ๋งํฌ

  • ๋ฆฌ์†Œ์Šค : ์ผ๋ฐ˜์ ์ธ data ํ•„๋“œ์— ํ•ด๋‹นํ•œ๋‹ค.
  • ๋งํฌ : ํ•˜์ดํผ๋ฏธ๋””์–ด๋กœ ๋ณดํ†ต _self ํ•„๋“œ๊ฐ€ ๋งํฌ ํ•„๋“œ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ƒฅ JSON ์‘๋‹ต ๋ณธ๋ฌธ์„ ํ•œ ๋ฒˆ ๋ณด๋Š”๊ฒŒ ๋น ๋ฅผ ๊ฒƒ ๊ฐ™๋‹ค.

{
  "data": { // HAL JSON์˜ ๋ฆฌ์†Œ์Šค ํ•„๋“œ
    "id": 1000,
    "name": "๊ฒŒ์‹œ๊ธ€ 1",
    "content": "HAL JSON์„ ์ด์šฉํ•œ ์˜ˆ์‹œ JSON"
  },
  "_links": { // HAL JSON์˜ ๋งํฌ ํ•„๋“œ
    "self": {
      "href": "http://localhost:8080/api/article/1000" // ํ˜„์žฌ api ์ฃผ์†Œ
    },
    "profile": {
      "href": "http://localhost:8080/docs#query-article" // ํ•ด๋‹น api์˜ ๋ฌธ์„œ
    },
    "next": {
      "href": "http://localhost:8080/api/article/1001" // article ์˜ ๋‹ค์Œ api ์ฃผ์†Œ
    },
    "prev": {
      "href": "http://localhost:8080/api/article/999" // article์˜ ์ด์ „ api ์ฃผ์†Œ
    }
  }
}

๊ทธ๋Ÿผ ์ด์ œ ์ง„์ •ํ•œ REST API๋ฅผ ๋งŒ์กฑ์‹œ์ผฐ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋‹ค์‹œ ์•ž์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์™œ ๊ธˆ์œต๊ฒฐ์ œ์›์˜ API๋Š” REST API๊ฐ€ ์•„๋‹๊นŒ?

์Šค์Šค๋กœ ๋‹ตํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋Œ“๊ธ€