# REST, RESTful API๋ž€?

img

# ๐ŸงฑPreference

Windows10
python 3.7 ์ด์ƒ
Git Bash
Django ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…
HTTP Method


โœ ๊ณต๋ถ€๋ฅผ ํ•˜๊ธฐ์— ์•ž์„œ

๋‹ค์†Œ ๊ฐœ๋…์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•„์š”. ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด๋„ ์‹ค์Šต์„ ํ•˜๋ฉด์„œ

์‹ค์ œ๋กœ REST๋ฅผ ๊ตฌํ˜„ํ•ด๋ณธ ์ดํ›„, ๋‹ค์‹œ ์ฝ์–ด๋ณด๋ฉด ๋” ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์‹ค๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!


# 1. ์™œ ๋ฐฐ์›Œ์•ผํ•ด์š”?

์ง€๊ธˆ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋˜ Django app๋“ค๋„ ์„œ๋น„์Šคํ•˜๊ธฐ์— ํฐ ๋ฌด๋ฆฌ๊ฐ€ ์—†์–ด๋ณด์ด๋Š”๋ฐ

์™œ RESTful API๋ฅผ ๋ฐฐ์›Œ์•ผํ•˜๋Š”์ง€, REST๋Š” ๋ญ”์ง€, ํ•˜๋‹ค๋ชปํ•ด API๋Š” ๋ญ”์ง€๋„ ์ •ํ™•ํžˆ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

RESTful API๊ฐ€ ํ•„์š”ํ•œ ๊ฐ„๋‹จํ•œ ์ด์œ ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์‹œ์Šคํ…œ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ปค์งˆ์ˆ˜๋ก,

์‚ฌ์šฉ์ž(ํด๋ผ์ด์–ธํŠธ)๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ํ†ตํ•ฉ, ๋ถ„๋ฆฌ, ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


# 2. API๋Š” ๋ญ์—์š”?

๊ทธ๋Ÿผ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ API๋ฅผ ์ดํ•ดํ•ด๋ณผ๊ฒŒ์š”!

# โน 2.1 ๋„์„œ ํŒ๋งค ํšŒ์‚ฌ - ์„œ์  ์ง์›

ํ•œ๊ฐ€์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด ๋„์„œ๋ฅผ ์œ ํ†ตํ•˜๋Š” ํšŒ์‚ฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.

์ด ๋„์„œ ์œ ํ†ต์—…์ฒด์—์„œ ๊ฐ ๊ณ ๊ฐ์—๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜์—ฌ ์„œ์  ์ง์›์ด ์œ ํ†ต ์—…์ฒด์˜

๋„์„œ ์žฌ๊ณ ๋ฅผ ํ™•์ธํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ๋งŽ์€ ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์ด

๋“ค๊ณ  ํ”Œ๋žซํผ์˜ ์ œ์•ฝ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง€์†์ ์ธ ์œ ์ง€๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ฒ ์ฃ .

์ด๋Ÿฐ ์ƒํ™ฉ์— ์žฌ๊ณ  ํ™•์ธ์šฉ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด API๋ฅผ ํ†ตํ•˜๋ฉด ๋„์„œ ์œ ํ†ต์—…์ฒด์—์„œ ๊ฐ ๋‹ค๋ฅธ ์„œ์  ์ง์›์ด ์žฌ๊ณ  ํ™•์ธ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„

ํšจ์œจ์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


# โน 2.2 ์Œ์‹์ ์˜ ์†๋‹˜ - ์š”๋ฆฌ์‚ฌ

๋” ์‰ฌ์šด ์˜ˆ๋ฅผ ๋“ค์–ด๋ด…์‹œ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ๋ ˆ์Šคํ† ๋ž‘์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

์š”๋ฆฌ๋ฅผ ํ•˜์‹œ๋Š” ์š”๋ฆฌ์‚ฌ๋ถ„์ด ์ง์ ‘ ์ฃผ๋ฌธ์„ ๋ฐ›๊ณ  ์š”๋ฆฌ๋„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด

