REST API๋ž€?

Representational State Transfer API์˜ ์•ฝ์ž๋กœ, ๋กœ์ด ํ•„๋”ฉ์˜ ๋…ผ๋ฌธ์—์„œ ์†Œ๊ฐœ๋˜์—ˆ๋‹ค.

๊ตฌ์„ฑ

REST API๋Š”

  • ์ž์›(Resource) - URI
  • ํ–‰์œ„(Verb) - HTTP METHOD
  • ํ‘œํ˜„(Representations) ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

ํŠน์ง•

Uniform(์œ ๋‹ˆํผ ์ธํ„ฐํŽ˜์ด์Šค)

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

Stateless(๋ฌด์ƒํƒœ์„ฑ)

REST๋Š” ๋ฌด์ƒํƒœ์„ฑ ์„ฑ๊ฒฉ์„ ๊ฐ–๋Š”๋‹ค. ์ž‘์—…์„ ์œ„ํ•œ ์ƒํƒœ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ธ์…˜ ์ •๋ณด๋‚˜ ์ฟ ํ‚ค ์ •๋ณด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ๋งŒ์„ ๋‹จ์ˆœํžˆ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์„ธ์…˜์ด๋‚˜ ์ฟ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์„œ๋น„์Šค์˜ ์ž์œ ๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ์„œ๋ฒ„์—์„œ ๋ถˆํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๊ตฌํ˜„์ด ๋‹จ์ˆœํ•ด์ง„๋‹ค.

Cacheable(์บ์‹œ ๊ฐ€๋Šฅ)

HTTP์˜ ์›นํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์บ์‹ฑ ๊ธฐ๋Šฅ ๋“ฑ์„ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

Self-descriptiveness(์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ)

REST API ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ ๋„ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค.

Client - Server๊ตฌ์กฐ

REST ์„œ๋ฒ„๋Š” API ์ œ๊ณต, ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ์ด๋‚˜ ์ปจํ…์ŠคํŠธ(์„ธ์…˜์ด๋‚˜ ๋กœ๊ทธ์ธ ์ •๋ณด)๋“ฑ์„ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๊ฐ๊ฐ์˜ ์—ญํ• ์ด ๊ตฌ๋ถ„๋˜์–ด ์˜์กด์„ฑ์ด ์ค„์–ด๋“ค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํด๋ผ/์„œ๋ฒ„๊ฐ€ ๊ฐœ๋ฐœํ•ด์•ผ ํ•  ๋‚ด์šฉ์ด ๋ช…ํ™•ํ•ด์ง„๋‹ค

๊ณ„์ธตํ˜• ๊ตฌ์กฐ

REST ์„œ๋ฒ„๋Š” ๋‹ค์ค‘ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณด์•ˆ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•ด ๊ตฌ์กฐ์ƒ์˜ ์œ ์—ฐ์„ฑ์„ ๋‘˜ ์ˆ˜ ์žˆ๊ณ  PROXY, ๊ฒŒ์ดํŠธ์›จ์ด ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ์ค‘๊ฐ„๋งค์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๋””์ž์ธ ๊ฐ€์ด๋“œ

REST API ์„ค๊ณ„์— ์žˆ์–ด์„œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ค‘์š” ํ•ญ๋ชฉ๋“ค์€ ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•จ

GET /members/delete/1
  • ๋ฆฌ์†Œ์Šค ๋ช…์€ ๋™์‚ฌ๋ณด๋‹ค ๋ช…์‚ฌ ์‚ฌ์šฉ
  • ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ง‘์ค‘

์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP METHOD๋กœ ํ‘œํ˜„

DELETE /members/1
GET /members
POST /members
PUT /members

์œ„์™€ ๊ฐ™์ด uri์— delete๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ HTTP Method๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ž์›์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ํ–‰์œ„, ์ฆ‰ ์–ด๋– ํ•œ ์กฐ์ž‘์„ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Method์—ญํ• 
POSTํ•ด๋‹น URI(์ž์›)์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ
GETํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์กฐํšŒ ๋ฐ ์ž์„ธํ•œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
PUTํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์ˆ˜์ •
DELETEํ•ด๋‹น ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

์Šฌ๋ž˜์‹œ๋ฅผ ํ†ตํ•ด ๊ณ„์ธต ๊ด€๊ณ„ ๋‚˜ํƒ€๋‚ด๊ธฐ

http://restapi.example.com/animals/mammals/whales

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ํ•˜์œ„ ๊ณ„์ธต์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ

  • ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์— ์Šฌ๋ž˜์‹œ ํฌํ•จํ•˜์ง€ ์•Š์Œ
  • ํ•˜์ดํ”ˆ์„ ํ†ตํ•ด Url ๊ฐ€๋…์„ฑ ๋†’์ด๊ธฐ
  • ์–ธ๋”๋ฐ”(_) ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ
  • URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž ์‚ฌ์šฉ
  • ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URI์— ํฌํ•จ X (ํ—ค๋”๋ฅผ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ด๊ธฐ) ๋“ฑ์ด ์žˆ๋‹ค.

๊ด€๊ณ„ ํ‘œํ˜„

REST ๋ฆฌ์†Œ์Šค ๊ฐ„์— ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ /๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ์†Œ์ŠคID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช… ์˜ ์ˆœ์„œ๋Œ€๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

GET: /users/{userid}/phone
GET: /users/{userid}/favorite/phone

์ด์™€ ๊ฐ™์ด ๊ด€๊ณ„๋ช…์ด ๋ณต์žกํ•  ๊ฒฝ์šฐ์—๋Š” ์„œ๋ธŒ ๋ฆฌ์†Œ์Šค์— ์ถ”๊ฐ€์ ์œผ๋กœ ๋ช…์‹œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

Collection๊ณผ Document์˜ ์ž์› ํ‘œํ˜„

Collection์€ ๋ณต์ˆ˜, Document๋Š” ๋‹จ์ˆ˜๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

Collection vs. Document Collection์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ์•„ ๋†“์€ ์ง‘ํ•ฉ์ด๊ณ , Document๋Š” ์ด๋Ÿฌํ•œ Collection ๋‚ด์˜ ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ex) sports(Collection) - Soccer(Document)

์‘๋‹ต ์ฝ”๋“œ

์ƒํƒœ ์ฝ”๋“œ๋‚ด์šฉ
200 (ok)์ •์ƒ ์ˆ˜ํ–‰(์™„๋ฃŒ)
201 (created)๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ์š”์ฒญ + ๋ฆฌ์†Œ์Šค์˜ ์„ฑ๊ณต์  ์ƒ์„ฑ
400 (Bad Request)ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ๋ถ€์ ์ ˆํ•  ๊ฒฝ์šฐ
401(UnAuthorized)ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ
403(404๋„ ๊ฐ€๋Šฅ)์œ ์ € ์ธ์ฆ์ƒํƒœ์™€ ๊ด€๊ณ„ ์—†์ด ์‘๋‹ตํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ
405(Method Not Allowed)์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ Method ์‚ฌ์šฉ
301(Moved Permanently)์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์˜ URI๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋จ
500(Server Error)์„œ๋ฒ„์ชฝ ์—๋Ÿฌ