Sam Baek, The Dev's Corner

๐ŸฐRESTful API

27 Jun 2023

RESTful API : ์›น ๊ฐœ๋ฐœ์—์„œ ํ•„์ˆ˜์ ์ธ ์•„ํ‚ค๋ฑ์ฒ˜ ์Šคํƒ€์ผ

1. RESTful API ๊ฐœ๋…๊ณผ ์›๋ฆฌ

๐ŸŸข RESTful API ๋ž€ ?

Representational State Transfer API๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ง๋กœ,
์ž์› ์ฆ‰, Resource๐Ÿ’Ž๋ฅผ ๋„คํŠธ์›Œํฌ์ƒ์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด๋‹ค.๐Ÿšš


๐ŸŸข RESTful API๊ฐ€ ๋„คํŠธ์›Œํฌ์—์„œ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์ „์†กํ•œ๋‹ค๋Š” ๋ง์ด ๋ฌด์Šจ ์˜๋ฏธ์ผ๊นŒ?

๊ทธ ์˜๋ฏธ๋Š” ์ž์› ์ ‘๊ทผ๊ณผ HTTP๋ฉ”์„œ๋“œ ํ™œ์šฉ, ์ƒํƒœ ์ •๋ณด์˜ ์ „๋‹ฌ, ์บ์‹ฑ ์ฒ˜๋ฆฌ ๋“ฑ์˜ ์ธก๋ฉด์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

RESTful API์˜ ํšจ์œจ์„ฑ์€ RESTful API๊ฐ€ ์ž์›์„ ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ณ ,
HTTP ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋Šฅ๊ณผ ํŠน์ง•์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๋ฉด์„œ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
์ž์›์˜ ํšจ์œจ์ ์ธ ์ „์†ก์€ ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์˜ ์ตœ์ ํ™”, ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ž์› ์‚ฌ์šฉ์˜ ์ตœ์†Œํ™” ๋“ฑ์„ ํ†ตํ•ด
์ „์ฒด์ ์ธ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์žฅ์ ์„ ์ œ๊ณตํ•œ๋‹ค.