์ฃผ๋ฌธ์ด ๋งŽ์ด ๋ฐ€๋ฆฌ๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ์‹ค์ œ ๋ ˆ์Šคํ† ๋ž‘์—๋Š” ์ ์›์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

img
(โ–ฒ ์ถœ์ฒ˜ : http://blog.wishket.com/)

  1. ์ ์›์ด ์ฃผ๋ฌธ์„ ๋ฐ›์•„ ์š”๋ฆฌ์‚ฌ์—๊ฒŒ ์š”์ฒญ
  2. ์š”๋ฆฌ์‚ฌ๋Š” ์Œ์‹์„ ๋งŒ๋“ค์–ด์„œ ์ ์›์—๊ฒŒ ์ „๋‹ฌ
  3. ์ ์›์€ ์†๋‹˜์—๊ฒŒ ์ฃผ๋ฌธํ•œ ์Œ์‹์„ ์ œ๊ณต

์—ฌ๊ธฐ์„œ ์ ์›์€ API์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

API๋Š” ์†๋‹˜(ํ”„๋กœ๊ทธ๋žจ)์ด ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ”๋‰ด(๋ช…๋ น ๋ชฉ๋ก)๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ์ฃผ๋ฌธ(๋ช…๋ น)์„ ๋ฐ›์œผ๋ฉด ์š”๋ฆฌ์‚ฌ(์‘์šฉํ”„๋กœ๊ทธ๋žจ)์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜์—ฌ ์š”์ฒญ๋œ ๋ฉ”๋‰ด(๋ช…๋ น์— ๋Œ€ํ•œ ๊ฐ’)๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด, API๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


API : Application Programmin Interface

์กฐ๊ธˆ ๋” ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋‹ค์šด ์˜ˆ์‹œ๋ฅผ ๋“ค๋ฉด ์นด์นด์˜ค ์•Œ๋ฆผํ†ก์„ ์ƒ๊ฐํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

์ฃผ๋ฌธ ์•Œ๋ฆผ, ์ฒญ๊ตฌ์„œ, ์˜ˆ์•ฝ ์•Œ๋ฆผ, ๋ฐฐ์†ก ์•Œ๋ฆผ ๋“ฑ ์—ฌ๋Ÿฌ ์•Œ๋ฆผ๋“ค์ด ์š”์ฆ˜์€ ์นด์นด์˜ค ์•Œ๋ฆผํ†ก์„ ํ†ตํ•ด

์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก๋˜๋Š” ๊ฒƒ์„ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ฒฝํ—˜ํ•˜์‹ค ์ˆ˜ ์žˆ์„๊ฑฐ์—์š”.

์ด๋ ‡๊ฒŒ ๋งŽ์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํšŒ์‚ฌ์—์„œ ๋ชจ๋‘ ์นด์นด์˜ค ์•Œ๋ฆผํ†ก์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ

์นด์นด์˜ค๋Š” ์•Œ๋ฆผํ†ก API๋ฅผ ์ž˜ ๋งŒ๋“ค์–ด ๋‘์—ˆ๊ณ , ์‚ฌ์šฉํ•˜๋Š” ํšŒ์‚ฌ์—์„œ๋Š” ์นด์นด์˜ค ์•Œ๋ฆผํ†ก์ด ๋‚ด๋ถ€์ ์œผ๋กœ

์–ด๋–ป๊ฒŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋˜์—ˆ๋Š”์ง€, ํ†ต์‹  ๋ฐฉ์‹์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋“ฑ์„ ์ „ํ˜€ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ API๋Š” ๋ˆ„๊ตฐ๊ฐ€(์นด์นด์˜ค)๊ฐ€ ๋งŒ๋“  ์„œ๋น„์Šค๋ฅผ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€(๊ธฐ์—…, ๊ธฐ๊ด€, ๊ฐœ์ธ ๊ฐœ๋ฐœ์ž)์—๊ฒŒ

์ œ๊ณตํ•˜์—ฌ ๊ธฐ๋Šฅ, ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ๋„์™€์ฃผ๋Š” ์ค‘๊ฐ„ ๋งค๊ฐœ์ฒด ๋กœ ๋ฐ”๊พธ์–ด ์–˜๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


# 3. REST๋Š” ๋ญ์—์š”?

# โน 3.1 REST์˜ ํƒ„์ƒ

๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„ ์ ์–ด๋‘์—ˆ์ง€๋งŒ ๊ทธ๋ ‡๊ตฌ๋‚˜~ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!๐Ÿ˜ƒ

REST๋Š” Representational State Transfer๋ผ๋Š” ์šฉ์–ด์˜ ์•ฝ์ž๋กœ์„œ 2000๋…„๋„์— ๋กœ์ด ํ•„๋”ฉ (Roy Fielding)์˜ ๋ฐ•์‚ฌํ•™์œ„ ๋…ผ๋ฌธ์—์„œ ์ตœ์ดˆ๋กœ ์†Œ๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋กœ์ด ํ•„๋”ฉ์€ HTTP์˜ ์ฃผ์š” ์ €์ž ์ค‘ ํ•œ ์‚ฌ๋žŒ์œผ๋กœ ๊ทธ ๋‹น์‹œ ์›น(HTTP) ์„ค๊ณ„์˜ ์šฐ์ˆ˜์„ฑ์— ๋น„ํ•ด ์ œ๋Œ€๋กœ ์‚ฌ์šฉ๋˜์–ด์ง€์ง€ ๋ชปํ•˜๋Š” ๋ชจ์Šต์— ์•ˆํƒ€๊นŒ์›Œํ•˜๋ฉฐ ์›น์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ์จ REST๋ฅผ ๋ฐœํ‘œํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


# โน 3.2 REST ๋ž€?

Representational State Transfer

REST๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด๋ผ๋Š”๊ฑด ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜์—์„œ ๋‹ค์‹œ ์‚ดํŽด๋ด…์‹œ๋‹ค!


# โน 3.3 RSETful์€์š”?

RESTful์€ ์œ„์˜ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ง‘ํ•ฉ(์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ, ์•„ํ‚คํ…์ฒ˜ ์›์น™)์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

REST๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด ์žˆ๋Š”๊ฑฐ๊ณ  RESTful API๋ผ๋Š” ๋ง์€ REST ์•„ํ‚คํ…์ฒ˜ ์›์น™์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” API๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์œ„์™€๊ฐ™์ด ๋ถ„๋ช…ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์ง€๋งŒ REST API ์™€ RESTful API๋Š” ๊ฑฐ์˜ ๊ฐ™์€ ์˜๋ฏธ๋กœ ํ˜ผ์šฉ๋˜์–ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

  2. Cacheable (์บ์‹œ ๊ฐ€๋Šฅ) REST์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” HTTP๋ผ๋Š” ๊ธฐ์กด ์›นํ‘œ์ค€์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP๊ฐ€ ๊ฐ€์ง„ ์บ์‹ฑ ๊ธฐ๋Šฅ์ด ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. HTTP ํ”„๋กœํ† ์ฝœ ํ‘œ์ค€์—์„œ ์‚ฌ์šฉํ•˜๋Š” Last-Modifiedํƒœ๊ทธ๋‚˜ E-Tag๋ฅผ ์ด์šฉํ•˜๋ฉด ์บ์‹ฑ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  3. Self-descriptiveness (์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ) REST์˜ ๋˜ ๋‹ค๋ฅธ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” REST API ๋ฉ”์‹œ์ง€๋งŒ ๋ณด๊ณ ๋„ ์ด๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ‘œํ˜„ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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


# โน 3.4 REST๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š”์š”?

1. ์œ„์—์„œ ๋งํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์„ ์œ„ํ•ด์„œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ๋ถ„์‚ฐํ•ด์•ผํ–ˆ๋‹ค.

๊ฑฐ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ชจ๋“ˆ, ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

RESTful API๋ฅผ ์„œ๋น„์Šคํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์–ด๋–ค ๋‹ค๋ฅธ ๋ชจ๋“ˆ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด๋ผ๋„

RESTful API๋ฅผ ํ†ตํ•ด ์ƒํ˜ธ๊ฐ„์— ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!

2. WEB๋ธŒ๋ผ์šฐ์ € ์™ธ์˜ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•ด์„œ(๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ)

Back-end ํ•˜๋‚˜๋กœ ๋‹ค์–‘ํ•œ Device๋ฅผ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

์›น ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ HTML ๋ฐ ์ด๋ฏธ์ง€๋“ฑ์„ ๋ณด๋‚ด๋˜ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ์ด์ œ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋ณด๋‚ด๋ฉด ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

์„œ๋ฒ„๋„ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊น”๋”ํ•˜๊ฒŒ ๋ณด๋‚ด์ฃผ๋ฉด๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ฒผ์›Œ์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ๋„ ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

โœ ๋”ฐ๋ผ์„œ RESTful API๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


์œ„์—์„œ ์„ค๋ช…ํ•œ ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์ž์„ธํ•œ ์„ค๋ช…์ด ์žˆ์œผ๋‹ˆ ์ดํ•ด๊ฐ€ ์–ด๋ ค์šฐ์‹œ๋ฉด ์ฝ์–ด๋ณด์„ธ์š”!

โœ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ๋“ฑ์žฅ์— ๋Œ€ํ•ด

์Šค๋งˆํŠธํฐ์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „ IT ๊ธฐ์—…๋“ค์€ ์›น ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์›น์„œ๋ฒ„๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋์Šต๋‹ˆ๋‹ค. ๊ทธ ์›น ์„œ๋ฒ„์—์„œ DB ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋„ ์ฝ์–ด์˜ค๊ณ  ์‚ฌ์šฉ์ž๋“ค์ด ๊ธ€์„ ๋‚จ๊ธฐ๋ฉด DB ์„œ๋ฒ„์— ์ €์žฅ๊นŒ์ง€ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๋‹ด๋‹นํ–ˆ์ฃ . ํ•˜์ง€๋งŒ ์Šค๋งˆํŠธํฐ์ด ์ถœ์‹œ๋˜๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋“ฑ์žฅ์œผ๋กœ ๋”์ด์ƒ ์›น์œผ๋กœ๋งŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

Django ๋˜ํ•œ View ํด๋ž˜์Šค ์ž์ฒด๊ฐ€ RESTful ํ•œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ธฐ์— ์ตœ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.


# 4. REST์˜ ๊ธฐ๋ณธ

REST์˜ ๊ฐœ๋…์ ์ธ ๋‚ด์šฉ์€ ์œ„์—์„œ ๋‹ค๋ฃจ์—ˆ๊ณ , ๊ธฐ๋Šฅ์ ์ธ ์˜๋ฏธ๋ฅผ ์‚ดํŽด๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

REST์˜ ๊ธฐ๋Šฅ์ ์ธ ์˜๋ฏธ๋Š”, ์›น์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ์ž์›(์ด๋ฏธ์ง€, ๋™์˜์ƒ, DB ์ž์›)์— ๊ณ ์œ ํ•œ URI๋ฅผ ๋ถ€์—ฌํ•ด ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ์ž์›์„ ์ •์˜ํ•˜๊ณ  ์ž์›์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

HTTP์˜ URL๊ณผ HTTP Method(GET, POST, PUT, DELETE)๋ฅผ ์‚ฌ์šฉํ•ด์„œ API ๊ฐ€๋…์„ฑ์„ ๋†’์ธ ๊ตฌ์กฐํ™”๋œ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ๋กœ ํ•˜๋‚˜์˜ URL๋กœ 4๊ฐ€์ง€์˜ HTTP Nethod๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


# โน 4.1 REST์˜ ๊ตฌ์„ฑ

REST์˜ ์š”์†Œ๋Š” ํฌ๊ฒŒ ๋ฆฌ์†Œ์Šค,๋ฉ”์„œ๋“œ,๋ฉ”์„ธ์ง€ 3๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ž์›(Resource) : URI
  • ํ–‰์œ„(Verb) : HTTP Method
  • ํ‘œํ˜„(Representations) : ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ(JSON, XML, text ...)

โœ URI ์™€ HTTP Method๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ทธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ JSONํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.


# โน 4.2 HTTP Method ?

Method ์—ญํ• 
POST POST๋ฅผ ํ†ตํ•ด ํ•ด๋‹น URI๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ
GET GET๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒ, ํ•ด๋‹น ๋„ํ๋จผํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ด
PUT PUT๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •
DELETE DELETE๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ URI๋Š” (HTTP ์˜๋„์— ๋งž๊ฒŒ)์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์— ์ง‘์ค‘ํ•˜๊ณ  ํ–‰์œ„์— ๋Œ€ํ•œ ์ •์˜๋Š” HTTP Method๋ฅผ ํ†ตํ•ด ํ•˜๋Š” ๊ฒƒ์ด RESTํ•œ API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ์ค‘์‹ฌ ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

โœ URI๋กœ ์ฃผ์–ด๋‚˜ ๋ชฉ์ ์–ด๋ฅผ ๋งŒ๋“ค๊ณ , HTTP Method๋กœ ๋™์‚ฌ๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.


# 5. REST API ๋””์ž์ธ ๊ฐ€์ด๋“œ

REST API ์„ค๊ณ„ ์‹œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์€ ๋‹ค์Œ์˜ 2๊ฐ€์ง€๋กœ ์š”์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ, URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ, ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method(GET, POST, PUT, DELETE)๋กœ ํ‘œํ˜„ํ•œ๋‹ค.

๋‹ค๋ฅธ ๊ฒƒ์€ ๋‹ค ์žŠ์–ด๋„ ์œ„ ๋‚ด์šฉ์€ ๊ผญ ๊ธฐ์–ตํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค!๐Ÿ˜Š


# โน 5.1 REST API ์ค‘์‹ฌ ๊ทœ์น™

# 1) URI๋Š” ์ •๋ณด์˜ ์ž์›์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค. (๋ฆฌ์†Œ์Šค๋ช…์€ ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ ์‚ฌ์šฉ)

GET /members/delete/1

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ REST๋ฅผ ์ œ๋Œ€๋กœ ์ ์šฉํ•˜์ง€ ์•Š์€ URI์ž…๋‹ˆ๋‹ค.

URI๋Š” ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ค‘์ ์„ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. delete์™€ ๊ฐ™์€ ํ–‰์œ„์— ๋Œ€ํ•œ ํ‘œํ˜„์ด ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

# 2) ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„๋Š” HTTP Method(GET, POST, PUT, DELETE ๋“ฑ)๋กœ ํ‘œํ˜„

์œ„์˜ ์ž˜๋ชป ๋œ URI๋ฅผ HTTP Method๋ฅผ ํ†ตํ•ด ์ˆ˜์ •ํ•ด ๋ณด๋ฉด

DELETE /members/1

์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํšŒ์›์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” GET, ํšŒ์› ์ถ”๊ฐ€ ์‹œ์˜ ํ–‰์œ„๋ฅผ ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š” POST METHOD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

ํšŒ์›์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” URI

    GET /members/show/1     (x)
    GET /members/1          (o)

ํšŒ์›์„ ์ถ”๊ฐ€ํ•  ๋•Œ

    GET /members/insert/2 (x)  - GET ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์— ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    POST /members/2       (o)

# โน 5.2 URI ์„ค๊ณ„ ์‹œ ์ฃผ์˜ํ•  ์ 

# 1) ์Šฌ๋ž˜์‹œ ๊ตฌ๋ถ„์ž(/)๋Š” ๊ณ„์ธต ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ

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

# 2) URI ๋งˆ์ง€๋ง‰ ๋ฌธ์ž๋กœ ์Šฌ๋ž˜์‹œ(/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

URI์— ํฌํ•จ๋˜๋Š” ๋ชจ๋“  ๊ธ€์ž๋Š” ๋ฆฌ์†Œ์Šค์˜ ์œ ์ผํ•œ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋ฉฐ URI๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์—ญ์œผ๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‹ค๋ฅด๋ฉด URI๋„ ๋‹ฌ๋ผ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

REST API๋Š” ๋ถ„๋ช…ํ•œ URI๋ฅผ ๋งŒ๋“ค์–ด ํ†ต์‹ ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™์„ ์ฃผ์ง€ ์•Š๋„๋ก URI ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰์—๋Š” ์Šฌ๋ž˜์‹œ(/)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    http://restapi.example.com/houses/apartments/ (X)
    http://restapi.example.com/houses/apartments  (0)

# 3) ํ•˜์ดํ”ˆ(-)์€ URI ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š”๋ฐ ์‚ฌ์šฉ

URI๋ฅผ ์‰ฝ๊ฒŒ ์ฝ๊ณ  ํ•ด์„ํ•˜๊ธฐ ์œ„ํ•ด, ๋ถˆ๊ฐ€ํ”ผํ•˜๊ฒŒ ๊ธด URI๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ํ•˜์ดํ”ˆ์„ ์‚ฌ์šฉํ•ด ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# 4) ๋ฐ‘์ค„(_)์€ URI์— ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ธ€๊ผด์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธด ํ•˜์ง€๋งŒ ๋ฐ‘์ค„์€ ๋ณด๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๋ฐ‘์ค„ ๋•Œ๋ฌธ์— ๋ฌธ์ž๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ‘์ค„ ๋Œ€์‹  ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.(๊ฐ€๋…์„ฑ)

# 5) URI ๊ฒฝ๋กœ์—๋Š” ์†Œ๋ฌธ์ž๊ฐ€ ์ ํ•ฉํ•˜๋‹ค.

URI ๊ฒฝ๋กœ์— ๋Œ€๋ฌธ์ž ์‚ฌ์šฉ์€ ํ”ผํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์†Œ๋ฌธ์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. RFC 3986(URI ๋ฌธ๋ฒ• ํ˜•์‹)์€ URI ์Šคํ‚ค๋งˆ์™€ ํ˜ธ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•˜๋„๋ก ๊ทœ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€์š”.

    RFC 3986 is the URI (Unified Resource Identifier) Syntax document

# 6) ํŒŒ์ผ ํ™•์žฅ์ž๋Š” URI์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

    http://restapi.example.com/members/soccer/345/photo.jpg (X)

REST API์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ”๋”” ๋‚ด์šฉ์˜ ํฌ๋งท์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ URI ์•ˆ์— ํฌํ•จ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Accept header๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ์‹œ๋‹ค.

    GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg

# โน 5.3 ๋ฆฌ์†Œ์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

REST ๋ฆฌ์†Œ์Šค ๊ฐ„์—๋Š” ์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‘œํ˜„๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    /๋ฆฌ์†Œ์Šค๋ช…/๋ฆฌ์†Œ์Šค ID/๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ช…

    ex)    GET : /users/{userid}/devices (์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ์œ  โ€˜hasโ€™์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ)

