REST๋ ์น์ ์ฐฝ์์(HTTP) ์ค์ ํ ์ฌ๋์ธ Roy Fielding์ 2000๋ ๋ ผ๋ฌธ์ ์ํด์ ์๊ฐ๋์๋ค. ์น์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ ์ ์๋ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ํคํ ์ณ๋ฅผ ์๊ฐํ๋๋ฐ ๊ทธ๊ฒ์ด ๋ฐ๋ก REST ์ด๋ค.
- ํด์ : ์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ ๋ฅผ ์ฃผ๊ณ , ๋ฐ๋ ๋ชจ๋ ๊ฒ
์์, ์กฐ์, ํํ
- ์์ ์ด๋ ?
- ์๋ฒ์ ์๋ ๊ฒ
- DB ์์ ๋ค์ด๊ฐ ์๋ ๋ฐ์ดํฐ ํ๋ํ๋๋ฅผ ์๋ฏธํ๋ค. ex) ์ ์ , ์ฃผ๋ฌธ ๋ฑ
- ๋๋, ์ด๋ฏธ์ง ํ๋ํ๋๋ฅผ ์๋ฏธํ๋ค.
number_24
,number_25
ex) https://www.123rf.com/stock-photo/number_24.html - URI ๋ฅผ ํตํด ์์์ ๋ช ์ํ๊ณ , ๊ตฌ๋ถํ ์ ์๋ค.
- ์กฐ์ ์ด๋?
- Client๋ HTTP Method(POST, GET, DELETE, PUT)๋ฅผ ์ด์ฉํ์ฌ ์ง์ ํ ์์์ ๋ํ ์กฐ์์ ์์ฒญํ๋ค.
- ํํ ์ด๋?
- Client๊ฐ Server์๊ฒ,
์์์ ๋ํ ์กฐ์์ ์์ฒญ
ํ๋ฉด Server๋ ์ด์ ๋ํ ์ ์ ํ ์๋ต(Representation)์ ๋ณด๋ธ๋ค.
REST์ ๊ตฌ์ฒด์ ์ธ ๊ฐ๋ ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ฌ์ด์์, HTTP URL์ ํตํด ์์์ ๋ช ์ํ๊ณ , HTTP Method(POST, GET, DELETE, PUT ๋ฑ)๋ฅผ ํตํด ํด๋น ์์์ ๋ํ ์กฐ์์ ์์ฒญํ๊ณ , ์ด์ ๋ํ ์๋ต์ ๋ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค.
Rest ๊ธฐ๋ณธ ์์น 6 ๊ฐ์ง๋ฅผ ์งํค๋ ๊ฒ์ Restful ํ๋ค๊ณ ํํ
- ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ญํ ์ด ๋ถ๋ฆฌ๋์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ต์ฒด ๋ฐ ๊ฐ๋ฐ ๋ ์ ์๋ค.
- ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ญ์ด ๋ถ๋ฆฌ๋ ์ ์์ด ์ ์ง ๋ณด์๊ฐ ๋งค์ฐ ์ฌ์์ง๋ค
-
์ธ์ ์ํ๊ฐ ์๋ฒ์ ์ ์ฅ๋์ด ์์ง ์์ ์ํ, ํ์์ ๋ฐ๋ผ ์ธ๋ถ DB ์ ์ ์ฅํ๊ธฐ๋ ํ๋ค.
-
server๋ ๋จ์ํ ์์ฒญ์ด ์ค๋ฉด ์๋ต์ ๋ณด๋ด๋ ์ญํ ๋ง ์ํํ๋ฉฐ, ์ธ์ ๊ด๋ฆฌ๋ client์๊ฒ ์ฑ ์์ด ์๋ค.
- ์ฅ์ : scaling ์ด ์์ ๋กญ๋ค.
-
REST๋ ์น ํ์ค์ธ HTTP๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์น์์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ผ์ HTTP๊ฐ ๊ฐ์ง ์บ์ฑ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์๋ค.
-
HTTP ํ๋กํ ์ฝ์์ ์ฌ์ฉํ๋ ํ๊ทธ๋ค์ ํ์ฉํ์ฌ ์บ์ฑ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
- ์บ์ฑ ์ฒ๋ฆฌ๋ GET ์์ฒญ์์ ์ฃผ๋ก ์ฒ๋ฆฌ ๋๋ค. (post, put ์ผ๋ก๋ ๊ฐ๋ฅ์ ํ๋, ์ ์์ด๋ค.)
- ๊ด๋ จ ํค๋๋ค
- If-Match
- client ๊ฐ ํจ๊ป ๋ณด๋ธ Etag ์๋ณ์์ ๊ฐ์ ๊ฐ์ด ์์ผ๋ฉด 200
- ๋ค๋ฅธ ๊ฐ์ด ์์ผ๋ฉด 412 http code ๋ก ์๋ต, ๋ฎ์ด์ฐ๊ธฐ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
- If-Modified-Since
- Last-Modified ์ ๊ฐ์ ํ๊ธฐํ์ฌ ์ ๋ฌํด์ฃผ๊ณ , ๋์ผํ ์ปจํ ์ธ ๋ผ๋ฉด ( ์ต์ข ์์ ์๊ฐ์ด ๊ฐ๋ค๋ฉด ) 304 http code ๋ก ์๋ต
- ๋ง์ฝ ๋ค๋ฅธ ์ปจํ ์ธ ๋ผ๋ฉด (If-Modified-Since ์ ๋ค์ด๊ฐ last-modified ๊ฐ๋ณด๋ค ์ดํ์ ๋ฐ์ดํฐ๊ฐ ์์ ๋์๋ค๋ฉด) 200 ์ผ๋ก ์๋ต
- If-None-match : ETag ์๋ณ์์ ๊ฐ์ ๊ฐ์ด๋ผ๋ฉด 304๋ฅผ ์ ๋ฌํ๊ณ , ๋ค๋ฅธ ๊ฐ์ด๋ผ๋ฉด 200์ ์๋ตํ๋ค. ์ ๊ท ๊ฐ์ ์์ฑํ๊ณ , ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ๊ธ์งํ๋ ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
- If-Match
- ์บ์ฑ ๊ด๋ จ ๊ฒ์ฆ ํค๋
- ETag
- last-modified
- ์ฐธ๊ณ
- 412 : Precondition Failed , ํด๋ผ์ด์ธํธ ์ค๋ฅ ์๋ต ์ฝ๋๋ ๋์ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค๊ฐ ๊ฑฐ๋ถ๋์์์ ๋ํ๋ ๋๋ค.
- ETag : ETag HTTP ์๋ต ํค๋๋ ํน์ ๋ฒ์ ์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ ์๋ณ์์ ๋๋ค. (like ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ)
- REST API๋ง ๋ณด๊ณ ๋ ์ด๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ ์ ์ฅ์์๋ REST API ์๋ฒ๋ง ํธ์ถํ๋ค.
- ํ์ง๋ง, REST ์๋ฒ๋ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ํธํ ๊ณ์ธต์ ์ถ๊ฐํด ๊ตฌ์กฐ์์ ์ ์ฐ์ฑ์ ๋ ์ ์๊ณ PROXY, ๊ฒ์ดํธ์จ์ด ๊ฐ์ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ ์ค๊ฐ๋งค์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์
- ๋ด๋ถ ๋ ์ด์ด๋ฅผ ์จ๊ธฐ๊ณ , ์ธ์ ํ ๋ ์ด์ด์๋ง ๊ณต๊ฐํจ์ผ๋ก์จ ๋ ์ด์ด๊ฐ์ ๊ฒฐํฉ์ ์ค์ธ๋ค.
- HTTP ํ์ค๋ง ๋ฐ๋ฅธ๋ค๋ฉด ์ด๋ค ์ธ์ด ํน์ ์ด๋ค ํ๋ซํผ์์ ์ฌ์ฉํ์ฌ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ธํฐํ์ด์ค ์คํ์ผ์ด๋ค.
- ์๋๋ก์ด๋ ํ๋ซํผ, IOS ํ๋ซํผ ๋ฑ ํน์ ์ธ์ด๋ ํ๋ซํผ์ ์ข ์๋์ง ์๊ณ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- URI ์ ๋ฆฌ์์ค๋ช ์ ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๊ณ , ๋์ฌ๋ณด๋ค๋ ๋ช ์ฌ๋ฅผ ์ฌ์ฉํ์
GET /members/delete/1
delete ์ ๊ฐ์ ํ์๋ฅผ ๋ํ๋ด๋ ํํ์ด ๋ค์ด๊ฐ๋ ๊ฒ์ ์ง์ํด์ผ ํ๋ค. ๋จ์ ๋ช ์ฌ๋ณด๋ค๋ ๋ณต์ ๋ช ์ฌ๋ฅผ ์ฌ์ฉํ์
- ์์์ ๋ํ ํ์๋ HTTP ๋ฉ์๋๋ฅผ ํตํด์ ํํํ์
DELETE /members/1
์๋ฏธ : ํ์๋ค ์ค์์ id 1๋ฒ์ ๊ฐ์ง ํ์ ์ญ์
-
ํ์ดํ(-) ์ URI ์ ๊ฐ๋ ์ฑ์ ์ํด์ ์ฌ์ฉํ์ ๋ฐ์ค(_) ์ ์ฌ์ฉํ์ง ์๋๋ค.
-
์ฌ๋์ ๊ตฌ๋ถ์(/) ๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ผ ๋ ์ฌ์ฉํ์ URI ์ ๋ง์ง๋ง ๋ฌธ์๋ก ์ฌ์ฉํ๋ฉด ์๋๋ค.
GET /members/1/ (X)
GET /members/1 (O)
- ํ์ผ ํ์ฅ์๋ URI ์ ํฌํจ์ํค์ง ์๋๋ค. Accept header ํค๋๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์ธ ํ์ ์ ์๋ ค์ค ์ ์์ผ๋ฏ๋ก, ํ์ ์ ์๋ ค์ฃผ๊ธฐ ์ํด์ ์ด ํค๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- ์์ ์ ๊ด๊ณ๋ฅผ ํํํ๊ธฐ
GET /users/{userId}/devices ( ์ ์ ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋๋ฐ์ด์ค ๋ชฉ๋ก )
- ๊ตฌ์ฒด์ ์ธ ํํ์ด ํ์ํ ๋
GET /users/{userId}/likes/devices ( ์ ์ ๊ฐ ์ข์ํ๋ ๋๋ฐ์ด์ค ๋ชฉ๋ก )
์ ์ค๊ณ๋ API ๋ ๋ฆฌ์์ค์ ๋ํ ์๋ต๊น์ง๋ ์ ํด์ค์ผ ํ๋ค.
- 200๋
- 200 : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ์์ ์ผ๋ก ์ํ
- 201 : POST ๋ฅผ ํตํ ๋ฆฌ์์ค ์์ฑ ์์ ์, ํด๋น ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋จ์ ์๋ ค์ค
- 400๋
- 400 : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ถ์ ์ ํ ๊ฒฝ์ฐ ์ฌ์ฉ
- 401 : ์ธ์ฆ๋์ง ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต
- 403 : ์ธ๊ฐ๋์ง ์์, ์๋ตํ๊ณ ์ถ์ง ์์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค ํ ๋ ์ด์ ๋ํ ์๋ต
- 405 : ์์ฒญ ๋ฆฌ์์ค์ ๋ํด ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ method ๋ฅผ ์ด์ฉํ์ ๋ ์ฌ์ฉํ๋ ์๋ต
- 500๋
- 500 : ์๋ฒ์ ๋ฌธ์ ๊ฐ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
- 300๋
- 301 : ์์ฒญํ ๋ฆฌ์์ค์ ๋ํ URI ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์ฌ์ฉํ๋ ์๋ต ์ฝ๋
- https://jaenyeong.github.io/interview/next-step-interview/#%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
- https://velog.io/@couchcoding/%EA%B0%9C%EB%B0%9C-%EC%B4%88%EB%B3%B4%EB%A5%BC-%EC%9C%84%ED%95%9C-RESTful-API-%EC%84%A4%EA%B3%84-%EA%B0%80%EC%9D%B4%EB%93%9C
- https://velog.io/@shroad1802/REST
- https://withbundo.blogspot.com/2017/07/http-13-http-iii-if-match-if-modified.html
- https://developer.mozilla.org/ko/docs/Web/HTTP/Caching
- https://sharplee7.tistory.com/49