๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋‚˜์˜ ๋ชจ์–‘

030 | REST API ๋ณธ๋ฌธ

SEB/TIL

030 | REST API

kexon 2022. 8. 3. 23:52

๐Ÿ’™API & REST

๐Ÿค API(Application Programming Interface)

  • ํŠน์ • ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธํŠธ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ชฉ๋ก์„ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉ
  • ์›น ์•ฑ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ๋˜๋Š” ์ƒํ™ฉ์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ, ๋„ค์ด๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” OpenAPI๋ฅผ ํ†ตํ•ด ๋„ค์ด๋ฒ„์˜ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜์—ฌ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿค REST(Representational State Transfer)

  • REST๋Š” ์›”๋“œ ์™€์ด๋“œ ์›น๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ํ•˜์ดํผ๋ฏธ๋””์–ด ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ํ•œ ํ˜•์‹์œผ๋กœ, ์ž์›์„ ์ด๋ฆ„(์ž์›์˜ ํ‘œํ˜„)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น ์ž์›์˜ ์ƒํƒœ(์ •๋ณด)๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์˜๋ฏธํ•จ
  • ์‰ฝ๊ฒŒ ๋งํ•ด API๋ฅผ ๊ตฌ์ถ•ํ• ๋•Œ URI์™€ HTTP Method๋ฅผ ํ™œ์šฉํ•˜์—ฌ API์˜ ๊ธฐ๋Šฅ์„ ์ถ”์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ์•„ํ‚คํ…์ณ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์›์น™๊ฐ™์€ ๊ฒƒ์ด๋‹ค. REST ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ API๋งŒ์ด RESTful API๋ผ๋Š” ์˜๊ด‘์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์•„ ์ด API๋Š” RESTfulํ•˜๊ตฌ๋‚˜~ ํ•˜๋Š” ๊ฒƒ์ด๋ž€ ์–˜๊ธฐ๋‹ค.

๐Ÿค REST ๊ตฌ์„ฑ

  • ์ž์› (Resource) - URI
    ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ๊ณ ์œ ํ•œ ์ฃผ์†Œ๊ฐ€ ์กด์žฌํ•˜๊ณ , ์„œ๋ฒ„์— ์กด์žฌํ•จ. URI๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ํ˜ธ์ถœ
  • ํ–‰์œ„ (Verb) - HTTP Method
    CRUD์— ๋งž์ถฐ HTTP Method ์„ค์ •
  • ํ‘œํ˜„ (Representation of Resource)
    ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ˜•ํƒœ (ex. JSON, XML, TEXT, RSS, ...)

๐Ÿค REST Architectural Constraints

RESTful ์•„ํ‚คํ…์ฒ˜์—๋Š” 6๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™์€ ๋กœ์ด ํ•„๋”ฉ์ด 2000๋…„ ๋…ผ๋ฌธ์—์„œ ๊ธฐ์ˆ ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

1. ์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ (Server-Client)

  • REST ์•„ํ‚คํ…์ฒ˜์˜ ๊ธฐ์ดˆ
  • ์ผ๋ฐ˜์ ์ธ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ๋ฅผ ๋„๋ฉฐ, ์ผ์ •ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋จ

 

2. ๋ฌด์ƒํƒœ (Stateless)

  • HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— HTTP์˜ ํŠน์ง•์ธ ๋ฌด์ƒํƒœ์„ฑ์„ ๊ฐ€์ง
  • ์„œ๋ฒ„ ์ƒํƒœ์˜ ๊ด€๋ฆฌ๊ฐ€ ์—†์Œ์„ ์ธ์ง€ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•จ
  • ๊ฐ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์€ ์ด์ „์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋ชจ๋“  ์š”์ฒญ๊ณผ ๋ฌด๊ด€ํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์š”์ฒญ์—๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ํ•จ

