HTTP ๋ฉ์๋ ํ์ฉ
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ ์ ์ก
๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์
1. ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
- GET
- ์ฃผ๋ก ์ ๋ ฌ ํํฐ(๊ฒ์์ด)
2. ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
- POST, PUT, PATCH
- ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฆฌ์์ค ๋ฑ๋ก, ๋ฆฌ์์ค ๋ณ๊ฒฝ
4๊ฐ์ง ์ํฉ
1. ์ ์ ๋ฐ์ดํฐ ์กฐํ
- ์ด๋ฏธ์ง, ์ ์ ํ ์คํธ ๋ฌธ์
- ์กฐํ๋ GET ์ฌ์ฉ
- ์ ์ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์์ด ๋ฆฌ์์ค ๊ฒฝ๋ก๋ก ๋จ์ํ๊ฒ ์กฐํ ๊ฐ๋ฅ
2. ๋์ ๋ฐ์ดํฐ ์กฐํ
- ์ฃผ๋ก ๊ฒ์, ๊ฒ์ํ ๋ชฉ๋ก์์ ์ ๋ ฌ ํํฐ(๊ฒ์์ด)
- ์กฐํ ์กฐ๊ฑด์ ์ค์ฌ์ฃผ๋ ํํฐ, ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๋ ์ ๋ ฌ ์กฐ๊ฑด์ ์ฃผ๋ก ์ฌ์ฉ
- ์กฐํ๋ GET ์ฌ์ฉ
- GET์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฌ์ฉํด์ ๋ฐ์ดํฐ ์ ๋ฌ
- GET๋ ๋ฉ์์ง ๋ฐ๋์ ๋ฐ์ดํฐ ๋ฃ์ด์ ์ ์กํ ์ ์์ง๋ง ์ค๋ฌด์์๋ ๊ถ์ฅ ์ํจ
3. HTML Form์ ํตํ ๋ฐ์ดํฐ ์ ์ก
- ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
- ex) ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฑํ ์์ฒญ HTTP ๋ฉ์์ง
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
username=kim&age=20
โ๏ธ ์ฃผ์: GET์ ์กฐํ์๋ง ์ฌ์ฉ! ๋ฆฌ์์ค ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ ๊ณณ์ ์ฌ์ฉํ๋ฉด ์๋จ
- multipart/form-data: ์ฃผ๋ก ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์กํ ๋ ์ฌ์ฉ
- HTML Form submit์ POST ์ ์ก
- ex) ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
- Content-Type: application/x-www-form-urlencoded ์ฌ์ฉ
- form์ ๋ด์ฉ์ ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด์ ์ ์ก(key=value, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์)
- ์ ์ก ๋ฐ์ดํฐ๋ฅผ url encoding์ฒ๋ฆฌ
- ์) abc๊น -> abc%EA%B9%80
- HTML Form์ GET ์ ์ก๋ ๊ฐ๋ฅ
- Content-Type: multipart/form-data
- ํ์ผ ์ ๋ก๋ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์ก ์ ์ฌ์ฉ
- ๋ค๋ฅธ ์ข ๋ฅ์ ์ฌ๋ฌ ํ์ผ๊ณผ ํผ์ ๋ด์ฉ ํจ๊ป ์ ์ก ๊ฐ๋ฅ
- ์ฐธ๊ณ : HTML Form์ ์ก์ GET, POST๋ง ์ง์
4. HTTP API๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
- ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
- ์๋ฒ to ์๋ฒ
- ๋ฐฑ์๋ ์์คํ ํต์
- ์ฑ ํด๋ผ์ด์ธํธ
- ์์ดํฐ, ์๋๋ก์ด๋
- ์น ํด๋ผ์ด์ธํธ(Ajax)
- HTML์์ Form ์ ์ก ๋์ ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ํต์ ์ ์ฌ์ฉ(AJAX)
- ์) React, Vue.js ๊ฐ์ ์น ํด๋ผ์ด์ธํธ์ API ํต์
- POST, PUT, PATCH: ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ์ก
- GET: ์กฐํ, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
- Content-Type: application/json์ ์ฃผ๋ก ์ฌ์ฉ(์ฌ์ค์ ํ์ค)
- TEXT, XML, JSON ๋ฑ๋ฑ
HTTP API ์ค๊ณ ์์
- HTTP API - ์ปฌ๋ ์
- POST ๊ธฐ๋ฐ ๋ฑ๋ก
- ์๋ฒ๊ฐ ๋ฆฌ์์ค URI ๊ฒฐ์
- ์) ํ์ ๊ด๋ฆฌ API ์ ๊ณต
- HTTP API - ์คํ ์ด
- PUT ๊ธฐ๋ฐ ๋ฑ๋ก
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค URI ๊ฒฐ์
- ์) ์ ์ ์ปจํ ์ธ ๊ด๋ฆฌ, ์๊ฒฉ ํ์ผ ๊ด๋ฆฌ
- HTML FORM ์ฌ์ฉ
- ์น ํ์ด์ง ํ์ ๊ด๋ฆฌ
- GET, POST ๋ง ์ง์
- ์์ HTML+HTML form ์ฌ์ฉ
ํ์ ๊ด๋ฆฌ ์์คํ
API ์ค๊ณ - POST ๊ธฐ๋ฐ ๋ฑ๋ก
- ํ์ ๋ชฉ๋ก /members -> GET
- ํ์ ๋ฑ๋ก /members -> POST
- ํ์ ์กฐํ /memers/{id} -> GET
- ํ์ ์์ /members/{id} -> PATCH, PUT, POST
- ํ์ ์ญ์ /members/{id} -> DELETE
POST - ์ ๊ท ์์ ๋ฑ๋ก ํน์ง
- ํด๋ผ์ด์ธํธ๋ ๋ฑ๋ก๋ ๋ฆฌ์์ค์ URI๋ฅผ ๋ชจ๋ฆ
- ํ์ ๋ฑ๋ก /members -> POST
- POST /members
- ์๋ฒ๊ฐ ์๋ก ๋ฑ๋ก๋ ๋ฆฌ์์ค URI๋ฅผ ์์ฑ
- HTTP/1.1 201 Created
- Location: /members/100
- ์ปฌ๋ ์
(Collection)
- ์๋ฒ๊ฐ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ๋๋ ํ ๋ฆฌ
- ์๋ฒ๊ฐ ๋ฆฌ์์ค์ URI๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌ
- ์ฌ๊ธฐ์ ์ปฌ๋ ์ ์ /members
ํ์ผ ๊ด๋ฆฌ ์์คํ
API ์ค๊ณ - PUT ๊ธฐ๋ฐ ๋ฑ๋ก
- ํ์ผ ๋ชฉ๋ก /files -> GET
- ํ์ผ ์กฐํ /files/{filename} -> GET
- ํ์ผ ๋ฑ๋ก /files/{filename} -> PUT
- ํ์ผ ์ญ์ /files/{filename} -> DELETE
- ํ์ผ ๋๋ ๋ฑ๋ก /files -> POST
PUT - ์ ๊ท ์์ ๋ฑ๋ก ํน์ง
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค URI๋ฅผ ์๊ณ ์์ด์ผ ํจ
- ํ์ผ ๋ฑ๋ก /files/{filename} -> PUT
- PUT /files/star.jpg
- ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ๋ฆฌ์์ค์ URI๋ฅผ ์ง์
- ์คํ ์ด(Store)
- ํด๋ผ์ด์ธํธ๊ฐ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ์ ์ฅ์
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ URI๋ฅผ ์๊ณ ๊ด๋ฆฌ
- ์ฌ๊ธฐ์ ์คํ ์ด๋ /files
→ ๋๋ถ๋ถ POST ๊ธฐ๋ฐ์ ์ปฌ๋ ์ ์ฌ์ฉ
HTML FORM ์ฌ์ฉ
- HTML FROM์ GET, POST๋ง ์ง์
- AJAX ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํด์ ํด๊ฒฐ ๊ฐ๋ฅ -> ํ์ API ์ฐธ๊ณ
- ์ฌ๊ธฐ์๋ ์์ HTML, HTML FROM ์ด์ผ๊ธฐ
- GET, POST๋ง ์ง์ํ๋ฏ๋ก ์ ์ฝ์ด ์์
- ์ปจํธ๋กค URI
- GET, POST๋ง ์ง์ํ๋ฏ๋ก ์ ์ฝ์ด ์์
- ์ด๋ฐ ์ ์ฝ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ฌ๋ก ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก ์ฌ์ฉ
- POST์ /new, /edit, /delete๊ฐ ์ปจํธ๋กค URI
- HTTP ๋ฉ์๋๋ก ํด๊ฒฐํ๊ธฐ ์ ๋งคํ ๊ฒฝ์ฐ ์ฌ์ฉ(HTTP API ํฌํจ)
- ํ์ ๋ชฉ๋ก /members -> GET
- ํ์ ๋ฑ๋ก ํผ /members/new -> GET
- ํ์ ๋ฑ๋ก /members/new, /members -> POST
- → ํผ์ GET์ผ๋ก ๋์ค๊ณ , ๋ฑ๋ก์ GET๊ณผ ๊ฐ์ URL์ ์ฌ์ฉํ๋ฉด์ POSTํ๋ ๊ฒ์ ์ ํธํจ(๋ ๊ฐ์ ๊ฒฝ๋ก ๋ง์ถฐ๋์ผ๋ฉด ๊น๋ํ๊ฒ ์ด๋ ๊ฐ๋ฅ)
- ํ์ ์กฐํ /members/{id} -> GET
- ํ์ ์์ ํผ /members/{id}/edit -> GET
- ํ์ ์์ /members/{id}/edit, /members/{id} -> POST
- ํ์ ์ญ์ /members/{id}/delete -> POST
โญ๏ธ ์ฐธ๊ณ ํ๋ฉด ์ข์ URI ์ค๊ณ ๊ฐ๋
https://restfulapi.net/resource-naming/
REST Resource Naming Guide
In REST, having a strong and consistent REST resource naming strategy – will prove one of the best design decisions in the long term.
restfulapi.net
- ๋ฌธ์(document)
- ๋จ์ผ ๊ฐ๋ (ํ์ผ ํ๋, ๊ฐ์ฒด ์ธ์คํด์ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค row)
- ์) /members/100, files/start.jpg
- ์ปฌ๋ ์
(collection)
- ์๋ฒ๊ฐ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ๋๋ ํฐ๋ฆฌ
- ์๋ฒ๊ฐ ๋ฆฌ์์ค์ URI๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌ
- ์) /members
- ์คํ ์ด(store)
- ํด๋ผ์ด์ธํธ๊ฐ ๊ด๋ฆฌํ๋ ์์ ์ ์ฅ์
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ URI๋ฅผ ์๊ณ ๊ด๋ฆฌ
- ์) /files
- ์ปจํธ๋กค๋ฌ(controller), ์ปจํธ๋กค URI
- ๋ฌธ์, ์ปฌ๋ ์ , ์คํ ์ด๋ก ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ์ถ๊ฐ ํ๋ก์ธ์ค ์คํ
- ๋์ฌ๋ฅผ ์ง์ ์ฌ์ฉ
- ์) /members/{id}/delete