REST(Representational State Transfer)
์์์ ์ด๋ฆ์ผ๋ก ๊ตฌ๋ถํ์ฌ ํด๋น ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ๊ฒ์ ์๋ฏธํ๋ค.
HTTP ์์์ REST ๋?
1. HTTP URI(Uniform Resource Identifier)๋ก ์์(Resource)์ ๋ช ์
2. HTTP Method(POST, GET, PUT, DELETE, PATCH ๋ฑ)๋ก
3. ํด๋น ์์(URI)์ ๋ํ CRUD Operation์ ์ ์ฉํ๋ ๊ฒ์ ์๋ฏธ
HTTP REST ๊ตฌ์ฑ์์
- ์์(Resource): HTTP URI
- ์์์ ๋ํ ํ์(Verb): HTTP Method
- ํํ(Representations)
HTTP REST ํน์ง
- ์๋ฒ-ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ(Server-Client)
- ๋ฌด์ํ์ฑ(Stateless)
- ์บ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ(Cacheable)
- ๊ณ์ธตํ(Layered System)
- ์ธํฐํ์ด์ค ์ผ๊ด์ฑ(Uniform Interface)
RESTful API
RESTful ์ด๋ REST ์ ์๋ฆฌ๋ฅผ ๋ฐ๋ฅด๋ ์์คํ ์ ๋งํ๋ค. REST ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํด์ ๋ชจ๋๊ฐ RESTful ํ ๊ฒ์ด ์๋๋ผ REST API ์ ์ค๊ณ ์์น์ ์ฌ๋ฐ๋ฅด๊ฒ ์งํจ ์์คํ ๋ง RESTful ํ๋ค๊ณ ๋งํ ์ ์๋ค.
REST API ์ค๊ณ ์์น
- URI ๋ ๋์ฌ๋ณด๋ค๋ ๋ช ์ฌ๋ฅผ, ๋๋ฌธ์๋ณด๋ค๋ ์๋ฌธ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
- ์ฌ๋์ ๊ตฌ๋ถ์๋ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉํ๊ณ ๋ง์ง๋ง์ ์ฌ๋์(/)๋ฅผ ํฌํจํ์ง ์๋๋ค.
- ์ธ๋๋ฐ ๋์ ํ์ดํ์ ์ฌ์ฉํ๋ค.
- ํ์ผํ์ฅ์๋ URI ์ ํฌํจํ์ง ์๋๋ค.
- ํ์๋ฅผ ํฌํจํ์ง ์๋๋ค.
HTTP Method
์๋ฒ๊ฐ ์ํํด์ผ ํ ๋์์ ์ง์ ํ์ฌ ์์ฒญ์ ๋ณด๋ธ๋ค.
HTTP Method ์ข ๋ฅ
- GET: ๋ฆฌ์์ค ์กฐํ
- POST: ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ ์ ๋ฌ, ์ฃผ๋ก ์ ๊ท ๋ฆฌ์์ค์ ๋ฑ๋ก์ ์ฌ์ฉ
- PUT: ๋ชฉ์ ๋ฆฌ์์ค๋ฅผ ํ์ฌ ๋ฉ์์ง์ ๊ฐ์ผ๋ก ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ๋ฆฌ์์ค๋ฅผ ์ญ์ ํ๊ณ ๋ฎ์ด์ฐ๊ธฐ
- PATCH: ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
- DELETE: ๋ฆฌ์์ค ์ญ์
HTTP Method ์์ฑ
- ์์ ์ฑ(Safe)
- ๋ฉฑ๋ฑ์ฑ(Idempotent)
- ์บ์๊ฐ๋ฅ(Cacheable)
์์ ์ฑ(Safe)
ํธ์ถํด๋ ์๋ฒ์ ์ํ๋ฅผ ๋ฐ๊พธ์ง ์๋ ์ฑ์ง
- ์ฝ๊ธฐ ์์ ๋ง ์ํํ๋ ๋ฉ์๋๋ ์์ ํ๋ค.
- ๊ผญ ์ฝ๊ธฐ ์ ์ฉ์ด์ด์ผ ํ๋ ๊ฑด ์๋๊ณ , ์๋ฒ๊ฐ ์์ฒญ ์ ๋ณด์ ํต๊ณ ๋ฑ์ ๊ธฐ๋กํจ์ผ๋ก์จ ์์ ์ ์ํ์ ๋ณ๊ฒฝ์ ๊ฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- ๋ชจ๋ ์์ ํ ๋ฉ์๋๋ ๋ฉฑ๋ฑ์ฑ๋ ๊ฐ์ง๋ง, ๋ฉฑ๋ฑ์ฑ์ ์ง๋ ๋ชจ๋ ๋ฉ์๋๊ฐ ์์ ํ ๊ฒ์ ์๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ํ ๋ณํ๋ฅผ ์ง์ ์์ฒญํ์ง ์์ ์๋ฒ์ ๋ถํ์ํ ๋ถํ ์ฃผ์ง ์์ ๊ฒ์ด๋ฏ๋ก ์์ ๋กญ๊ฒ ํธ์ถํ ์ ์๋ค.
- GET ๋ฉ์๋๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ฏ๋ก ์์ ํ HTTP ๋ฉ์๋์ด๋ค.
- ๋ฐ๋ฉด์ POST/PUT/PATCH/DELETE ๋ฉ์๋๋ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๊ฑฐ๋ ์ญ์ ๋๋ฏ๋ก ์์ ํ์ง ์์ HTTP ๋ฉ์๋์ด๋ค.
๋ฉฑ๋ฑ์ฑ(Idempotent)
์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํด๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๊ณ ํ ๋ฒ๋ง ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ฑ์ง
- f(f(x)) = f(x) ๋ฅผ ๋ง์กฑ์ํค๋ ์ฑ์ง์ด๋ค.
- ์ ๋๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ abs() ํจ์๊ฐ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง๋ค.
- ์์ ์ํ ์์ฒญ์ด ์ต์ ํ ๋ฒ ๋ฐ์ํ๋๋ก ๋ณด์ฅ๋์ง๋ง ๋ ๋ฒ ์ด์ ๋ฐ์ํ ์๋ ์๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ ์ค๊ณ์ ์์ฃผ ์ฌ์ฉ๋๋ค.
- ๋ฉฑ๋ฑ์ฑ์ ๋ฐ์ง ๋๋ HTTP ์๋ต Status์ ์๊ด์์ด ์๋ฒ์ ์ํ๋ง ๋น๊ตํ๊ณ ์ธ๋ถ ์์ธ์ผ๋ก ์ธํด ์ค๊ฐ์ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๊ณ ๋ คํ์ง ์๋๋ค.
- HTTP Spec์ ๋ช ์๋ ๊ฒ์ ์ํ๋ฉด GET, PUT, DELETE ๋ฉ์๋๋ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง๋๋ก, POST, PATCH ๋ฉ์๋๋ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง์ง ์๋๋ก ๊ตฌํํด์ผ ํ๋ค.
๋ฉฑ๋ฑ์ ์ด์ง ์์ ์ค๊ณ
โ๏ธ GET
๊ฒ์๊ธ์ ์กฐํํ๋ฉด ์กฐํ์๋ฅผ ์ฌ๋ฆฌ๋๋ก ๊ตฌํํ ๊ฒฝ์ฐ
1. GET /board/1
2. ์๋ฒ์์ id ๊ฐ์ด 1์ธ ๊ฒ์๊ธ ์กฐํ
3. ํด๋น ๊ฒ์๊ธ์ ์กฐํ์ 1 ์ฆ๊ฐ
4. ๋ฐ์ดํฐ ์๋ต
HTTP ์คํ์ ๋ถํฉํ์ง ์๊ฒ API๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
์กฐํ์ ์ปฌ๋ผ์ ๊ฐ์ ์ฆ๊ฐ์ํค๋ ์์ฒญ์ PATCH๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค.
โ๏ธ DELETE
๋ง์ง๋ง ๊ฒ์๊ธ์ ์ญ์ ํ๋๋ก ๊ตฌํํ ๊ฒฝ์ฐ
1. DELETE /board/last
2. ๋ง์ง๋ง ๊ฒ์๊ธ ์ญ์
3. ๋ค์ ์์ฒญ ์ ๋ ๋ค๋ฅธ ๋ง์ง๋ง ๊ฒ์๊ธ ์ญ์
HTTP ์คํ ์ DELETE๋ก ๊ตฌํํ๋ ค๋ฉด ์ ํํ ์๋ณ์๋ก ๋ฆฌ์์ค๋ฅผ ์ง์ ํด์ผ ํ๋ค.
์ด๋ฐ ๊ฒฝ์ฐ์๋ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง์ง ์๋ POST๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
โ๏ธ PATCH
PATCH๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง์ง ์๋ ๋ฉ์๋์ธ๋ฐ ๊ทธ ๊ตฌํ์ PUT๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ํ ๊ฒฝ์ฐ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ง๊ฒ ๋๋ ํน์ฑ์ ์ง๋๋ค. PUT ๋ฉ์๋๋ ๋ฐ๋์ ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ์ง๋ง PATCH ๋ฉ์๋๋ ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ์ง ์์ ์๋ ์๋ค.
1. PATCH /users/1 {age: {value: 1}}
2. age๋ฅผ 1๋งํผ ์ฆ๊ฐํ๋ ๋ณ๊ฒฝ
๐ ์์ ์ฑ๊ณผ ๋ฉฑ๋ฑ์ฑ
์์ ์ฑ์ ํ ๋ฒ์ ํธ์ถํ๋ ์ฌ๋ฌ ๋ฒ์ ํธ์ถํ๋ ๋ฆฌ์์ค์ ์์ ์ด ๋ฐ์ํ์ง ์๋ ์์ฑ์ด๋ค.
๋ฉฑ๋ฑ์ฑ์ ๋ฆฌ์์ค์ ์์ ์ด ๋ฐ์ํด๋ ๋ฉ์๋๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ ๊ฒ๊ณผ ํ ๋ฒ ์คํํ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค๋ฉด ๋ง์กฑํ๋ ์์ฑ์ด๋ค.
์บ์๊ฐ๋ฅ(Cacheable)
์๋ต ๊ฒฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ์บ์ฑํด์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๊ฐ์ ๋ํ ์ฌ๋ถ
- ๋ธ๋ผ์ฐ์ ์ ์บ์๋ฅผ ์ด์ฉํ๋ ค๋ฉด ์๋ณธ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ณ ์ ์ง๋์ด์ผ ํ๋๋ฐ POST, PUT, DELETE, PATCH๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋๋ ๋ฉ์๋์ด๋ฏ๋ก ์บ์ ๋ถ์ผ์น๊ฐ ์๊ธธ ๋ฌธ์ ๊ฐ ์์ด GET, HEAD ์ ๋์๋ง ์ด์ฉํ๋ค.
์ฐธ๊ณ ์๋ฃ
- https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-HTTP%EC%9D%98-%EB%A9%B1%EB%93%B1%EC%84%B1-%C2%B7-%EC%95%88%EC%A0%95%EC%84%B1-%C2%B7-%EC%BA%90%EC%8B%9C%EC%84%B1-%F0%9F%92%AF-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
- https://hudi.blog/http-method-idempotent/
- https://khj93.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-REST-API%EB%9E%80-REST-RESTful%EC%9D%B4%EB%9E%80
'๊ฐ๋ฐ > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
RESTful API ์ค๊ณ ์์น / ๋ค์ด๋ฐ ๊ท์น (0) | 2023.05.08 |
---|---|
in-memory / cache / redis / memcached (0) | 2022.07.10 |
HTTP๋ ๋ฌด์์ผ๊น์? (0) | 2021.10.16 |
์ธํฐ๋ท์ ์ด๋ป๊ฒ ์๋๋ ๊น์? (0) | 2021.10.07 |
๋๊ธ