Representtational State Transfer
์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ
(= ์์์ ํํ์ ์ํ ์ํ ์ ๋ฌ)
REST๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์น์ ์์กด ๊ธฐ์ ๊ณผ HTTP ํ๋กํ ์ฝ์ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ์ํคํ ์ฒ ์คํ์ผ
HTTP URI๋ฅผ ํตํด ์์์ ๋ช
์ํ๊ณ HTTP Method๋ฅผ ํตํด ํด๋น ์์์ ๋ํ CRUD Operation์ ์ ์ฉํ๋ ๊ฒ
โ URI vs URL
URI๋ URL์ ํฌํจ
URI (Uniform Resource Identifier)
URL (Uniform Resource Locator)
- ์ธํฐ๋ท ์ ์์์ ์์น
- ์ด๋ค ํ์ผ์ ์์น๋ฅผ ์๋ฏธ
HTTP ํ๋กํ ์ฝ์ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก REST API ์ฌ์ฉ์ ์ํ ๋ณ๋์ ์ธํ๋ผ ๊ตฌ์ถ ํ์ ์์
HTTP ํ๋กํ ์ฝ ํ์ค์ ์ต๋ํ ํ์ฉํ์ฌ ์ฌ๋ฌ ์ถ๊ฐ์ ์ธ ์ฅ์ ์ ํจ๊ป ๊ฐ์ ธ๊ฐ ์ ์์
HTTP ํ์ค ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅ
REST API ๋ฉ์ธ์ง๊ฐ ์๋ํ๋ ๋ฐ๋ฅผ ๋ช ํํ๊ฒ ๋ํ๋ด๋ฏ๋ก ์๋ํ๋ ๋ฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์์
์๋ฒ์ ํด๋ผ์ด์ธํธ ์ญํ ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌ
ํ์ค ์กด์ฌ X
HTTP Method ํํ๊ฐ ์ ํ์
์ ํ๋ฆฌ์ผ์ด์ ๋ถ๋ฆฌ ๋ฐ ํตํฉ
๋ค์ํ ํด๋ผ์ด์ธํธ์ ๋ฑ์ฅ
์์(Resource)
: URI
๋ชจ๋ ์์์ ๊ณ ์ ํ ID๊ฐ ์กด์ฌํ๊ณ ์ด ์์์ server์ ์กด์ฌ
์์์ ๊ตฌ๋ณํ๋ ID๋ HTTP URI
Client๋ URI๋ฅผ ์ด์ฉํด์ ์์์ ์ง์ ํ๊ณ ํด๋น ์์์ ์ํ์ ๋ํ ์กฐ์์ server์ ์์ฒญ
ํ์: HTTP Method
HTTP ํ๋กํ ์ฝ์ Method๋ฅผ ์ฌ์ฉ
HTTP ํ๋กํ ์ฝ์ GET, POST, PUT, DELETE์ ๊ฐ์ ๋ฉ์๋ ์ ๊ณต
ํํ
Client๊ฐ ์์์ ์ํ์ ๋ํ ์กฐ์์ ์์ฒญํ๋ฉด Server๋ ์ด์ ์ ์ ํ ์๋ต ๋ณด๋
Rest์์ ํ๋์ ์์์ JSON, XML.. ๋ฑ ์ฌ๋ฌ ํํ์ Representation์ผ๋ก ๋ํ๋
server-client
ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ธํ ์ฌํญ์ ๋ํด ์ ๊ฒฝ ์ธ ํ์ ์์ด ์ ๊ณต๋๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ ๊ทผํ์ฌ ์๋ต์ ๋ฐ์, ์์ ์ Context ๊ด๋ฆฌ
์๋ฒ๋ ํด๋ผ์ด์ดํธ์ ์ํ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์ ๊ณตํ ์ธํฐํ์ด์ค์ ๋ํ ์ฒ๋ฆฌ๋ง ๋ด๋นํ์ฌ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๊ทธ์ ๋ง๋ ์๋ต ์ ๊ณต
stateless(๋ฌด์ํ)
๊ฐ๊ฐ์ ์์ฒญ ์ ํด๋ผ์ด์ธํธ์ Context๊ฐ ์๋ฒ์ ์ ์ฅ๋์ง ์์
์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์ผ๋ฉด ๊ฐ API ์๋ฒ๋ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฉ์์ง๋ก๋ง ์ฒ๋ฆฌํ๋ฉด ๋๊ณ ์ธ์ ๊ณผ ๊ฐ์ Context ์ ๋ณด๋ฅผ ์ ๊ฒฝ ์ธํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ด ๋จ์ํด์ง
์๋ฒ๋ ๊ฐ๊ฐ์ ์์ฒญ์ ๋ณ๊ฐ์ ๊ฒ์ผ๋ก ์ธ์ํ๊ณ ์ฒ๋ฆฌํด์ผํ๋ฉฐ ์ด์ ์์ฒญ์ด ๋ค์ ์์ฒญ์ ์ฐ๊ด๋์ด์๋ ์๋จ
Cacheable(์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ)
์น ํ์ค HTTP ํ๋กํ ์ฝ ๊ทธ๋๋ก ์ฌ์ฉ -> ์บ์ฑ ๊ธฐ๋ฅ ์ ์ฉ ๊ฐ๋ฅ
๊ตฌํ์ HTTP ํ๋กํ ์ฝ ํ์ค์์ ์ฌ์ฉํ๋ Last-Modified ํ๊ทธ๋ E-Tag๋ฅผ ์ด์ฉํ๋ฉด ์บ์ฑ ๊ตฌํ ๊ฐ๋ฅ
์บ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋คํธ์ํฌ ์๋ต ์๊ฐ๋ฟ๋ง ์๋๋ผ REST ์ปดํฌ๋ํธ๊ฐ ์์นํ ์๋ฒ์ ํธ๋์ญ์ ์ ๋ฐ์์ํค์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์๋ต์๊ฐ๊ณผ ์ฑ๋ฅ, ์๋ฒ์ ์์ ์ฌ์ฉ๋ฅ ์ ๋น์ฝ์ ์ผ๋ก ํฅ์์ํฌ ์ ์์
Layered System(๊ณ์ธตํ)
REST Server๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ ๋ณด์, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ํธํ ๋ฑ์ ์ํ ๊ณ์ธต์ ์ถ๊ฐํ์ฌ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์์
Proxy, Gateway์ ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ค๊ฐ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค
Code-On-Demand
Uniform Interface(์ธํฐํ์ด์ค ์ผ๊ด์ฑ)
URI๋ก ์ง์ ํ Resource์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํ
ํด๋ผ์ด์ธํธ๊ฐ ํ๋ซํผ์ ๋ฌด๊ดํ๋ฉฐ ํน์ ์ธ์ด๋ ๊ธฐ์ ์ ์ข ์๋ฐ์ง ์์
REST API๋ HTTP๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ซํผ์์ ์์ฒญ ๊ฐ๋ฅ, Loosely Coupling(๋์จํ ๊ฒฐํจ) ํํ๋ฅผ ๊ฐ๊ฒ๋จ
Self-Description(์์ฒด ํํ)
Application Programming Interface
๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ์งํฉ์ ์ ๊ณตํ์ฌ ์ปดํจํฐ ํ๋ก๊ทธ๋จ๊ฐ ์ํธ์์ฉ์ ์ด์งํ๋ฉฐ ์๋ก ์ ๋ณด๋ฅผ ๊ตํ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ
REST ๊ธฐ๋ฐ์ผ๋ก ์์คํ ์ ๋ถ์ฐํด ํ์ฅ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๋์ฌ ์ ์ง๋ณด์ ๋ฐ ์ด์ฉ์ ํธ๋ฆฌํ๊ฒ ํ ์ ์์
REST๋ HTTP ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ฏ๋ก
HTTP๋ฅผ ์ง์ํ๋ ํ๋ก๊ทธ๋จ์ผ๋ก ํด๋ผ์ด์ธํธ, ์๋ฒ๋ฅผ ๊ตฌํํ ์ ์์
- ๋ํ๋จผํธ: ๊ฐ์ฒด ์ธ์คํด์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋์ ์ ์ฌ
- ์ปฌ๋ ์ : ์๋ฒ์์ ๊ด๋ฆฌํ๋ ๋๋ ํฐ๋ฆฌ๋ผ๋ ๋ฆฌ์์ค
- ์คํ ์ด: ํด๋ผ์ด์ธํธ์์ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ์ ์ฅ์
- ๋ํ๋จผํธ vs ์ปฌ๋ ์
๋ํ๋จผํธ๋ ๊ฐ์ฒด ํ๋, ์ปฌ๋ ์ ์ ๊ฐ์ฒด์ ์งํฉ
-/users/1/products/3
์์ users, products ์ปฌ๋ ์ ๊ณผ 1(id๊ฐ 1๋ฒ์ธ user), 3(id๊ฐ 3๋ฒ์ธ products)์ ์๋ฏธํ๋ ๋ํ๋จผํธ๋ก ๊ตฌ์ฑ
URI๋ ์ ๋ณด์ ์์์ ํํํด์ผํ๋ค
์์์ ๋ํ ํ์๋ HTTP Method๋ก ํํ
/๋ ๊ณ์ธต๊ด๊ณ๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉ
URI ๋ง์ง๋ง ๋ฌธ์๋ก๋ /๋ฅผ ์ฌ์ฉ X
-์ URI ๊ฐ๋ ์ฑ์ ๋์ด๋๋ฐ ์ฌ์ฉ (๋ถ๊ฐํผํ๊ฒ ๊ธด URI ๊ฒฝ๋ก ์ฌ์ฉ ์ ํ์ดํ ์ฌ์ฉ)
_์ URI์ ์ฌ์ฉํ์ง ์์
URI ๊ฒฝ๋ก์๋ ์๋ฌธ์ ์ ํฉ
ํ์ผํ์ฅ์๋ URI์ ํฌํจ X
๋ฆฌ์์ค ๊ฐ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฆฌ์์ค๋ช
/๋ฆฌ์์คID/๊ด๊ณ๊ฐ ์๋ ๋ค๋ฅธ ๋ฆฌ์์ค๋ช
(์ผ๋ฐ์ ์ผ๋ก ์์ 'has'์ ๊ด๊ณ๋ฅผ ํํํ ๋)
์ํ์ฝ๋ | |
---|---|
200 OK | ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ์์ ์ผ๋ก ์ํํจ |
201 Created | ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ ํ ๋ฆฌ์์ค ์์ฑ์ ์์ฒญ, ํด๋น ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋จ |
400 Bad Request | ์๋ชป๋ ๋ฌธ๋ฒ์ผ๋ก ์ธํ์ฌ ์๋ฒ๊ฐ ์์ฒญ์ ์ดํดํ ์ ์์ |
401 Unauthorized | ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ๋์ง ์์ ์ํ์์ ๋ณดํธ๋ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ์ ๋ ์ฌ์ฉํ๋ ์๋ต์ฝ๋ |
403 Forbidden | ์ฝํ
์ธ ์ ์ ๊ทผํ ๊ถ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ (401๊ณผ ๋ค๋ฅด ์ ์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฌ์ธ์ง ์๊ณ ์์) |
404 Not Found | ์๋ฒ๊ฐ ์์ฒญ๋ฐ์ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ ์ ์์ ๋ |
500 | ์๋ฒ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ ์ฌ์ฉ |
์ฐธ๊ณ
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
https://ijbgo.tistory.com/20
https://mangkyu.tistory.com/46
https://velog.io/@kjh107704/REST-%EC%84%9C%EB%B2%84-REST-API%EB%9E%80