3. ์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ (Cacheable / Cashing)

  • HTTP ํ”„๋กœํ† ์ฝœ์—์„œ ์‚ฌ์šฉํ•˜๋Š” Last-Modified Tag ๋˜๋Š” E-Tag๋ฅผ ์ด์šฉํ•ด ์บ์‹ฑ์„ ์ง€์›
  • Stateless์˜ ๋ถ€์ •์ ์ธ ์˜ํ–ฅ ์ค‘ ์ผ๋ถ€๋Š” ์บ์‹ฑ์œผ๋กœ ์กฐ์ ˆ ๊ฐ€๋Šฅ
  • ์บ์‹œ๋ฅผ ์œ„ํ•œ REST ์•„ํ‚คํ…์ฒ˜ ์ œ์•ฝ ์กฐ๊ฑด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ์บ์‹œ ๊ฐ€๋Šฅ ๋˜๋Š” ์บ์‹œ ๋ถˆ๊ฐ€๋Šฅ์œผ๋กœ ํ‘œ์‹œํ•ด์•ผ๋˜๋ฉฐ, ์บ์‹œ๋Š” HTTP ํ—ค๋”๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์— ์˜ํ•ด ์ œ์–ด๋จ

4. ๊ณ„์ธตํ™” (Layered System)

  • REST API ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•จ
  • ์•„ํ‚คํ…์ฒ˜ ๋‚ด ๊ฐ ๊ณ„์ธต์€ ๋‹ค๋ฅธ ๊ณ„์ธต๊ณผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ
  • ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„๋กœ๋งŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ๋„ ์žˆ๊ณ  ์ค‘๊ฐ„์— Gateway๋‚˜ ํ”„๋ก์‹œ ์„œ๋ฒ„์™€ ๊ฐ™์€ ๋ฏธ๋“ค ์›จ์–ด๋ฅผ ๋ฐฐ์น˜ํ•ด ๊ณ„์ธตํ™”ํ•  ์ˆ˜ ์žˆ์Œ

5. ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ (Uniform Interface)

  • URI๋กœ ์ง€์ •ํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ†ต์ผ๋˜๊ณ , ํ•œ์ •์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๊ณตํ†ต์œผ๋กœ ๊ธฐ์ˆ ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ
  • ์—ฌ๊ธฐ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์•ฝ์†์ด๊ณ , ์ด ์•ฝ์†์€ HTTP ๋ฉ”์„œ๋“œ์™€ ๋ฏธ๋””์–ด ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜๊ณ , ์ด๊ฒƒ์˜ ์žฅ์ ์€ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • ๊ท ์ผํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ œ์•ฝ ์กฐ๊ฑด 4๊ฐ€์ง€
    • ๋ฆฌ์†Œ์Šค IDIdentity of the resource(URI/URL)
    • ์ž์›์˜ ํ‘œํ˜„(Representation of the resource)
    • ์ž์ฒด ์„ค๋ช… ๋ฉ”์‹œ์ง€(Self descriptive messages — metadata)
    • ํ•˜์ดํผ๋ฏธ๋””์–ด(Hypermedia

6. ์ž์ฒด ํ‘œํ˜„ (Self-Descriptiveness)

  • URI๋งŒ ๋ถ„์„ํ•ด๋„ ๋ฌด์Šจ ๊ธฐ๋Šฅ์ธ์ง€ ์œ ์ถ”๊ฐ€ ๋œ๋‹ค๋Š” ํŠน์„ฑ์ด๋‹ค.

โœ… Ref.

 

Is the Richardson Maturity Model Relevant in 2019.

Before giving reasons why RMM is or not relevant in 2019, I would love to give an insight into what this Richardson Maturity Model Means…

medium.com

๐Ÿค REST API

  • REST ์›์น™ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„ API
  • ์›น(http)์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜
  • ์›น์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์ž์›์„ HTTP URI๋กœ ํ‘œํ˜„ํ•˜๊ณ , HTTP ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹

๐Ÿ’™ Richardson Maturity Model (RMM)

Leonard Richardson์ด 100๊ฐœ์˜ ๋‹ค๋ฅธ ์›น ์„œ๋น„์Šค ๋””์ž์ธ์„ ๋ถ„์„ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋””์ž์ธ์„ 4๊ฐœ์˜ ๋ฒ”์ฃผ๋กœ ๋‚˜๋ˆด๋‹ค. ์ด ๋ฒ”์ฃผ๋Š” ์›น ์„œ๋น„์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ REST๋ฅผ ๋”ฐ๋ฅด๋Š”์ง€๋ฅผ ๊ธฐ์ดˆ๋กœ ํ•˜๋Š”๋ฐ, ์ด REST ์„œ๋น„์Šค ๋ถ„ํ•  ๋ชจ๋ธ์„ RMM(Richardson Maturity Model)์ด๋ผ๊ณ  ํ•œ๋‹ค.

Richardson์€ ์„œ๋น„์Šค์˜ ์„ฑ์ˆ™๋„๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์š”์†Œ(⇒ URI, HTTP ๋ฉ”์„œ๋“œ, HATEOAS(ํ•˜์ดํผ๋ฏธ๋””์–ด))๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์ด ์š”์†Œ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ• ์ˆ˜๋ก ๋” ์„ฑ์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ - 0๋‹จ๊ณ„

  • 0๋‹จ๊ณ„์—์„œ๋Š” ๋‹จ์ˆœํžˆ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น API๋ฅผ REST API๋ผ๊ณ  ํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ, 0๋‹จ๊ณ„๋Š” ์ข‹์€ REST API๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋‹จ๊ณ„
  • HTTP or RPC(Remote Procedure Call) ์‚ฌ์šฉ
  • ๋‹จ์ผ URI๋ฅผ ๊ฐ€์ง€๋ฉฐ, ๋‹จ์ผ HTTP ๋ฉ”์„œ๋“œ(์ผ๋ฐ˜์ ์œผ๋กœ POST) ์‚ฌ์šฉ

REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ -1๋‹จ๊ณ„

  • URI ์‚ฌ์šฉ / HTTP, HATEOAS ์‚ฌ์šฉ ์•ˆํ•จ
  • ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค์™€์˜ ํ†ต์‹ ์„ ์ค€์ˆ˜ํ•ด์•ผํ•˜๋ฉฐ, ๋งŽ์€ URI๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ HTTP POST ์‚ฌ์šฉ
  • ์ด ์„œ๋น„์Šค๋Š” ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ ๋ฆฌ์†Œ์Šค์— ๊ณ ์œ ํ•œ URI๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๊ณ ์œ ํ•œ URI๋Š” ํ•˜๋‚˜์˜ ๊ณ ์œ ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ„๋„๋กœ ์‹๋ณ„ํ•จ

REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ - 2๋‹จ๊ณ„

  • URI, HTTP ์‚ฌ์šฉ / HATEOAS ์‚ฌ์šฉ ์•ˆํ•จ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋งŽ์€ URI(์ฃผ์†Œ ์ง€์ • ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค) ํ˜ธ์ŠคํŒ…
  • CRUD์— ๋งž๊ฒŒ ์ ์ ˆํ•œ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘ 

REST ์„ฑ์ˆ™๋„ ๋ชจ๋ธ - 3๋‹จ๊ณ„

  • Richardson์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ชจ๋ธ
  • URI, HTTP, HATEOAS(Hypertext As The Engine Of Application state) ์„ธ ๊ฐ€์ง€ ๋ชจ๋‘ ์‚ฌ์šฉ
  • HATEOAS: API ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ฃผ๋„ํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ์‘๋‹ต ๋ฉ”์‹œ์ง€์— ํฌํ•จ๋œ ์š”์†Œ
  • 3๋‹จ๊ณ„์—์„œ ๊ฐœ๋ฐœ๋œ API๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์™„์ „ํ•œ RESTful API๋กœ ๊ฐ„์ฃผ๋จ

โœ… Ref.

 

Richardson Maturity Model

The model of dividing the REST compliant services to identify their maturity level - is called Richardson Maturity Model.

restfulapi.net

 

Comments