๐ŸŸข RESTful API๋Š” ์ฃผ์š” ์›์น™์— ๊ธฐ๋ฐ˜์„ ๋‘๊ณ  ์ž‘์„ฑ์„ ํ•˜๋Š”๋ฐ, ๋‹ค์Œ์„ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค.

  • ์ž์›(Resource๐Ÿ’Ž)์ง€ํ–ฅ์  : RESTful API์˜ ์ฃผ์š” ์ปจ์…‰์€ ์ž์›์ด๊ณ  ๊ฐ ์ž์›์€ URI(Uniform Resource Identifier ๊ณ ์œ ํ•œ ์‹๋ณ„์ž)๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

  • ๋ฌด์ƒํƒœ์„ฑ(Stateless) : ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๊ฐ ์š”์ฒญ์€ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ ์™„์ „ํ•œ ์š”์ฒญ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ํ†ต์ผ๋œ ์ธํ„ฐํŽ˜์ด์Šค : RESTful API๋Š” ํ‘œ์ค€ HTTP ๋ฉ”์„œ๋“œ(GET,POST,PUT,DELETE ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์›์— ๋Œ€ํ•œ ์ž‘์—…(CRUD operation)์„ ์ •์˜ํ•œ๋‹ค.

  • ์ž์ฒดํ‘œํ˜„์„ฑ(Self-descriptive) : API ์š”์ฒญ๊ณผ ์‘๋‹ต์€ ์ž์ฒด์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผํ•œ๋‹ค. ์š”์ฒญ ํ—ค๋”์— MIME ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜ ์‘๋‹ต์— ์ ์ • ์ƒํƒœ ์ฝ”๋“œ์™€ ํŽ˜์ด๋กœ๋“œ(payload)๋ฅผ ํฌํ•จํ•˜๋Š”๊ฒŒ ๊ทธ ์˜ˆ๋‹ค.

  • ๊ณ„์ธต ๊ตฌ์กฐ : ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์— ์ค‘๊ฐ„ ๊ณ„์ธต(๋กœ๋“œ ๋ฒจ๋Ÿฐ์„œ, ์บ์‹ฑ ์„œ๋ฒ„ ๋“ฑ)์„ ํฌํ•จํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜์žˆ๋‹ค.

  • ์บ์‹ฑ ์ฒ˜๋ฆฌ(Cacheable) : RESTful API๋Š” ์บ์‹ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ด์ „์— ์š”์ฒญ๋œ ์ž์›์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ํ•„์š”ํ•œ ์ž์›์„ ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ค๋ฏ€๋กœ ์„œ๋ฒ„์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ค„์ด๊ณ  ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, RESTful API ์„œ๋ฒ„์—์„œ *ํŠธ๋žœ์žญ์…˜(transaction)์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ์ „์ฒด ์‘๋‹ต์‹œ๊ฐ„, ์ž์› ์ด์šฉ๋ฅ , ์„ฑ๋Šฅ์ด ํ–ฅ์ƒํ•œ๋‹ค.

*๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์˜ ๋‹จ์œ„๋กœ์„œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ๋ณต๊ตฌ ๋ฐ ๋ณ‘ํ–‰ ์‹œํ–‰ ์‹œ ์ฒ˜๋ฆฌ๋˜๋Š” ์ž‘์—…์˜ ๋…ผ๋ฆฌ์  ๋‹จ์œ„์ด๋‹ค.


๐ŸŸข ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ์ด์œ 

  • ๋ฌด์ƒํƒœ์„ฑ(Stateless) : RESTful API์˜ ํ•ต์‹ฌ ์›์น™ ์ค‘ ํ•˜๋‚˜๋กœ, ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ด์ „ ์š”์ฒญ์„ ๊ธฐ์–ตํ•˜์ง€ ์•Š๊ณ  ๊ฐ ์š”์ฒญ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์š”์ฒญ์„ ์„œ๋กœ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ํ™•์žฅ์„ฑ : RESTful API๋Š” ์„œ๋ฒ„์˜ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ƒํƒœ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ž์ฒด์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์—ฌ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋กœ์˜ ํ™•์žฅ์ด ์šฉ์ดํ•ด์ง„๋‹ค. ๋˜ํ•œ, ์„œ๋ฒ„๋Š” ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์†Œ์š”๋˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ์˜ ์ž์œจ์„ฑ : ํด๋ผ์ด์–ธํŠธ ์ž์ฒด์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์„œ๋ฒ„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๊ฐ„์— ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์œ ์—ฐ์„ฑ๊ณผ ๋…๋ฆฝ์„ฑ์„ ๋†’์ธ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜ ๊ฐ์†Œ : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์—์„œ ์†Œ์š”๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

    ์ฆ‰, RESTful API์—์„œ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ํ™•์žฅ์„ฑ, ๋ฌด์ƒํƒœ์„ฑ, ํด๋ผ์ด์–ธํŠธ์˜ ์ž์œจ์„ฑ, ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜ ๊ฐ์†Œ ๋“ฑ ์ด์ ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์„ ํƒ์ด๋‹ค. RESTful API๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ํ•„์š”ํ•œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์„œ๋ฒ„๋Š” ์ƒํƒœ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŸข RESTful API์˜ ์‚ฌ์šฉ ๊ณผ์ •

์ž์› ์‹๋ณ„ โž– HTTP ๋ฉ”์„œ๋“œ ์„ ํƒ โž– ์š”์ฒญ ๊ตฌ์„ฑ โž– ์š”์ฒญ ์ „์†ก โž– ์‘๋‹ต ์ฒ˜๋ฆฌ

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

2. HTTP ๋ฉ”์„œ๋“œ์™€ ๋ฆฌ์†Œ์Šค๐Ÿ’Ž ๊ด€๋ฆฌ

๐ŸŸข RESTful API = ๋ฆฌ์†Œ์Šค URI + HTTP Methods

RESTful API๋Š” ์ž์›์˜ URI์™€ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋™์ž‘์„ ์ •์˜ํ•œ๋‹ค.


๐ŸŸข HTTP Methods

METHOD ์—ญํ•  CRUD
POST POST๋ฅผ ํ†ตํ•ด ํ•ด๋‹น URI๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•œ๋‹ค. Create
GET GET์„ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค์˜ ์กฐํšŒ๋ฅผ ์š”์ฒญํ•œ๋‹ค. ์„œ๋ฒ„๋Š” ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Read
PUT PUT์„ ํ†ตํ•ด ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์ƒ์„ฑํ•œ๋‹ค. ์ „์ฒด ๋ฆฌ์†Œ์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. Update
PATCH PATCH๋ฅผ ํ†ตํ•ด ํŠน์ • ๋ฆฌ์†Œ์Šค์˜ ์ผ๋ถ€๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. Update
DELETE DELETE๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•œ๋‹ค. Delete


๐ŸŸข ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ ๋ฆฌ์†Œ์Šค์˜ ๊ณ ์œ ํ•œ URI๋ฅผ ํ†ตํ•ด ์ž์›์— ์ ‘๊ทผํ•˜๊ณ  ์กฐ์ž‘ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด โ€˜/usersโ€™๋Š” ์‚ฌ์šฉ์ž ๋ฆฌ์†Œ์Šค์˜ URI์ด๋ฉฐ โ€˜/users/{id}โ€™ ๋Š” ํŠน์ • ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•˜๋Š” URI์ด๋‹ค.
์ด๋Ÿฌํ•œ URI ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ํŠน์ •ํ•œ ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ‘œํ˜„ํ•˜๊ณ  URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•œ๋‹ค.


๐ŸŸข ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์˜ ์ผ๊ด€๋œ URI ์„ค๊ณ„์™€ HTTP ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์œผ๋กœ

์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ API๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.


๐ŸŸข HTTP ๋ฉ”์„œ๋“œ์™€ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์˜ ์ด์ 

RESTful API์˜ HTTP ๋ฉ”์„œ๋“œ์™€ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ์ง€์›ํ•œ๋‹ค.
๋˜ํ•œ, ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ธ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๊ณ ,
ํšจ์œจ์ ์ธ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. RESTful API ๋””์ž์ธ ์›์น™๊ณผ ์ตœ์ ํ™” ์ „๋žต


๐ŸŸข RESTful API ๋””์ž์ธ ์›์น™

  • ์ž์› ์ค‘์‹ฌ(Resource-Centric) : API ์—”๋“œํฌ์ธํŠธ๋Š” ์ž์›์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜์–ด์•ผ ํ•œ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด /users ๋Š” ๊ถŒ์žฅํ•˜์ง€๋งŒ, /get-users๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ–‰์œ„๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ํ‘œํ˜„ํ•œ๋‹ค.

  • ํ‘œํ˜„ ๋ฐฉ์‹์˜ ์ผ๊ด€์„ฑ(Consistent Representation) : API์˜ ์‘๋‹ต์€ ์ผ๊ด€๋œ ํ‘œํ˜„ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
    ๋Œ€๋ถ€๋ถ„ JSON ํ˜•์‹์ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ํ•„๋“œ๋ช…์€ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผํ•œ๋‹ค.

  • ์ ์ ˆํ•œ HTTP๋ฉ”์„œ๋“œ ์‚ฌ์šฉ(Proper Use of HTTP) : ์ž‘์—…์˜ ์˜๋„์— ๋งž๊ฒŒ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ ์ ˆํ•œ ์ƒํƒœ ์ฝ”๋“œ ๋ฐ˜ํ™˜(Proper Use of Status) : API ์‘๋‹ต์—๋Š” ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•ด์•ผํ•œ๋‹ค.

  • HATEOAS(Hypermedia as the Engine of Application State) : API ์‘๋‹ต์—๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด ๋งํฌ๋ฅผ ํฌํ•จํ•˜์—ฌ
    ํด๋ผ์ด์–ธํŠธ๊ฐ€ API์˜ ์ƒํƒœ์™€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ž‘์—…์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๐ŸŸข RESTful API ์ตœ์ ํ™” ์ „๋žต

  • ์บ์‹ฑ ํ™œ์šฉ : ์บ์‹ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ด์ „์— ์š”์ฒญ๋œ ์ž์›์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

  • ์••์ถ• ๋ฐ ์••์ถ• ํ•ด์ œ : ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ• ์ „์†กํ•˜์—ฌ ์ „์†ก ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ  ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ์„ ์ ˆ์•ฝํ•œ๋‹ค.
    ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์‘๋‹ต์„ ์••์ถ• ํ•ด์ œํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค.

  • ํŽ˜์ด์ง•(Pagination) : ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ, API ์‘๋‹ต์„ ํŽ˜์ด์ง€๋ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ „์†กํ•˜๊ณ ,
    ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  • ์ ์ ˆํ•œ ํ•„ํ„ฐ๋ง๊ณผ ์ •๋ ฌ : ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ํ•„ํ„ฐ๋ง ๋ฐ ์ •๋ ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ
    ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

4. RESTful API์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํ˜ธ์ž‘์šฉ


๐ŸŸข ์š”์ฒญ๊ณผ ์‘๋‹ต์˜ ํ๋ฆ„์— ๊ด€ํ•˜์—ฌ

RESTful API์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํ˜ธ์ž‘์šฉ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์œผ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” HTTP๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š”๋ฐ ํ•ด๋‹น ์š”์ฒญ์—๋Š” ์ž์›(Resource)์— ๋Œ€ํ•ด
์›ํ•˜๋Š” ์ž‘์—…์„ ํ•จ๊ป˜ ์ „์†กํ•œ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•„์š”์— ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์—๋Š” ํ—ค๋”์— ์ถ”๊ฐ€ ์ •๋ณด๋‚˜ ์ธ์ฆ ํ† ํฐ ๋“ฑ์„
ํฌํ•จํ•ด์„œ ๋ณด๋‚ด๊ณ , ๋ฐ์ดํ„ฐ๋Š” ์š”์ฒญ์— JSON ํ˜•์‹ ๋“ฑ์œผ๋กœ ํฌํ•จํ•ด์„œ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ๋งˆ์น˜๋ฉด, API ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์„œ๋ฒ„๋Š” ์š”์ฒญ๋œ ์ž์›์ด๋‚˜ ์ž‘์—…์— ๋Œ€ํ•ด ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ DB๋‚˜ ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์—ฐ๊ณ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
๋˜ํ•œ, ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ๊ฒ€์ฆ, ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋“ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด, ์„œ๋ฒ„๋Š” ์‘๋‹ต์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์‘๋‹ต์€ HTTP ์ƒํƒœ ์ฝ”๋“œ, ํ—ค๋”, ๋ฐ์ดํ„ฐ ๋ณธ๋ฌธ ๋“ฑ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
HTTP ์ฝ”๋“œ๋Š” 200 OK, 201 Created, 400 Bad Request, 404 Not Found, 500 Internal Server Error ๋“ฑ์ด ์žˆ๋‹ค.
์‘๋‹ต์˜ ๋‚ด์šฉ์—๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๊ณ  ๋Œ€๊ฐœ JSON ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค.

์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ์‘๋‹ต์˜ ์ƒํƒœ๋ฅผ ํŒ๋‹จํ•˜๊ณ , ์‘๋‹ต ๋‚ด์šฉ์— ํ‘œ๊ธฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณต ๋ฐ ํ™œ์šฉํ•ด
์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ๋‹ค์Œ ์š”์ฒญ์— ํ™œ์šฉํ•œ๋‹ค.

5. RESTful API์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜


๐ŸŸข RESTful API์˜ ํ™•์žฅ์„ฑ

RESTful API๋Š” ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๋˜, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ฐ™์€ API ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์กฐ์ ˆํ•˜๊ณ  ๋ถ„์‚ฐ๋œ ์„œ๋ฒ„๋“ค ๊ฐ„์˜ ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ API ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋กœ ํ™•์žฅํ•˜๋ฉด ๋” ๋งŽ์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

RESTful API๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ์ž‘์€ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋œ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๊ฐ๊ฐ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” RESTful API๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•œ๋‹ค.
๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ RESTful API๋ฅผ ํ†ตํ•ด ๋ถ„๋ฆฌํ•˜๋ฉด ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ ์šฉ์ดํ•ด์ง„๋‹ค.

RESTful API๋Š” HTTP์˜ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
๋™์ผํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์บ์‹œ ์„œ๋ฒ„์— ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต ์š”์ฒญ์„ ์ค„์ด๊ณ  ์‘๋‹ต ์‹œ๊ฐ„์„ ์ค„์—ฌ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๊ณ  ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

์ด๋Ÿฌํ•œ ํ™•์žฅ์„ฑ ์ „๋žต์€ ๋Œ€๊ทœ๋ชจ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ์ค‘์š”ํ•œ๋ฐ,
RESTfulAPI๋ฅผ ์ˆ˜ํ‰์ ์œผ๋กœ ํ™•์žฅ์‹œํ‚ค๊ณ  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋”์šฑ ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.


๐ŸŸข RESTful API์˜ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅ์„ฑ

RESTful API์˜ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ์™€ HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค.
๋ง๋ถ™ํ˜€, API ๋””์ž์ธ ์›์น™์„ ํ†ตํ•œ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์ž‘์—… ๋ฐฉ์‹์€ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค.
์ด๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ, ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ž‘์—… ์†๋„๋ฅผ ๋†’์—ฌ์ค€๋‹ค.

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

RESTful API๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์„œ๋ฒ„ ์ธก์—์„œ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ฐ„์†Œํ™”ํ•œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋งŒํ•˜๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ์—
์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๋กœ์ง ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Š” ํด๋ผ์ด์–ธํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ๋‚ฎ์ถ”๊ณ , ์„œ๋ฒ„์ธก์—์„œ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜์—ฌ ์ค‘๋ณต์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ฐ€๋Šฅ์ผ€ํ•œ๋‹ค.

RESTful API๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŒ… ๋ฐ ๋””๋ฒ„๊น…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.
๊ฐ API ์—”๋“œํฌ์ธํŠธ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ฐ ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ตœ์‹  ์•ฑ ๊ฐœ๋ฐœ ๋™ํ–ฅ์—์„œ ์ด๋Ÿฌํ•œ RESTful API์˜ ์ค‘์š”์„ฑ์€ ์ ์  ๋” ๊ฐ•์กฐ๋˜๊ณ  ์žˆ๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ ์  ๋” ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ๋˜์–ด๊ฐ„๋‹ค.