๋งŒ์•ฝ์— ๊ด€๊ณ„๋ช…์ด ๋ณต์žกํ•˜๋‹ค๋ฉด ์ด๋ฅผ ์„œ๋ธŒ ๋ฆฌ์†Œ์Šค์— ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ โ€˜์ข‹์•„ํ•˜๋Š”โ€™ ๋””๋ฐ”์ด์Šค ๋ชฉ๋ก์„ ํ‘œํ˜„ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    GET : /users/{userid}/likes/devices (๊ด€๊ณ„๋ช…์ด ์• ๋งคํ•˜๊ฑฐ๋‚˜ ๊ตฌ์ฒด์  ํ‘œํ˜„์ด ํ•„์š”ํ•  ๋•Œ)

# โน 5.4 ์ž์›์„ ํ‘œํ˜„ํ•˜๋Š” Colllection ๊ณผ Document

Collection๊ณผ Document์— ๋Œ€ํ•ด ์•Œ๋ฉด URI ์„ค๊ณ„๊ฐ€ ํ•œ ์ธต ๋” ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

DOCUMENT๋Š” ๋‹จ์ˆœํžˆ ๋ฌธ์„œ๋กœ ์ดํ•ดํ•ด๋„ ๋˜๊ณ , ํ•œ ๊ฐ์ฒด๋ผ๊ณ  ์ดํ•ดํ•˜์…”๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Collection์€ ๋ฌธ์„œ๋“ค์˜ ์ง‘ํ•ฉ, ๊ฐ์ฒด๋“ค์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ์ดํ•ดํ•˜์‹œ๋Š”๋ฐ ์ข€ ๋” ํŽธํ•˜์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ปฌ๋ ‰์…˜๊ณผ ๋„ํ๋จผํŠธ๋Š” ๋ชจ๋‘ ๋ฆฌ์†Œ์Šค๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ URI์— ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

    http:// restapi.example.com/sports/soccer

