REST API - MoonGyeongHyeon/Keyword_Study GitHub Wiki
REST API
REST๋ REpresentational State Transfer์ ์ฝ์๋ก 2000๋ ๋์ ๋ก์ด ํ๋ฉ์ ์ํด ์ฒ์ ์๊ฐ๋๋ค. ๋ก์ด ํ๋ฉ์ HTTP์ ์ฃผ์ ์ ์ ์ค ํ ์ฌ๋์ผ๋ก, ๋น์ HTTP ์ค๊ณ์ ์ฐ์์ฑ์ ๋นํด ์ ๋๋ก ์ฌ์ฉ๋์ด์ง์ง ๋ชปํ๋ ๋ชจ์ต์ ์ํ๊น์ํ์ฌ ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ ์ณ๋ก REST๋ฅผ ๋ฐํํ๋ค.
REST์ ๊ตฌ์ฑ
- ์์ - URI
- ํ์ - HTTP Method
- ํํ (Representation)
REST์ ํน์ง
- Uniform (์ ๋ํผ ์ธํฐํ์ด์ค)
- URI๋ก ์ง์ ํ ์์์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํํ๋ ์ํคํ ์ณ ์คํ์ผ.
- Stateless
- REST๋ ๋ฌด์ํ์ฑ ์ฑ๊ฒฉ์ ๊ฐ๋๋ค. ๋ค์ ๋งํด, ์์ ์ ์ํ ์ํ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅ/๊ด๋ฆฌํ์ง ์๋๋ค. ์ธ์ ์ ๋ณด๋ ์ฟ ํค ์ ๋ณด๋ฅผ ๋ณ๋๋ก ์ ์ฅ/๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ API ์๋ฒ๋ ๋ค์ด์ค๋ ์์ฒญ๋ง ๋จ์ํ ์ฒ๋ฆฌํ๋ฉด ๋๋ค. ๋๋ฌธ์, ์๋น์ค์ ์์ ๋๊ฐ ๋์์ง๊ณ ์๋ฒ์์ ๋ถํ์ํ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์ง ์์์ผ๋ก์จ ๊ตฌํ์ด ๋จ์ํด์ง๋ค.
- Cacheable
- REST์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ HTTP๋ผ๋ ๊ธฐ์กด ์น ํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ํ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์๋ค. HTTP ํ๋กํ ์ฝ ํ์ค์์ ์ฌ์ฉํ๋ Last-Modified ํ๊ทธ๋ E-Tag๋ฅผ ์ด์ฉํ๋ฉด ์บ์ฑ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
- Self-descriptiveness (์์ฒด ํํ ๊ตฌ์กฐ)
- REST API ๋ฉ์ธ์ง๋ง ๋ณด๊ณ ๋ ์ด๋ค ์๋ฏธ์ธ์ง ์ฝ๊ฒ ์ดํดํ ์ ์๋ ์์ฒด ํํ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- Client-Server ๊ตฌ์กฐ
- REST ์๋ฒ๋ API ์ ๊ณต, ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ธ์ฆ์ด๋ ์ปจํ ์คํธ(์ธ์ , ๋ก๊ทธ์ธ ์ ๋ณด) ๋ฑ์ ์ง์ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก, ๊ฐ๊ฐ์ ์ญํ ์ด ํ์คํ ๊ตฌ๋ถ๋์ด ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ๊ฐ๋ฐํ ๋ด์ฉ์ด ๋ช ํํด์ง๊ณ ์๋ก์ ์์กด์ฑ์ด ์ค์ด๋ค๊ฒ ๋๋ค.
- ๊ณ์ธตํ ๊ตฌ์กฐ
- REST ์๋ฒ๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ ๋ณด์, LB, ์ํธํ ๊ณ์ธต์ ์ถ๊ฐํด ๊ตฌ์กฐ ์์ ์ ์ฐ์ฑ์ ๋ ์ ์๊ณ proxy, ๊ฒ์ดํธ์จ์ด ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ค๊ฐ ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
REST API ๊ฐ์ด๋
REST API ์ค๊ณ ์ ๋ค์ 2๊ฐ์ง ํญ๋ชฉ์ด ์ ๋ง ์ค์ํ๋ค.
- URI๋ ์ ๋ณด์ ์์์ ํํํ๋ค.
- ์์์ ๋ํ ํ์๋ HTTP Method๋ก ํํํ๋ค.
REST API ์ค์ฌ ๊ท์น
URI๋ ์ ๋ณด์ ์์์ ํํํด์ผ ํ๋ค. (์์๋ช ์ ๋์ฌ๋ณด๋ค๋ ๋ช ์ฌ๋ฅผ ์ฌ์ฉ)
GET /members/delete/1
์์ ๊ฐ์ ๋ฐฉ์์ REST๋ฅผ ์ ๋๋ก ์ ์ฉํ์ง ์์ URI์ด๋ค. URI๋ ์์์ ํํํ๋ ๋ฐ ์ค์ ์ ๋์ด์ผ ํ๋ค. delete์ ๊ฐ์ ํ์์ ๋ํ ํํ์ด ๋ค์ด๊ฐ์ ์๋๋ค.
์์์ ๋ํ ํ์๋ HTTP Method๋ก ํํํ๋ค.
์์ ์๋ชป๋ URI๋ฅผ HTTP Method๋ก ์์ ํ์ฌ ํํํ๋ฉด ์๋์ ๊ฐ์ด ์์ ํ ์ ์๋ค.
DELETE /members/1
ํ์์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ GET, ํ์์ ์ถ๊ฐํ ๋๋ POST๋ฅผ ์ฌ์ฉํ์ฌ ํํํ๋ค.
ํ์์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ URI
GET /members/show/1 (x)
GET /members/1 (o)
ํ์์ ์ถ๊ฐํ ๋ URI
GET /members/insert/2 (x) - GET ๋ฉ์๋๋ ์์ ์์ฑ์ ๋ง์ง ์์ต๋๋ค.
POST /members/2 (o)
POST, GET, PUT, DELETE 4๊ฐ์ง์ Method๋ฅผ ์ฌ์ฉํด CRUD๋ฅผ ๊ตฌํํ ์ ์๋ค.
METHOD | ์ญํ |
---|---|
POST | POST๋ฅผ ํตํด ํด๋น URI๋ฅผ ์์ฒญํ๋ฉด ์์์ ์์ฑํฉ๋๋ค. |
GET | GET๋ฅผ ํตํด ํด๋น ์์์ ์กฐํํฉ๋๋ค. ์์์ ์กฐํํ๊ณ ํด๋น ๋ํ๋จผํธ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค. |
PUT | PUT๋ฅผ ํตํด ํด๋น ์์์ ์์ ํฉ๋๋ค. |
DELETE | DELETE๋ฅผ ํตํด ์์์ ์ญ์ ํฉ๋๋ค. |
์์ ๊ฐ์ ์์ผ๋ก URI๋ ์์์ ํํํ๋ ๋ฐ ์ง์คํ๊ณ , ํ์์ ๋ํ ์ ์๋ HTTP Method๋ฅผ ํตํด ํ๋ ๊ฒ์ด REST API ์ค๊ณ์ ์ค์ฌ ๊ท์น์ด๋ค.
URI ์ค๊ณ ์ ์ฃผ์์ฌํญ
-
์ฌ๋์(/)๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉํ๋ค.
http://restapi.example.com/houses/apartments http://restapi.example.com/animals/mammals/whales
-
URI ๋ง์ง๋ง ๋ฌธ์๋ก ์ฌ๋์๋ฅผ ํฌํจํ์ง ์๋๋ค.
URI์ ํฌํจ๋๋ ๋ชจ๋ ๊ธ์๋ ์์์ ์ ์ผํ ์๋ณ์๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ, URI๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ์์์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ด๊ณ , ์ญ์ผ๋ก ์์์ด ๋ค๋ฅด๋ฉด URI๋ ๋ฌ๋ผ์ผ ํ๋ค. REST API๋ ๋ถ๋ช ํ URI๋ฅผ ๋ง๋ค์ด ํต์ ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ํผ๋์ ์ฃผ์ง ์๋๋ก URI์ ๋ง์ง๋ง์๋ ์ฌ๋์๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
http://restapi.example.com/houses/apartments/ (X) http://restapi.example.com/houses/apartments (0)
-
ํ์ดํ(-)์ URI ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐ ์ฌ์ฉํ๋ค.
URI๋ฅผ ์ฝ๊ฒ ์ฝ๊ณ ํด์ํ๊ธฐ ์ํด ๋ถ๊ฐํผํ๊ฒ ๊ธด URI ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค๋ฉด ํ์ดํ์ ์ฌ์ฉํด ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
-
๋ฐ์ค(_)์ ์ฌ์ฉํ์ง ์๋๋ค.
๊ธ๊ผด์ ๋ฐ๋ผ ๋ฐ์ค์ด ๋ณด๊ธฐ ํ๋ค๊ฑฐ๋ ๋ณด์ด์ง ์๊ฑฐ๋ ๋ฐ์ค ๋๋ฌธ์ ๋ฌธ์๊ฐ ๊ฐ๋ ค์ง๊ธฐ๋ ํ๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ๋ฐ์ค ๋์ ํ์ดํ์ ์ฌ์ฉํ์.
-
URI ๊ฒฝ๋ก์๋ ์๋ฌธ์๊ฐ ์ ํฉํ๋ค.
URI ๊ฒฝ๋ก์ ๋๋ฌธ์ ์ฌ์ฉ์ ํผํ๋๋ก ํ๋ค. ๋์๋ฌธ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฆฌ์์ค๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
-
ํ์ผ ํ์ฅ์๋ 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
์์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ๋ฒ
REST ์์ ๊ฐ์๋ ์ฐ๊ด ๊ด๊ณ๊ฐ ์์ ์ ์๋ค. ์ด๋ด ๋ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํํํ๋ค.
/๋ฆฌ์์ค๋ช
/๋ฆฌ์์ค ID/๊ด๊ณ๊ฐ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ช
ex) GET : /users/{userid}/devices (์ผ๋ฐ์ ์ผ๋ก ์์ โhasโ์ ๊ด๊ณ๋ฅผ ํํํ ๋)
๋ง์ฝ ๊ด๊ณ๋ช ์ด ๋ณต์กํ๋ค๋ฉด ์ด๋ฅผ ์๋ธ ์์์ ๋ช ์์ ์ผ๋ก ํํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ข์ํ๋ ๋๋ฐ์ด์ค ๋ชฉ๋ก์ ํํํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
GET : /users/{userid}/likes/devices (๊ด๊ณ๋ช
์ด ์ ๋งคํ๊ฑฐ๋ ๊ตฌ์ฒด์ ํํ์ด ํ์ํ ๋)
์์์ ํํํ๋ Collection๊ณผ Document
Collection๊ณผ Document์ ๋ํด ์๋ฉด URI ์ค๊ณ๊ฐ ํ ์ธต ๋ ์ฌ์์ง๋ค. Document๋ ๋จ์ํ ๋ฌธ์๋ก ์ดํดํด๋ ๋๊ณ , ํ๋์ ๊ฐ์ฒด๋ผ๊ณ ์ดํดํด๋ ๋๋ค. Collection์ ๋ฌธ์๋ค์ ์งํฉ, ๊ฐ์ฒด๋ค์ ์งํฉ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค. Collection๊ณผ Document๋ ๋ชจ๋ ์์์ด๋ผ๊ณ ํํํ ์ ์์ผ๋ฉฐ URI์ ํํ๋๋ค.
http:// restapi.example.com/sports/soccer
์ URI๋ sports๋ผ๋ Collection๊ณผ soccer๋ผ๋ Document๋ก ํํ๋๊ณ ์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
http:// restapi.example.com/sports/soccer/players/13
sports, players Collection๊ณผ 13(13๋ฒ ์ ์)์ ์๋ฏธํ๋ Document๋ก URI๊ฐ ์ด๋ฃจ์ด์ง๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ์ค์ํ ์ ์ Collection์ ๋ณต์๋ก ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ด๋ค. ์ง๊ด์ ์ธ REST API๋ฅผ ์ํด์ Collection๊ณผ Document๋ฅผ ์ฌ์ฉํ ๋ ๋จ์ ๋ณต์๋ฅผ ์ง์ผ์ค๋ค๋ฉด ์ข ๋ ์ดํดํ๊ธฐ ์ฌ์ด URI๋ฅผ ์ค๊ณํ ์ ์๋ค.