REST API
- ์ค๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์น ์๋น์ค ์ ํ ์ค ํ๋
- ๋ธ๋ผ์ฐ์ ์ฑ์ ํฌํจํ ๋ค์ํ ํด๋ผ์ด์ธํธ๊ฐ REST API๋ฅผ ํตํด ์๋ฒ์ ํต์
- stateless ํต์ ๋ฐ ์บ์ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ์ ํน์ ์ํคํ ์ฒ ์ ์ฝ ์กฐ๊ฑด์ ์ค์ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค
- ํ๋กํ ์ฝ์ด๋ ํ์ค์ด ์๋
- ์ฌ๋ฌ ํต์ ํ๋กํ ์ฝ์ ํตํด ์ก์ธ์ค ํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก HTTPS๋ฅผ ํตํด ํธ์ถ๋จ
REST API ๊ตฌ์ฑ
REST : Representational State Transfer๋ผ๋ ์ฉ์ด์ ์ฝ์
- ์์ : URI
- ํ์ : HTTP METHOD
- ํํ
REST ์ ํน์ง
- Uniform Interface
- Stateless
- Caching
- Client-Server
- Hierarchical system
- Code on demand
REST API ๋์์ธ ๊ฐ์ด๋
URI๋ ์์์ ํํํ๋๋ฐ ์ง์คํ๊ณ ํ์์ ๋ํ ์ ์๋ HTTP ๋ฉ์๋๋ฅผ ํตํด ๋ํ๋ธ๋ค.
- URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค : ๋ฆฌ์์ค๋ช ์ ๋์ฌ๋ณด๋ค ๋ช ์ฌ๋ฅผ ์ฌ์ฉํ๋ค.
- ์์์ ๋ํ ํ์๋ HTTP ๋ฉ์๋๋ก ํํํ๋ค.
URI ์ค๊ณ ์ ์ฃผ์ ์ฌํญ
- ์ฌ๋์ (/)๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉํ๋ค.
- ๋ง์ง๋ง ๋ฌธ์๋ก ์ฌ๋์๋ฅผ ํฌํจํ์ง ์๋๋ค.
- ๊ธด URL ๊ฒฝ๋ก์ ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด์ ํ์ดํ(-)์ ์ฌ์ฉํ๋ค.
- ๋ฐ์ค(_)์ URL์ ์ฌ์ฉํ์ง ์๋๋ค.
- URL์ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
- ํ์ผ ํ์ฅ์๋ URI์ ํฌํจ์ํค์ง ์๋๋ค.
๋ฆฌ์์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ
/๋ฆฌ์์ค๋ช /๋ฆฌ์์ค ID/๊ด๊ณ๊ฐ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ช
- ๊ด๊ณ๋ช
์ด ๋ณต์กํ ๊ฒฝ์ฐ ์๋ธ ๋ฆฌ์์ค์ ๋ช
์์ ์ผ๋ก ํํํ๋ค. ex)
GET : /users/{userid}/likes/devices
Colllection๊ณผ Document
- Colllection : ๋ฌธ์๋ค์ ์งํฉ, ๊ฐ์ฒด๋ค์ ์งํฉ. ๋ณต์๋ก ์ฌ์ฉํ๋ค.
- Document : ๋จ์ํ ๋ฌธ์ ํน์ ํ ๊ฐ์ฒด
/games/{id}/score
/games/{id}/load
/games/{id}/move
HTTP ์๋ต ์ํ ์ฝ๋
200
- 200 : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ์์ ์ผ๋ก ์ํํจ
- 201 : ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ ํ ๋ฆฌ์์ค ์์ฑ์ ์์ฒญ, ํด๋น ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋จ(POST๋ฅผ ํตํ ๋ฆฌ์์ค ์์ฑ ์์ ์)
400
- 400 : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ถ์ ์ ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
- 401 : ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ๋์ง ์์ ์ํ์์ ๋ณดํธ๋ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ์ ๋ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
- 403 : ์ ์ ์ธ์ฆ์ํ์ ๊ด๊ณ ์์ด ์๋ตํ๊ณ ์ถ์ง ์์ ๋ฆฌ์์ค๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ์ ๋ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
- 404 : ์๋ฒ๊ฐ ์์ฒญํ ํ์ด์ง(Resource)๋ฅผ ์ฐพ์ ์ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
ect
- 301 : ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ฆฌ์์ค์ ๋ํ URI๊ฐ ๋ณ๊ฒฝ ๋์์ ๋ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
- 500 : ์๋ฒ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
์ฐธ๊ณ
REST API ์ ๋๋ก ์๊ณ ์ฌ์ฉํ๊ธฐ : NHN Cloud Meetup
โ ์๋ชป๋ ๋ฐ์ดํฐ๋ก ์์ฒญํ์ฌ DB์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์ด๋ค ์ํ์ฝ๋๋ฅผ ๋๋ ค์ฃผ์ด์ผ ํ๋?
์๋ฒ์์ SQLException์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ํด๋ผ์ด์ธํธ์ ์๋ ค์ผ ํ๋,
๋๋ ์ด๋ค ์ํ์ฝ๋๋ฅผ ์ฃผ์ด์ผ ํ๋์ ๋ํด ์ด์ผ๊ธฐํด๋ณด์๋ค.
์ผ๋จ ๊ฒฐ๋ก ์ ์๋ชป๋ ๋ฐ์ดํฐ๋ก ๊ฒฐ๊ณผ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒฝ์ฐ, ์๋ฒ์๋ฌ๊ฐ ์๋ ๋์ ๋ฐ๋ผ ์ ์ ํ ์ํ์ฝ๋๋ฅผ ๋๋ ค์ค๋ค.
์น API ๋์์ธ์ ์ฐธ๊ณ ํ์๋ค.
POST - ์๋ชป๋ ๋ฐ์ดํฐ ์ถ๊ฐ ์์ฒญ์ผ ๊ฒฝ์ฐ 400
PUT - ๋ฐ์ดํฐ ์์ ์ด ์คํจํ ๊ฒฝ์ฐ 409
์๋ฒ์์ ์ฒ๋ฆฌํ๊ณ ์ํ์ฝ๋๋ฅผ ๋ณด๋ผ ๋ ์ ํด์ง ์ฝ์์ ์๊ฐํด๋ณด๊ณ ์ ์ ํ ์ํ์ฝ๋๋ฅผ ๋ณด๋ด์ด ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ ์ ์ ์๋๋ก ํ์!
REST API ์ค๊ณ๋ฅผ์ํ ๋ชจ๋ฒ ์ฌ๋ก
2021-06-09 ์ถ๊ฐ
JSON์ผ๋ก accept์ respond
- JSON์ ๋ฐ์ดํฐ ์ ์ก์์ํ ํ์ค
- JS์ Fetch API ๋ฑ์ JSON์ ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉํ๋ ๋ด์ฅ ๋ฉ์๋๊ฐ ์์
- JSON์ผ๋ก ์๋ต ํ ๋ ํด๋ผ์ด์ธํธ๊ฐ์ด๋ฅผ ํด์ํ๋๋ก ํ๋ ค๋ฉด
Content-Type: application/json
๋ฅผ ์๋ต ํค๋๋ก ์ค์ ํด์ผํจ
๋์ฌ๋์ ๋ช ์ฌ ์ฌ์ฉ
- HTTP ์์ฒญ ๋ฉ์๋์ ์ด๋ฏธ ๋์ฌ๊ฐ ์๊ธฐ ๋๋ฌธ
- ๋์ฌ๊ฐ์๋ ๊ฒ์ ์๋ก์ด ์ ๋ณด๋ฅผ ์ ๋ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ๊ฒ ๊ธธ์ด์ง
๋ ผ๋ฆฌ์ ์ค์ฒฉ ์ฌ์ฉ
- ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํฌํจ ํ ์์๋ ๊ฒฝ์ฐ์ด๋ฅผ ๋ฐ์
- ์ฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ์์ด ๋์์ธํ๊ธฐ
- ์ค์ ๋ก ๊ณต๊ฒฉ์์์ธ ๋ถํ์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฌ๋ง ํ์ง ์๋ ๊ฒ์ด ์ข์
ํ์ค ์ค๋ฅ ์ฝ๋ ๋ฐํ
- ์ค๋ฅ ์ฝ๋๋ ๊ด๋ฆฌ์๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์๋ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ๊ฐ๋๋ก ๋ฉ์์ง๊ฐ ํจ๊ป ์์ด์ผ ํจ
- ํ์ง๋ง ๊ณต๊ฒฉ์๊ฐ ์ด๋ฅผ ์ ์ฉํ ์ ์์
์ผ๋ฐ์ ์ธ HTTP ์ค๋ฅ ์ํ์ฝ๋
- 400 : ํด๋ผ์ด์ธํธ ์ธก ์ ๋ ฅ์ด ์ ํจ์ฑ ๊ฒ์ฌ์ ์คํจ
- 401 : ์ฌ์ฉ์๊ฐ ๋ฆฌ์์ค์ ์ก์ธ์ค ํ ์์๋ ๊ถํ์ด ์์
- 403 : ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋์์ง๋ง ๋ฆฌ์์ค์ ์ก์ธ์ค ํ ์ ์์
- 404 : ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์
- 500 : ์ผ๋ฐ ์๋ฒ ์ค๋ฅ. ๋ช ์์ ์ผ๋ก ๋์ ธ์๋ ์๋จ
- 503 : ์๋ฒ ์ธก์์ ์๊ธฐ์น ์์ ์ผ์ด ๋ฐ์ํ์ (์๋ฒ ๊ณผ๋ถํ, ์์คํ ์ ์ผ๋ถ ์ค๋ฅ ๋ฑ)
๋ณด์
- SSL ์ธ์ฆ์๋ ์๋ฒ์๋ก๋ํ๊ธฐ๊ฐ ๊ทธ๋ฆฌ ์ด๋ ต์ง ์์ผ๋ฉฐ ๋น์ฉ์ด ๋ฌด๋ฃ์ด๊ฑฐ๋ ๋งค์ฐ ๋ฎ์
- ๋๋ฌธ์ SSL์์์ ๊ตฌ๋๋๋ HTTPS๋ฅผ ์ด์ฉํ์
- ์ฌ์ฉ์๋ค์ด ์๋ก์ ์ ๋ณด์ ์ก์ธ์ค ํ ์ ์๋๋ก ๋ง์์ผ ํจ
์ฑ๋ฅ ํฅ์์ ์ํ ๋ฐ์ดํฐ ์บ์ฑ
- ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ ํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ ์ค๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ๋ ๋์
- ๋ก์ปฌ ๋ฉ๋ชจ๋ฆฌ ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์บ์ฑ์ ์ถ๊ฐ ํ ์ ์์
- ๋๋ถ์ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ ๋นจ๋ฆฌ ์ป์ ์ ์์
- ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ป๋ ๋ฐ์ดํฐ๋ ์ค๋๋์์ ์ ์์ (๋ฌธ์ )
- Redis, ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์ฑ ๋ฑ์ ์ฌ์ฉํ ์ ์์
- ์๊ตฌ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฐ์ดํฐ๊ฐ ์บ์ฑ๋๋ ๋ฐฉ์์ ๋ณ๊ฒฝํ ์ ์์
- ์บ์ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
Cache-Control
ํค๋ ์๋ ์ ๋ณด๋ฅผ ํฌํจํด์ผํจ
API ๋ฒ์ ๊ด๋ฆฌ
- API์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ฒจ ์ด๋ฅผ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฒ์ ์ API๊ฐ ์์ด์ผ ํจ
- v1 ์๋ ํฌ์ธํธ๋ ๋ณ๊ฒฝ์ ์ํ์ง ์๋ ์ฌ๋๋ค์ ์ํด ํ์ฑ ์ํ๋ฅผ ์ ์ง
- v2๋ ์ ๊ทธ๋ ์ด๋ ํ ์ค๋น๊ฐ ๋ ์ฌ๋๋ค์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณต
- ๋ฒ์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ํ
/v1/
,/v2/
๋ฑ API ๊ฒฝ๋ก์ ์์ ๋ถ๋ถ์ ์ถ๊ฐ
์ฐธ๊ณ
โ API ์ค๊ณ์ ๋ํ ์ ํด์ง ๊ท์ฝ?
- API๋ฅผ ํ์ฉํ๋ ์ฌ๋๋ค๊ณผ ์ถฉ๋ถํ ๋ ผ์ ํ ๊ฒฐ์ ํ๊ธฐ
- ๋ง์ ์ฌ๋๋ค์ ๊ณต๊ฐ
- RFC ๋ฌธ์๋ ๋ง์ ์ฌ๋๋ค ์ฌ์ฉํ๋ API์ค๊ณ ํ์ฉ