์œ„ URI๋ฅผ ๋ณด์‹œ๋ฉด sports๋ผ๋Š” ์ปฌ๋ ‰์…˜๊ณผ soccer๋ผ๋Š” ๋„ํ๋จผํŠธ๋กœ ํ‘œํ˜„๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ข€ ๋” ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž๋ฉด

    http:// restapi.example.com/sports/soccer/players/13

sports, players ์ปฌ๋ ‰์…˜๊ณผ soccer, 13(13๋ฒˆ์ธ ์„ ์ˆ˜)๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋„ํ๋จผํŠธ๋กœ URI๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์ ์€ ์ปฌ๋ ‰์…˜์€ ๋ณต์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ข€ ๋” ์ง๊ด€์ ์ธ REST API๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ปฌ๋ ‰์…˜๊ณผ ๋„ํ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ์ˆ˜ ๋ณต์ˆ˜๋„ ์ง€์ผœ์ค€๋‹ค๋ฉด ์ข€ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด URI๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


# 6. REST์˜ ์žฅ๋‹จ์ 

# โน 6.1 ์žฅ์ 

  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ REST API ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • HTTP ํ”„๋กœํ† ์ฝœ์˜ ํ‘œ์ค€์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ถ”๊ฐ€์ ์ธ ์žฅ์ ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  • HTTP ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • Hypermedia API์˜ ๊ธฐ๋ณธ์„ ์ถฉ์‹คํžˆ ์ง€ํ‚ค๋ฉด์„œ ๋ฒ”์šฉ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  • REST API ๋ฉ”์‹œ์ง€๊ฐ€ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„œ๋น„์Šค ๋””์ž์ธ์—์„œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค.
  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค.

