๐ ์ข์ URI ์ค๊ณ๋ ๋ญ๊น?
๐ ๋ฆฌ์์ค ์๋ณ
๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฆฌ์์ค ์๋ณ. ํ์ ์ ๋ณด ๊ด๋ฆฌ API๋ฅผ ๋ง๋ค์ด๋ณด์.
ํ์ํ ๊ธฐ๋ฅ์ด ๋ญ๊ฐ ์๋๋ผ...
ํ์ ๋ชฉ๋ก ์กฐํ, ํ์ ์กฐํ, ํ์ ๋ฑ๋ก, ํ์ ์์ , ํ์ ์ญ์ ?
๐๋ฆฌ์์ค๋?
"ํ์"์ด๋ผ๋ ๊ฐ๋ ์์ฒด๊ฐ ๋ฐ๋ก ๋ฆฌ์์ค!
๐๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ์๋ณํ๋?
ํ์์ ๋ฑ๋ก, ์์ , ์ญ์ ํ๋ ๊ฒ์ ์๊ฐํ์ง ๋ง๊ณ ํ์ ์์ฒด๋ง ๋ฆฌ์์ค๋ก ์๋ณํด์ ํ์ ๋ฆฌ์์ค๋ฅผ URI์ ๋งคํ
๐๋ฆฌ์์ค์ ํ์ ๋ถ๋ฆฌ
* URI๋ ๋ฆฌ์์ค๋ง ์๋ณ!
* ๋ฆฌ์์ค์ ํด๋น ๋ฆฌ์์ค๋ฅผ ๋์์ผ๋ก ํ๋ ํ์๋ฅผ ๋ถ๋ฆฌํด์ผ ํจ.
์์๋ก ๋ค์๋ ํ์ ์ ๋ณด ๊ด๋ฆฌ API์ ๊ฒฝ์ฐ ๋ฆฌ์์ค๋ ํ์์ด๊ณ ํ์๋ ์กฐํ, ๋ฑ๋ก, ์ญ์ , ๋ณ๊ฒฝ์ด๋ค.
์ฆ ๋ฆฌ์์ค๋ ๋ช ์ฌ, ํ์๋ ๋์ฌ
๊ทธ๋ผ ํ์(๋ฉ์๋)๋ ์ด๋ป๊ฒ ๊ตฌ๋ถํ์ง? ๊ทธ๋์ ๋ฑ์ฅํ๋ ๊ฒ์ด โ HTTP ๋ฉ์๋โ
๐ HTTP ๋ฉ์๋
๐ GET: ๋ฆฌ์์ค ์กฐํ
* ์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ query๋ฅผ ํตํด ์ ๋ฌ
๐ POST: ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
* ๋ฉ์ธ์ง ๋ฐ๋๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํด๋ฌ๋ผ๊ณ ์ ๋ฌ
* ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ. ๋ฉ์ธ์ง ๋ฐ๋๋ฅผ ํตํด ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ๊ธฐ๋ฅ ์ํ
* ์ฃผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ก ์ ๊ท ๋ฆฌ์์ค ๋ฑ๋ก, ํ๋ก์ธ์ค ์ฒ๋ฆฌ(๋จ์ํ ๋ฐ์ดํฐ ์์ฑ์ด๋ ๋ณ๊ฒฝ์ ๋์ด ํ๋ก์ธ์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ)์ ์ฌ์ฉ.
๋จ, POST์ ๊ฒฐ๊ณผ๋ก ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋์ง ์์ ์ ์์. URI์ ๋์ฌ๊ฐ ํฌํจ๋ ์ ์์. (:์ปจํธ๋กค URI ์๋ฅผ ๋ค์ด ๋ฐฐ๋ฌ ์์์ ๊ฒฝ์ฐ POST/orders/{orderId}/start-delivery)
-> ์ด ๋ฆฌ์์ค URI์ POST ์์ฒญ์ด ์ค๋ฉด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๋ฆฌ์์ค๋ง๋ค ๋ฐ๋ก ์ ํด์ผ ํจ (์ ํด์ง ๊ฒ์ด ์์)
-> ๋ค๋ฅธ ๋ฉ์๋๋ก ์ฒ๋ฆฌํ๊ธฐ ์ ๋งคํ๋ฉด POST
๐ PUT: ๋ฆฌ์์ค๋ฅผ ๋์ฒด, ํด๋น ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ. ์์ผ๋ฉด ๋ฎ์ด์ฐ๊ธฐ
* ํด๋์ ํ์ผ ๋ณต์ฌํ๋ ๋ก์ง๊ณผ ๊ฐ์.
* ๋ฆฌ์์ค๊ฐ ์ด๋ฏธ ์์ผ๋ฉด ์์ ํ ๋์ฒด, ์์ผ๋ฉด ์์ฑ
* !์ฃผ์! ๊ธฐ์กด ๋ด์ฉ์ ์์ ํ ๊ฐ์์น์ฐ๋ ๊ฒ. ๋ฆฌ์์ค๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์์ ํ๊ธฐ ์ด๋ ค์. -> PATCH
* POST์์ ์ฐจ์ด์ : ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋ณ. POST๋ ๋ฆฌ์์ค๋ฅผ ์์ฑ์ ํ์ง๋ง ๋ช๋ฒ์ ๋ฃ๋์ง ์์น๋ ๋ชจ๋ฆ. ํ์ง๋ง PUT์ ์ ํํ 100๋ฒ์ ์ง์ด๋ฃ์๊ฑฐ์ผ!๋ผ๊ณ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ์๊ณ URI ์ง์ .
๐ PATCH: ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
* ๋ฆฌ์์ค๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ ๋ด๊ฐ ์์ ํ๊ณ ์ถ์ ๋ฆฌ์์ค๋ง PATCH๋ก ๋ณด๋ด์ฃผ๋ฉด ๋จ.
* PATCH๊ฐ ์ง์์ด ์๋๋ ์๋ฒ๊ฐ ์์ ์ ์์. (๊ฑฐ์ ๋๋ถ๋ถ ๋ ํ ์ง๋ง)
๐ DELETE: ๋ฆฌ์์ค ์ญ์
* ๋ฆฌ์์ค ์ญ์
๐ HTTP ๋ฉ์๋์ ์์ฑ
๐ ์์ (Safe Methods)
* ํธ์ถํด๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์. ๋ก๊ทธ๊ฐ ์์ด๊ณ ์ด์ฉ๊ตฌ ํ๋ ๋ถ๋ถ์ ๊ณ ๋ คํ์ง ์์.
๐๋ฉฑ๋ฑ(Idempotent Methods)
* f(f(x))=f(x)
* ํ ๋ฒ ํธ์ถํ๋ ๋ ๋ฒ ํธ์ถํ๋ ์ค๋ง๋ฒ ํธ์ถํ๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ฐ์.
* ๋ฉฑ๋ฑ ๋ฉ์๋: GET, PUT, DELETE (POST๋ ๋ฉฑ๋ฑ์๋! ๋ ๋ฒ ํธ์ถํ๋ฉด ๊ฐ์ ๊ฒฐ์ ๊ฐ ์ค๋ณตํด์ ๋ฐ์ํ ์ ์์.)
* ์ฌ์์ฒญ ์ค๊ฐ์ ์ฌ์ฉ์๊ฐ ๋ฐ๋์ด์ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฑ ์ธ๋ถ ์์ธ์ผ๋ก ์ธํด ์ค๊ฐ์ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๊ณ ๋ คํ์ง ์์.
๐์บ์ ๊ฐ๋ฅ(Cacheable Medthods)
* ์๋ต ๊ฒฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ์บ์ํด์ ์ฌ์ฉํด๋ ๋๋๊ฐ?
* ์บ์ ๊ฐ๋ฅ ๋ฉ์๋: GET, HEAD, POST, PATCH
* ์ค์ ๋ก๋ GET๋ง ์บ์๋ก ์ฌ์ฉ
๐ HTTP ๋ฉ์๋ ํ์ฉ
๐ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ ์ ์ก
๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์ ํฌ๊ฒ 2๊ฐ์ง์ธ๋ฐ,
๐ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ(์ฟผ๋ฆฌ ์คํธ๋ง)๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
* ์ฐธ๊ณ ๋ก ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ key-value ํํ๋ก ์ด๋ฃจ์ด์ ธ์ '?'๋ก ์์ํ๋ '?q=hello&hl=ko'๊ฐ์๊ฒ
* GET ๋ฉ์๋์์ ์ฃผ๋ก ์ฌ์ฉ
* ์ฃผ๋ก ์ ๋ ฌ ํํฐ (=๊ฒ์์ด)
๐ ๋ฉ์ธ์ง ๋ฐ๋๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
* POST, PUT, PATCH ๋ฉ์๋์์ ์ฃผ๋ก ์ฌ์ฉ
* ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฆฌ์์ค ๋ฑ๋ก, ๋ฆฌ์์ค ๋ณ๊ฒฝ
๐ ์ ์ ๋ฐ์ดํฐ ์กฐํ
* ์ด๋ฏธ์ง, ์ ์ ํ ์คํธ ๋ฌธ์ ๋ฑ์ ์กฐํ๋ GET ์ฌ์ฉ
* ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์์ด ๋จ์ ๋ฆฌ์์ค ๊ฒฝ๋ก๋ง์ผ๋ก ์กฐํ ๊ฐ๋ฅ
๐ ๋์ ๋ฐ์ดํฐ ์กฐํ
* ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก key-value๊ฐ์ ์ด์ฉํด ์ ๋ ฌ ํํฐํด์ ๊ฒฐ๊ณผ๋ฅผ ๋์ ์ผ๋ก ์์ฑ
* ์ฃผ๋ก ๊ฒ์, ๊ฒ์ํ ๋ชฉ๋ก์์ ์ ๋ ฌ ํํฐ(๊ฒ์์ด)
* ์กฐํ ์กฐ๊ฑด์ ์ค์ฌ์ฃผ๋ ํํฐ, ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๋ ์ ๋ ฌ ์กฐ๊ฑด์ ์ฃผ๋ก ์ฌ์ฉ
* ์กฐํ๋ GET ์ฌ์ฉ, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ ์ ๋ฌ
๐ HTML Form์ ํตํ ๋ฐ์ดํฐ ์ ์ก
* ์ด๋ฐ HTML Form์์ submitํ๋ฉด
์น ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ ๊ฐ์ HTTP ๋ฉ์ธ์ง๋ฅผ ์์ฑํด์ body์ ๋ฃ์ด์ค.
* Content-Type: application/x-www-form-urlencoded ์ฌ์ฉ
* ํผ์ ๋ด์ฉ์ ๋ฉ์ธ์ง ๋ฐ๋๋ฅผ ํตํด ์ ์ก(key=value, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์)
* ์ ์ก ๋ฐ์ดํฐ๋ฅผ url encoding ์ฒ๋ฆฌ (์๋ฅผ ๋ค์ด, abc๊น -> abc%EA%B9%80)
* GET ๋ฉ์๋๋ ๊ฐ๋ฅํจ. (๋จ, ์กฐํ์๋ง ์ฌ์ฉ! ๋ฆฌ์์ค ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ ๊ณณ์ ์ฌ์ฉํ๋ฉด ์๋จ.)
* GET์ด๋ฉด ์น ๋ธ๋ผ์ฐ์ ๊ฐ URL๊ฒฝ๋ก๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ฃ์ด์ฃผ๊ณ , POST๋ฉด ๋ฉ์ธ์ง body์ ๋ฃ์ด์ค.
* ํ์ผ ์ ๋ก๋๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋๋ ๋ค๋ฅธ ์ข ๋ฅ์ ์ฌ๋ฌ ํ์ผ๊ณผ ํผ์ ๋ด์ฉ์ ํจ๊ป ์ ์กํ ๋๋ enctype="multipart/form-data"
* ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
๐ HTTP API๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
* HTML Form์ ์ฌ์ฉํ์ง ์๋, ์ง์ ์์ API๋ฅผ ๋๊ธฐ๋ ๋ฐฉ๋ฒ. Content-Type์ json์ผ๋ก.
* ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
* ์๋ฒ to ์๋ฒ, ์ฑ ํด๋ผ์ด์ธํธ, ์น ํด๋ผ์ด์ธํธ(Ajax, React)์ API ํต์
* POST, PUT, PATCH: ๋ฉ์ธ์ง ๋ฐ๋๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ์ก
* GET: ์กฐํํ ๋! ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ดํฐ ์ ์ก
* Content-Type: application/json <-์ฌ์ค์ ํ์ค
'Web > HTTP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTTP ์ํ ์ฝ๋ (0) | 2022.01.11 |
---|---|
HTTP API ์ค๊ณ ์์ (0) | 2022.01.11 |
HTTP ๊ธฐ๋ณธ ๊ฐ๋ (0) | 2022.01.10 |
URI์ ์น ๋ธ๋ผ์ฐ์ ์์ฒญ ํ๋ฆ (0) | 2022.01.10 |
HTTP์ ๊ธฐ์ด, ์ธํฐ๋ท ๋คํธ์ํฌ (0) | 2021.12.13 |