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) | ์๋ฒ์ชฝ ์๋ฌ |