REST์ ๊ฐ๋
REST๋?
Representational State Transfer์ ์ฝ์
์น์ ๊ธฐ์กด ๊ธฐ์ ๊ณผ HTTP ํ๋กํ ์ฝ์ ๊ทธ๋๋ก ํ์ฉํ๋ ๋ฐ์ดํฐ ์ก์์ ์ํคํ ์ฒ ์คํ์ผ
๋คํธ์ํฌ ์์์ Client์ Server ์ฌ์ด์ ํต์ ๋ฐฉ์ ์ค ํ๋
์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ(์ ๋ณด)๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ์๋ฏธ
JSON ํน์ XML์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ด ์ผ๋ฐ์
REST์ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋
- HTTP URI๋ฅผ ํตํด ์์์ ๋ช ์ํ๊ณ , HTTP Method๋ฅผ ํตํด ํด๋น ์์์ ๋ํด CRUD Operation์ ์ ์ฉํ๋ ๊ฒ์ ์๋ฏธ
- ์ฆ, ์์ ๊ธฐ๋ฐ์ ๊ตฌ์กฐ(ROA) ์ค๊ณ์ ์ค์ฌ์ Resource๊ฐ ์์ผ๋ฉฐ, HTTP Method๋ฅผ ํตํด Resource๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋ ์ํคํ ์ฒ
CRUD Operation
- Create : ์์ฑ(POST)
- Read : ์กฐํ(GET)
- Update : ์์ (PUT)
- Delete : ์ญ์ (DELETE)
- HEAD : header ์ ๋ณด ์กฐํ(HEAD)
REST์ ์ฅ๋จ์
์ฅ์
- HTTP ํ๋กํ ์ฝ์ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก, ๋ณ๋์ ์ธํ๋ผ๊ฐ ํ์ ์์
- HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํจ
- REST API ๋ฉ์์ง๊ฐ ์๋ํ๋ ๋ฐ๋ฅผ ๋ช ํํ๊ฒ ๋ํ๋ด๋ฏ๋ก ์๋๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์
- ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํจ
๋จ์
- ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ ํ์ ์
- ๊ตฌํ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ง ์ ๋๋ก ์ง์ํด์ฃผ์ง ๋ชปํ๋ ๋ถ๋ถ์ด ์กด์ฌ(PUT,DELETE ์ฌ์ฉ ๋ถ๊ฐ, pushState ์ง์ ์ํจ)
REST๊ฐ ํ์ํ ์ด์ ?
- ์ต๊ทผ์ ์๋ฒ ํ๋ก๊ทธ๋จ์ ๋ค์ํ ๋ธ๋ผ์ฐ์ , ์ค๋งํธํฐ๊ณผ ๊ฐ์ ๋ชจ๋ฐ์ผ ๋๋ฐ์ด์ค์์ ํต์ ์ด ๊ฐ๋ฅํด์ผํจ
- ์ฆ, ๋ฉํฐ ํ๋ซํผ ์ง์์ ์ํด ๋ฑ์ฅ
REST ๊ตฌ์ฑ ์์
Resource
- ๋ชจ๋ ์์์ ๊ณ ์ ํ ID๊ฐ ์กด์ฌํ๋ฉฐ, ์ด ์์์ ์๋ฒ์ ์กด์ฌ
- ์์์ ๊ตฌ๋ณํ๋ ID๋ '/users/:user_id'์ ๊ฐ์ HTTP URI
- Client๋ URI๋ฅผ ํตํด ์์์ ์ง์ ํ๊ณ , ์๋ฒ์๊ฒ ์์ฒญํจ
Verb
- HTTP ํ๋กํ ์ฝ์ Method๋ฅผ ์ฌ์ฉํจ
Representation of Resource
- Client๊ฐ ์๋ฒ์๊ฒ ์์ฒญํ๋ฉด, ์ด์ ์ ์ ํ ์๋ต(Representation)์ ๋ณด๋
- REST๋ JSON,XML,TEXT,RSS๋ฑ ์ฌ๋ฌ ํํ์ Representation์ผ๋ก ๋ํ๋
- ๋ณดํต JSON, XML์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์
REST์ ํน์ง
Server-Client
- REST Server : API๋ฅผ ์ ๊ณตํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๋ฐ ์ ์ฅ์ ์ฑ ์
- Client : ์ฌ์ฉ์ ์ธ์ฆ์ด๋ context(์ธ์ , ๋ก๊ทธ์ธ ์ ๋ณด) ๋ฑ์ ์ง์ ๊ด๋ฆฌํ๊ณ ์ฑ ์์ง
Stateless
- HTTP ํ๋กํ ์ฝ์ Stateless Protocol์ด๋ฏ๋ก REST ์ญ์ ๋ฌด์ํ์ฑ์ ๊ฐ์ง
- Client์ context๋ฅผ Server์ ์ ์ฅํ์ง ์์
- Server๋ ๊ฐ๊ฐ์ ์์ฒญ์ ์์ ํ ๋ณ๊ฐ์ ๊ฒ์ผ๋ก ์ธ์ํ๊ณ ์ฒ๋ฆฌํจ
Cacheable
- ์น ํ์ค HTTP ํ๋กํ ์ฝ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด์ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ํ์ฉ
- ์ฆ, HTTP๊ฐ ๊ฐ์ง ๊ฐ์ฅ ๊ฐ๋ ฅํ ํน์ง ์ค ํ๋์ธ ์บ์ฑ ๊ธฐ๋ฅ์ ํ์ฉ ๊ฐ๋ฅ
Layered System(๊ณ์ธตํ)
- Client๋ REST API Server๋ง ํธ์ถ
- REST server๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ
- API Server๋ ์์ ๋น์ฆ๋์ค ๋ก์ง๋ง ์ํํ๊ณ , ๊ทธ ์๋จ์ ๋ณด์, ๋ก๋๋ฐธ๋ฐ์ฑ, ์ํธํ, ์ฌ์ฉ์ ์ธ์ฆ ๋ฑ์ ์ถ๊ฐํ์ฌ ๊ตฌ์กฐ์์ ์ ์ฐ์ฑ์ ์ค ์ ์์
- PROXY, ๊ฒ์ดํธ์จ์ด ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ค๊ฐ ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์
Uniform Interface(์ธํฐํ์ด์ค ์ผ๊ด์ฑ)
- URI๋ก ์ง์ ํ Resource์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํ
- ํน์ ์ธ์ด๋ ๊ธฐ์ ์ ์ข ์๋์ง ์์
REST API์ ๊ฐ๋
API
๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ์งํฉ์ ์ ๊ณตํ์ฌ ์ปดํจํฐ ํ๋ก๊ทธ๋จ๊ฐ ์ํธ์์ฉ์ ์ด์งํ๋ฉฐ, ์๋ก ์ ๋ณด๋ฅผ ๊ตํ ๊ฐ๋ฅ ํ๋๋ก ํ๋ ๊ฒ
REST API
REST ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค API๋ฅผ ๊ตฌํํ ๊ฒ
์ต๊ทผ Open API(๊ตฌ๊ธ ๋งต, ๊ณต๊ณต ๋ฐ์ดํฐ), ๋ง์ดํฌ๋ก ์๋น์ค(ํ๋์ ํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ชผ๊ฐ์ด ๋ณ๊ฒฝ๊ณผ ์กฐํฉ์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋ ์ํคํ ์ฒ) ๋ฑ์ ์ ๊ณตํ๋ ์ ์ฒด ๋๋ถ๋ถ REST API๋ฅผ ์ ๊ณต
REST API์ ํน์ง
- HTTP๋ฅผ ์ง์ํ๋ ํ๋ก๊ทธ๋จ ์ธ์ด๋ก ํด๋ผ์ด์ธํธ, ์๋ฒ๋ฅผ ๊ตฌํํ ์ ์์
REST API ์ค๊ณ ๊ธฐ๋ณธ ๊ท์น
REST API ์ค๊ณ ๊ธฐ๋ณธ ๊ท์น
1. ์ฌ๋์ ๊ตฌ๋ถ์(/)๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉํ๋ค.
2. URI ๋ง์ง๋ง ๋ฌธ์๋ก ์ฌ๋์(/)๋ฅผ ํฌํจํ์ง ์๋๋ค.
- URI์ ํฌํจ๋๋ ๋ชจ๋ ๊ธ์๋ ์ ์ผํ ์๋ณ์๋ก ์ฌ์ฉ๋์ผ ํ๋ฉฐ, URI๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ์ ๋ฆฌ์์ค๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ
- ํผ๋์ ์ฃผ์ง ์๋๋ก ์ ๋๋ก ๋ง์ง๋ง์ ์ฌ๋์๋ฅผ ํฌํจํ์ง ์๋๋ค.
3. ํ์ดํ(-)์ URI ๊ฐ๋ ์ฑ์ ๋์ด๋๋ฐ ์ฌ์ฉํ๋ค.
4. ๋ฐ์ค(_)์ URI์ ์ฌ์ฉํ์ง ์๋๋ค.
5. URI ๊ฒฝ๋ก์๋ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ค.
6. ํ์ผ ํ์ฅ์๋ URI์ ํํํ์ง ์๋๋ค.
- REST API์์๋ ๋ฉ์์ง ๋ฐ๋ ๋ด์ฉ์ ํฌ๋งท์ ๋ํ๋ด๊ธฐ ์ํ ํ์ผ ํ์ฅ์๋ฅผ URI์ ํ์ํ์ง ์๋๋ค.
- ๋์ Accept header๋ฅผ ์ฌ์ฉํ๋ค.
- Ex) GET / members/soccer/345/photo HTTP/1.1 HOST : restapi.example.com Accept : image/jpg
7. ๋ฆฌ์์ค ๊ฐ์๋ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ
- /๋ฆฌ์์ค๋ช /๋ฆฌ๋ก์ค ID/๊ด๊ณ๊ฐ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ช
- Ex) GET : /users/{userid}/devices
REST API ์ค๊ณ ์์
์๋ต ์ํ ์ฝ๋
1XX : ์ ์ก ํ๋กํ ์ฝ ์์ค์ ์ ๋ณด ๊ตํ
2XX : ํด๋ผ์ด์ธํธ ์์ฒญ ์ฑ๊ณต์ ์ผ๋ก ์ํ
3XX : ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ์๋ฃํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ํ๋์ ์ทจํด์ผ ํจ
4XX : ํด๋ผ์ด์ธํธ์ ์๋ชป๋ ์์ฒญ
5XX : ์๋ฒ์ชฝ ์ค๋ฅ๋ก ์ธํ ์ํ์ฝ๋
REFERENCE
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://www.slideshare.net/Byungwook/rest-api-60505484