# REST, RESTful API๋?
# ๐งฑ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 ์์์ ์ ์๋ - ์๋ฆฌ์ฌ
๋ ์ฌ์ด ์๋ฅผ ๋ค์ด๋ด ์๋ค.
์ฌ๋ฌ๋ถ์ด ๋ ์คํ ๋์ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
์๋ฆฌ๋ฅผ ํ์๋ ์๋ฆฌ์ฌ๋ถ์ด ์ง์ ์ฃผ๋ฌธ์ ๋ฐ๊ณ ์๋ฆฌ๋ ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด
์ฃผ๋ฌธ์ด ๋ง์ด ๋ฐ๋ฆฌ๊ฒ ์ฃ ? ๊ทธ๋์ ์ค์ ๋ ์คํ ๋์๋ ์ ์์ด ์กด์ฌํฉ๋๋ค.
(โฒ ์ถ์ฒ : http://blog.wishket.com/)
์ ์
์ด ์ฃผ๋ฌธ์ ๋ฐ์์๋ฆฌ์ฌ
์๊ฒ ์์ฒญ์๋ฆฌ์ฌ
๋ ์์์ ๋ง๋ค์ด์์ ์
์๊ฒ ์ ๋ฌ์ ์
์์๋
์๊ฒ ์ฃผ๋ฌธํ ์์์ ์ ๊ณต
์ฌ๊ธฐ์ ์ ์์ 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๋ก ์ง์ ํ ๋ฆฌ์์ค์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํํ๋ ์ํคํ ์ฒ ์คํ์ผ์ ๋งํฉ๋๋ค.Stateless (๋ฌด์ํ์ฑ) REST๋ ๋ฌด์ํ์ฑ ์ฑ๊ฒฉ์ ๊ฐ์ต๋๋ค. ๋ค์ ๋งํด ์์ ์ ์ํ ์ํ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์์ต๋๋ค. ์ธ์ ์ ๋ณด๋ ์ฟ ํค์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ API ์๋ฒ๋ ๋ค์ด์ค๋ ์์ฒญ๋ง์ ๋จ์ํ ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋๋ค. ๋๋ฌธ์ ์๋น์ค์ ์์ ๋๊ฐ ๋์์ง๊ณ ์๋ฒ์์ ๋ถํ์ํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์ง ์์์ผ๋ก์จ ๊ตฌํ์ด ๋จ์ํด์ง๋๋ค.
Cacheable (์บ์ ๊ฐ๋ฅ) REST์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ HTTP๋ผ๋ ๊ธฐ์กด ์นํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ํ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ๋ผ์ HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ด ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค. HTTP ํ๋กํ ์ฝ ํ์ค์์ ์ฌ์ฉํ๋ Last-Modifiedํ๊ทธ๋ E-Tag๋ฅผ ์ด์ฉํ๋ฉด ์บ์ฑ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
Self-descriptiveness (์์ฒด ํํ ๊ตฌ์กฐ) REST์ ๋ ๋ค๋ฅธ ํฐ ํน์ง ์ค ํ๋๋ REST API ๋ฉ์์ง๋ง ๋ณด๊ณ ๋ ์ด๋ฅผ ์ฝ๊ฒ ์ดํด ํ ์ ์๋ ์์ฒด ํํ ๊ตฌ์กฐ๋ก ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค.
Client - Server ๊ตฌ์กฐ REST ์๋ฒ๋ API ์ ๊ณต, ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธ์ฆ์ด๋ ์ปจํ ์คํธ(์ธ์ , ๋ก๊ทธ์ธ ์ ๋ณด)๋ฑ์ ์ง์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๊ฐ๊ฐ์ ์ญํ ์ด ํ์คํ ๊ตฌ๋ถ๋๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ๊ฐ๋ฐํด์ผ ํ ๋ด์ฉ์ด ๋ช ํํด์ง๊ณ ์๋ก๊ฐ ์์กด์ฑ์ด ์ค์ด๋ค๊ฒ ๋ฉ๋๋ค.
๊ณ์ธตํ ๊ตฌ์กฐ 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