REST & RESTful
REST๋ HTTP, ํ๋กํ ์ฝ์ด ์๋๋ค! REST๋ ์ผ์ข ์ ๊ฐ์ด๋๋ผ์ธ์ด๋ค.
REST API ๋ REST ๊ธฐ๋ฐ์ผ๋ก ์๋น์ค API๋ฅผ ๊ตฌํํ ๊ฒ
REST ์๋ฆฌ๋ฅผ ๋ฐ๋ผ๋ฅด๋ ์์คํ (์๋น์ค)๋ฅผ RESTful ์ด๋ผ๊ณ ํ๋ค. = REST API ๋ฅผ ์ ๊ณตํ๋ ์น ์๋น์ค๋ฅผ RESTful ํ๋ค๊ณ ํ ์ ์๋ค.
REST
REST๋ Representational State Transfer์ ์ฝ์๋ก ๋ถ์ฐ ํ์ดํผ ๋ฏธ๋์ด ์์คํ ์ ์ํ ์ํํธ์จ์ด ์ํคํ ์ฒ์ ํ ํ์์ด๋ค.
์น์ ์กด์ฌํ๋ ๋ชจ๋ ์์(์ด๋ฏธ์ง, ๋์์, DB์์)์ ๊ณ ์ ํ URL์ ๋ถ์ฌํด ํ์ฉํ๋ ๊ฒ์ผ๋ก ์์์ ์ ์ํ๊ณ ์์์ ๋ํ ์ฃผ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ๋ก ์ ์๋ฏธํ๋ค. → URL์ ์์์ ํํํ๋ ๊ฒ
HTTP URI ๋ฅผ ํตํด ์์์ ๋ช ์ํ๊ณ HTTP Method๋ฅผ ํตํด ํด๋น ์์์ ๋ํ CRUD Operation(์์ฑ, ์กฐํ, ๋ณ๊ฒฝ, ์ญ์ )์ ์ ์ฉํ๋ค.
HTTP URI(Uniform Resource Identifier)
URI๋ ๋คํธ์ํฌ ์์ ์กด์ฌํ๋ ์์์ ๊ตฌ๋ถํ๋ ์๋ณ์์ด๋ค. URI์ URL, URN๋ก ์ด๋ฃจ์ด์ ธ์์ผ๋ฉฐ URL์ Where์ ๊ฐ๋ , ๋ฆฌ์์ค์ ๊ตฌ์ฒด์ ์ธ ์์น๋ฅผ ์๋ ค์ฃผ๊ณ , URN์ What์ ๊ฐ๋ , ์ด๋ฆ์ผ๋ฃ ํ์๋๋ฉฐ ์ ์ผํ ๊ฐ์ด๊ณ ๋ ๋ฆฝ์ ์ด๋ค.
URN, URL์ ํฉ์ณ ํ๋์ ์๋ณ์๋ก ํ์ฉํ ์ ์๋ค. (์ถ์ฒ)
HTTP Method
๊ตฌ์ฑ์์
- Resource : ์์, HTTP URI
- Verb : ์์์ ๋ํ ํ์, HTTP Method
- Representations : ์์์ ๋ํ ํ์์ ๋ด์ฉ, HTTP Message Pay Load
REST ์ ํน์ง
6๊ฐ์ง ์ ์ฝ ์กฐ๊ฑด. ํด๋น ํน์ง์ ์ง์ผ์ผ API๊ฐ RESTful๋ก ๊ฐ์ฃผ๋ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ / ์๋ฒ ๊ตฌ์กฐ (Client-Server)
์์์ด ์๋ Server , ์์์ ์์ฒญํ๋ Client์ ๊ตฌ์กฐ - ๋ฌด์ํ (Stateless)
HTTP๋ Stateless ํ๋กํ ์ฝ ์ด๋ฏ๋ก REST ์ญ์ ๋ฌด์ํ์ฑ์ ๊ฐ์ง๋ค. ํด๋ผ์ด์ธํธ์ Content ๋ฅผ ์๋ฒ์ ์ ์ฅํ์ง ์๋๋ค.
๋์ ์ธ์ ์ ์ํ์ ๋ํ ์ ๋ณด๊ฐ ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋จ - ์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ (Cacheable)
์น ํ์ค HTTP ํ๋กํ ์ฝ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก , ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด์ ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ํ์ฉ ๊ฐ๋ฅํ๋ค.
ํด๋ผ์ด์ธํธ-์๋ฒ ์ํธ ์์ฉ์ ๊ฐ์ํํจ
โทGET - ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์ cache ์ฌ์ฉ ๊ฐ๋ฅ
โทPOST - ์ผ๋ฐ์ ์ผ๋ก cache ์ฌ์ฉ ๋ถ๊ฐ๋ฅ. ํ์ง๋ง Expires์ Cache-Control header๋ฅผ ์ด์ฉํ์ฌ caching์ ๊ตฌํํ์ฌ ์๋ตํ ์ ์๋ค.
โทPUT, DELETE - ํด๋น Request๋ cache๋ฅผ ์ ์ฉํ ์ ์๋ค. - ๊ณ์ธตํ
API ์๋ฒ๋ ์์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๊ณ ๊ทธ ์๋จ์ ์ฌ์ฉ์ ์ธ์ฆ , ์ํธํ , ๋ก๋๋ฐธ๋ฐ์ฑ ๋ฑ์ ํ๋ ๊ณ์ธต์ ์ถ๊ฐํ์ฌ ๊ตฌ์กฐ์์ ์ ์ฐ์ฑ์ ์ค ์ ์๋ค. - ์ธํฐํ์ด์ค ์ผ๊ด์ฑ(Uniform Interface)
URI๋ก ์ง์ ํ ์์์ ๋ํ ์กฐ์์ ํต์ผ๋๊ณ ํ์ ์ ์ธ ์ธํฐํ์ด์ค๋ก ์ํํ๋ค.
HTTP ํ์ค์๋ง ๋ฐ๋ฅธ๋ค๋ฉด ๋ชจ๋ ํ๋ซํผ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. - ์์ฒด ํํ ๊ตฌ์กฐ
๋์ฌ(Method) + ๋ช ์ฌ(URI) ๋ก ์ด๋ฃจ์ด์ ธ์์ด ์ด๋ค ๋ฉ์๋์ ๋ฌด์จ ํ์๋ฅผ ํ๋์ง ์ ์ ์์ผ๋ฉฐ REST API ์์ฒด๊ฐ ๋งค์ฐ ์ฌ์์ API ๋ฉ์ธ์ง ์์ฒด๋ง ๋ณด๊ณ ๋ API๋ฅผ ์ดํดํ ์ ์๋ค.
REST API ์์ ๋ฉฑ๋ฑ์ฑ์ด๋?
๋ฉฑ๋ฑ์ฑ์ด๋ ์ด๋ค ๋์์ ๊ฐ์ ์ฐ์ฐ์ ์ฌ๋ฌ๋ฒ ์ ์ฉํด๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋ ์ฑ์ง์ด๋ค.
REST API ์์ ๋ฉฑ๋ฑ์ฑ์ด๋ ์๋ต์ด ๋ค๋ฅผ ์๋ ์์ง๋ง, ์์ฒญ์ด ์๋ํ ํจ๊ณผ๋ฅผ ๋ฐํํ ๋ ๋ฉฑ๋ฑ์ฑ์ด ์ ์ง๋จ์ ์๋ฏธํ๋ค. (์ฌ๋ฌ๋ฒ ์์ฒญ์ ๋ณด๋ด๋ ์์ฒญ์ ์ํ ์๋ฒ์ ์ํ๋ ํญ์ ๊ฐ์)
Method | ๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ | ์ค๋ช |
GET | O | ๋จ์ ๋ฆฌ์์ค ์ฝ์ด์ค๋ ํ์์ด๋ฏ๋ก ์ฌ๋ฌ๋ฒ ์ํํด๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์์ |
HEAD | O | GET๊ณผ ๋ง์ฐฌ๊ฐ์ง |
PUT(์์ ์ ์ฒด ๊ฐฑ์ ) | O | ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์์ฑ๋ ์ ์์, ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ๋ฐ์ดํฐ๋ ์์ ๋๋ค. ์์ฒญ์ ๋ด๊ธด ๋ฆฌ์์ค๋ก ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ๋์ฒดํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ฒ ์ํํด๋ ์์ฒญ์ ๋ด๊ธด ๋ฆฌ์์ค๊ฐ ๋ณํ์ง ์๋ ์ด์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ ๋์ผ |
DELETE | O | ์ด๋ฏธ ์กด์ฌํ๋ , ์กด์ฌํ์ง ์๋ ๊ทธ ๋ฐ์ดํฐ๋ DELETE ์์ฒญ์ ๋ณด๋ธ ์์ ์์ ์ฌ๋ผ์ง๊ฒ ๋๋ค. ์ฆ, ์ฐ๋ฆฌ๊ฐ ์์ฒญํ ์ฌํญ์ ์ด๋ฃจ์ด ์ก์ |
POST | X | ๋ฆฌ์์ค๋ฅผ ์๋กญ๊ฒ ์์ฑํ๋ ํ์์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ฒ ์ํํ๊ฒ ๋๋ฉด ๋งค๋ฒ ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋ ๊ฒ์ด๊ณ , ์ฐ์ฐ์ ์ํํ ๊ฒฐ๊ณผ๊ฐ ๋งค๋ฒ ๋ฌ๋ผ์ง๋ค. |
PATCH(์์์ ์ผ๋ถ ๊ต์ฒด) | โณ | ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ PUT ๋ฉ์๋์ฒ๋ผ ๋ณด์ฅ๋ ์๋ ์๊ณ , ๋ณด์ฅ๋์ง ์์ ์๋ ์๋ค. PUT ๋ฉ์๋์ฒ๋ผ ๋ฆฌ์์ค๋ฅผ ๋์ฒดํ๋ ํ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋์ง์ ๋ํ ์ ํ์ด ๋ฑํ ์๊ธฐ ๋๋ฌธ์ด๋ค. 1. ์์ ํ ๋ฆฌ์์ค์ ์ผ๋ถ๋ถ๋ง ๋ด์์ ์์ฒญํ๋ ๊ฒฝ์ฐ์๋ ๋น์ฐํ ๋ฉฑ๋ฑ์ฑ์ด ๋ณด์ฅ๋๋ค. 2. ํ์ง๋ง, ์๋์ ๊ฐ์ ๊ฒฝ์ฐ $increaseํ๋ ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ ์ถ์ ์์ฑ์ ์๋ฏธํ๊ณ , value ํ๋ ๊ฐ์ ๊ทธ ์์ฑ์ ์ผ๋ง๋ ์ฆ๊ฐ์ํฌ ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ธ๋ค. ์ด ๊ฒฝ์ฐ API๊ฐ ํธ์ถ๋ ๋๋ง๋ค ๋์ด๊ฐ 1์ฉ ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ด API๋ ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ์ง ์๋๋ค. PATCH users/1 { $increase: 'age', value: 1, } ์ด๋ฐ์์ผ๋ก PATCH ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๋ชป๋ดค์ง๋ง ์คํ ์ ์ ์ฝ์ด ์๊ธฐ ๋๋ฌธ์ ํ์ค์ ์ด๊ธฐ๋ ๊ฒ์ ์๋๋ค. ๋ฐ๋ผ์ PATCH ๋ฉ์๋๋ API๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋๋์ ๋ฐ๋ผ ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ ์๋ ์๊ณ ์๋ ์๋ ์๋ค. |
์์ ํ ๋ฉ์๋ : GET, HEAD์ ๊ฐ์ด ์๋ฒ์ธก์ ์ํ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๋ฉ์๋
๋ฉฑ๋ฑํ ๋ฉ์๋ : ์๋ฒ์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํฌ ์๋ ์๊ณ , ์ํค์ง ์์ ์๋ ์๋ค. ๋ค๋ง, ์ฐ๋ฆฌ๊ฐ ์์ฒญํ ์ฌํญ์ ์๋ฌ๊ฐ ๋๊ฑฐ๋, ์ง์ฐ์ด ๋ฐ์ํ์ง ์๋ ํ ์์ฒญ์ ๋ํ ์๋ฒ์ ์ํ๋ ํญ์ ๊ฐ๋ค.
REST ์ฅ๋จ์
์ฅ์
- ์ฌ์ด ์ฌ์ฉ
HTTP ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก ๋ณ๋์ ์ธํ๋ผ ๊ตฌ์ถ์ด ํ์ ์๋ค. - ํด๋ผ์ด์ธํธ-์๋ฒ ์ญํ ์ ๋ช
ํํ ๋ถ๋ฆฌ
ํด๋ผ์ด์ธํธ์ Context๋ฅผ ์ ์งํ ํ์ ์์ - ํน์ ๋ฐ์ดํฐ ํํ์ ์ฌ์ฉ ๊ฐ๋ฅ
ํค๋ ๋ถ๋ถ์ URI ์ฒ๋ฆฌ ๋ฉ์๋๋ฅผ ๋ช ์ํ๊ณ ํ์ํ ์ค์ ๋ฐ์ดํฐ๋ฅผ body์ ํํํ ์ ์๋๋ก ๋ถ๋ฆฌ์ํด. JSON, XML ๋ฑ ์ํ๋ Representation ์ธ์ด๋ก ์ฌ์ฉ ๊ฐ๋ฅ
๋จ์
- ๋ฉ์๋ ํ๊ณ
HTTP Method๋ก URI๋ฅผ ํํํ๊ธฐ ๋๋ฌธ์ ์ฝ์ง๋ง ํํ๊ฐ ์ ํ์ ์ - ํ์ค์ด ์์
REST๋ ์ค๊ณ ๊ฐ์ด๋์ผ ๋ฟ ๋ช ํํ ํ์ค์ด ์๋ค.
์ฐธ๊ณ
- medium.com/@hckcksrl/rest%EB%9E%80-c602c3324196
- poiemaweb.com/js-rest-api
- https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
- https://sabarada.tistory.com/34
- https://oen-blog.tistory.com/211
- https://velog.io/@dion/HTTP-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EB%A9%B1%EB%93%B1%EC%84%B1-%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0
'๐CS > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
XSS(Cross-site Scripting) ๊ณต๊ฒฉ (0) | 2021.04.25 |
---|---|
[Web] param vs query vs body (2) | 2021.04.18 |
[Web] CORS(Cross-Origin Resource Sharing) (0) | 2021.04.18 |
[Web] HTTP, HTTPS, HTTP ๋ฒ์ (1) | 2021.04.08 |
[Web] ์ฟ ํค์ ์ธ์ (0) | 2021.04.04 |
๋๊ธ