# โน 6.2 ๋‹จ์ 

  • ํ‘œ์ค€์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐ๊ตญ์€ API ๋ฌธ์„œ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ์ด์œ ๋‹ค.
  • ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” HTTP Method ํ˜•ํƒœ๊ฐ€ ์ œํ•œ์ (4๊ฐ€์ง€)์ด๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•  ์ผ์ด ๋งŽ์€ ์„œ๋น„์Šค๋ผ๋ฉด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” URL๋ณด๋‹ค Header ๊ฐ’์ด ์™ ์ง€ ๋” ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง„๋‹ค.
  • ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„์ง ์ œ๋Œ€๋กœ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•œ๋‹ค.
    • PUT, DELETE๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ์ 
    • pushState๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์ 

# Reference

  • http://blog.wishket.com/
  • https://www.redhat.com/ko/topics/api/what-are-application-programming-interfaces
  • https://medium.com/@dydrlaks/api-%EB%9E%80-c0fd6222d34c
  • https://jeong-pro.tistory.com/180
  • https://brainbackdoor.tistory.com/53
  • https://bcho.tistory.com/953
  • https://velog.io/@ejchaid/RESTful-API-%EA%B7%B8%EA%B2%8C-%EB%AD%90%EC%95%BC
  • https://blog.naver.com/pjok1122/221610282758
  • https://meetup.toast.com/posts/92
  • https://velog.io/@jcinsh/Django-DRF-0-%EA%B0%9C%EC%9A%94
  • https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

Last Updated: 9/25/2020, 10:50:12 PM