๐ HTTP ๋ฉ์๋ ์ข ๋ฅ & ์์ฒญ ํ๋ฆ ๐ฏ ์ด์ ๋ฆฌ
HTTP Method ์ข ๋ฅ
HTTP ๋ฉ์๋๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์ด๋ฃจ์ด์ง๋ ์์ฒญ(Request)๊ณผ ์๋ต(Response) ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ์์ ์ผ์ปซ๋๋ค. ์ฝ๊ฒ ๋งํ๋ฉด ์๋ฒ์ ์ฃผ์ด์ง ๋ฆฌ์์ค์ ์ํํ๊ธธ ์ํ๋ ํ๋, ์๋ฒ๊ฐ ์ํํด์ผ ํ ๋์์ ์ง์ ํ๋ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด๋ค.
HTTP ๋ฉ์๋์ ์ข ๋ฅ๋ ์ด 9๊ฐ์ง๊ฐ ์๋ค. ์ด ์ค ์ฃผ๋ก ์ฐ์ด๋ ๋ฉ์๋๋ 5๊ฐ์ง๋ก ๋ณด๋ฉด ๋๋ค.
- ์ฃผ์ ๋ฉ์๋
- GET : ๋ฆฌ์์ค ์กฐํ
- POST: ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
- PUT : ๋ฆฌ์์ค๋ฅผ ๋์ฒด(๋ฎ์ด์ฐ๊ธฐ), ํด๋น ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ
- PATCH : ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ (PUT์ด ์ ์ฒด ๋ณ๊ฒฝ, PATCH๋ ์ผ๋ถ ๋ณ๊ฒฝ)
- DELETE : ๋ฆฌ์์ค ์ญ์
- ๊ธฐํ ๋ฉ์๋
- HEAD : GET๊ณผ ๋์ผํ์ง๋ง ๋ฉ์์ง ๋ถ๋ถ(body ๋ถ๋ถ)์ ์ ์ธํ๊ณ , ์ํ ์ค๊ณผ ํค๋๋ง ๋ฐํ
- OPTIONS : ๋์ ๋ฆฌ์์ค์ ๋ํ ํต์ ๊ฐ๋ฅ ์ต์ (๋ฉ์๋)์ ์ค๋ช (์ฃผ๋ก CORS์์ ์ฌ์ฉ)
- CONNECT : ๋์ ์์์ผ๋ก ์๋ณ๋๋ ์๋ฒ์ ๋ํ ํฐ๋์ ์ค์
- TRACE : ๋์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฉ์์ง ๋ฃจํ๋ฐฑ ํ ์คํธ๋ฅผ ์ํ
HTTP ๋ฉ์๋ - GET
- ๋ฆฌ์์ค ์กฐํ ๋ฉ์๋ (Read)
- ๋ง์ผ ํ์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ ์ฟผ๋ฆฌ์คํธ๋ง๋ฅผ ํตํด์ ์ ๋ฌ
- GET /members/100?username=inpa&height=200
- ์ฟผ๋ฆฌ์คํธ๋ง ์ธ์ ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์ง๋ง, ์๋ฒ์์ ๋ฐ๋ก ๊ตฌ์ฑํด์ผ ๋๊ธฐ ๋๋ฌธ์ ์ง์ํ์ง ์๋ ๊ณณ์ด ๋ง์์ ๊ถ์ฅํ์ง ์์
- ์กฐํํ ๋ POST๋ ์ฌ์ฉํ ์ ์์ง๋ง, GET ๋ฉ์๋๋ ์บ์ฑ์ด ๊ฐ๋ฅํ๊ธฐ์ GET์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค.
์ ์ ๋ฐ์ดํฐ ์กฐํ ๊ณผ์
- ์ด๋ฏธ์ง, ์ ์ ํ ์คํธ ๋ฌธ์ GET
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์์ด ๋ฆฌ์์ค ๊ฒฝ๋ก๋ก ๋จ์ํ๊ฒ ์กฐํ ๊ฐ๋ฅ
1. ํด๋ผ์ด์ธํธ์์ /members/100 ์ผ๋ก 100๋ฒ ๋ฉค๋ฒ๋ฅผ ์กฐํํด์ ์ ๋ณด๋ฅผ ๋ฌ๋ผ๊ณ GET ์์ฒญ
2. ์๋ฒ์์๋ ์์ฒญ ๋ฉ์ธ์ง๋ฅผ ๋ถ์ํด ๋ด๋ถ์ ์ ์ ์ ๋ณด๋ฅผ ์กฐํํ ๋ค ๊ฒฐ๊ณผ Response๋ฅผ ๋ง๋ ๋ค.
3. ์๋ฒ์์ ํด๋ผ์ด์ดํธ๋ก ์๋ต์ ํด์ค๋ค. ๊ทธ๋ฌ๋ฉด ํด๋ผ์ด์ธํธ์์ ์ ์์ ์ผ๋ก ๋ฐ์ผ๋ฉด 200 OK status๋ฅผ ๊ฐ์ง๋ฉฐ, ํ์์ ๋ณด๋ฅผ ์ป๊ฒ ๋๋ค.
- ์์์์๋ JSON ํํ์ ๋ฐ์ดํฐ์ด์ง๋ง ์ค์ ๋ก๋ HTML์ผ์๋ ์๊ณ ์ด๋ฏธ์ง ๊ฐ์ ๋ฉํฐ๋ฏธ๋์ด ํ์ผ์ผ ์๋ ์๊ณ ๋ค์ํ๋ค.
๋์ ๋ฐ์ดํฐ ์กฐํ ๊ณผ์
- ์ฃผ๋ก ๊ฒ์, ๊ฒ์ํ ๋ชฉ๋ก์์ ๊ฒ์์ด๋ก ์ด์ฉ
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ key1=value1&key2=value2 ๊ตฌ์กฐ๋ก ๋์ด ์์
1. ์์ฒญ URL ๋ค์ ?q=hello&hl=ko ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ์์ธํ ์กฐํ ๋ฐ์ดํฐ๋ฅผ ์ป๋๋ค
HTML Form ๋ฐ์ดํฐ ์กฐํ ๊ณผ์
- HTML Form ํ๊ทธ ๋ฌธ์๋ก ์ฌ์ฉ์์ UI๋ก ์ํธ์์ฉํ์ฌ ์๋ฒ์ ํต์
- HTML Form ์ ์ก์ GET, POST๋ง ์ง์
1. ์น๋ฌธ์์์ ํผ ์ ๋ ฅ์นธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณ ์ ์ก ๋ฒํผ์ ๋๋ฅธ๋ค.
2. ์ง์ ํ GET ๋ฉ์๋ ๋์์ ๋ฐ๋ผ input ํ๊ทธ์์ ๋ค์ด๊ฐ ๊ฐ๋ค์ด ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ์๋ฒ๋ก ์ ์ก๋๋ค
HTTP ๋ฉ์๋ - POST
- ์ ๋ฌํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ/์์ฑ ์์ฒญ ๋ฉ์๋ (Create)
- ๋ฉ์์ง ๋ฐ๋(body)๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ ์ ๋ฌํ๋ฉด ์๋ฒ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ ๋ฐ์ดํธ
- ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ก ์ฃผ๋ก ์ ๊ท ๋ฆฌ์์ค ๋ฑ๋ก, ํ๋ก์ธ์ค ์ฒ๋ฆฌ์ ์ฌ์ฉ
- ๋ง์ผ ๋ฐ์ดํฐ๋ฅผ GET ํ๋๋ฐ ์์ด, JSON์ผ๋ก ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ผ ํ๋ ์ ๋งคํ ๊ฒฝ์ฐ POST๋ฅผ ์ฌ์ฉ
JSON ๋ฐ์ดํฐ ์ ์ก ๊ณผ์
1. ํด๋ผ์ด์ธํธ๋ body์ ๋ฑ๋กํ ํ์ ์ ๋ณด๋ฅผ JSON ํํ๋ก ๋ง๋ค์ด ๋ด๊ณ ์๋ฒ๋ก ์ ์กํ๋ค.
2. ์๋ฒ์์๋ ๋ฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ถ์ํด ๋ก์ง ๋๋ก ์ฒ๋ฆฌ ํ๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋กํ๊ณ ์ ๊ท ์์ด๋๋ฅผ ์์ฑํ๋ค.
3. ์ ๊ทํ์์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋์ ๋ด์์ ํด๋ผ์ด์ธํธ๋ก ์๋ตํ๋ค.
- ์ ๊ท ์์ ์์ฑ์ 200์ด๋ 201๋ก ์๋ต์ ๋ณด๋ธ๋ค.
- Location์ ์์์ด ์ ๊ท๋ก ์์ฑ๋ URI ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค.
HTML Form ๋ฐ์ดํฐ ์ ์ก ๊ณผ์
- HTML Form ํ๊ทธ ๋ฌธ์๋ก ์ฌ์ฉ์์ UI๋ก ์ํธ์์ฉํ์ฌ ์๋ฒ์ ํต์
- ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ด์ฉ
- HTML Form ์ ์ก์ GET, POST๋ง ์ง์
1. ์น๋ฌธ์์์ ํผ ์ ๋ ฅ์นธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณ ์ ์ก ๋ฒํผ์ ๋๋ฅธ๋ค.
2. ์ง์ ํ POST ๋ฉ์๋ ๋์์ ๋ฐ๋ผ input ํ๊ทธ์์ ๋ค์ด๊ฐ ๊ฐ๋ค์ด ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก ์๋ฒ๋ก ์ ์ก๋๋ค
[ Content-Type ํค๋ ์ข ๋ฅ ]
Content-Type: application/x-www-form-urlencoded
- Form์ ๋ด์ฉ์ HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด์ ์ ์ก(key=value, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์)
- ์ ์ก ๋ฐ์ดํฐ๋ฅผ url encoding ์ฒ๋ฆฌ
- ์) abc๊น → abc%EA%B9%80
Content-Type: multipart/form-data
- ํ์ผ ์ ๋ก๋ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์ก ์ ์ฌ์ฉ
- ๋ค๋ฅธ ์ข ๋ฅ์ ์ฌ๋ฌ ํ์ผ๊ณผ Form์ ๋ด์ฉ ํจ๊ป ์ ์ก ๊ฐ๋ฅ. ๊ทธ๋์ ์ด๋ฆ์ด multipart ์ด๋ค.
Content-Type: application/json
- TEXT, XML, JSON ๋ฐ์ดํฐ ์ ์ก ์ ์ฌ์ฉ
ํ์ผ ๋ฐ์ดํฐ ์ ์ก ๊ณผ์
- enctype์
multipart/form-data๋ก ์์ฑํด ํด๋น ํผ์ ํ์ผ์ด ์๋ค๋ ๊ฒ์ ํ์ํ๋ค. - ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์ก์ ์ฌ์ฉํ๋ค.
- multipart/form-data ํ์์ด๋ผ๋ฉด HTTP ๋ฉ์ธ์ง์ ์์์ ๊ตฌ๋ถ์(------XXX) ๊ฐ Form ๋ฐ์ดํฐ๊ฐ ๊ตฌ๋ถ์ ์ง์ด์ค๋ค.
- ์ฌ๋ฌ ๊ฐ์ Content-Type์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ค.
HTTP ๋ฉ์๋ - PUT
- ๋ฆฌ์์ค๋ฅผ ๋์ฒด(์์ )ํ๋ ๋ฉ์๋ (Update)
- ๋ง์ผ ์์ฒญ ๋ฉ์ธ์ง์ ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ๋ฎ์ด์ฐ๊ณ , ์์ผ๋ฉด ์๋ก ์์ฑํ๋ค.
- /members/100 ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ฉด ๊ธฐ์กด์ ๊ฒ์ ์์ ๋์ฒด ํ๋ค.
- /members/100 ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ๋์ฒด ํ ๊ฒ ์์ผ๋๊น ์๋ก ์์ฑํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋์ฒดํด์ผ ํ๋, ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ ๊ตฌ์ฒด์ ์ธ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ง์ ํด ๋ณด๋ด์ฃผ์ด์ผ ํ๋ค.
- POST /members : ๋ฉค๋ฒ ์๋ก ์ถ๊ฐ
- PUT /members/100 : 100๋ฒ์งธ ๋ฉค๋ฒ ์์
PUT ์์ฒญ์ ๋ฆฌ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ
1. 100๋ฒ ์ ์ ์ ๋ฆฌ์์ค๋ฅผ ๊ต์ฒดํ๊ฒ ๋ค๋ ์์ฒญ์ ๋ณด๋ธ๋ค.
2. ๊ธฐ์กด์ ๋ฐ์ดํฐ๊ฐ ์์๋ค๋ฉด ์์ ํ ๋์ฒด๋๋ค.
PUT ์์ฒญ์ ๋ฆฌ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ
1. 100๋ฒ ์ ์ ์ ๋ฆฌ์์ค๋ฅผ ๊ต์ฒดํ๊ฒ ๋ค๋ ์์ฒญ์ ๋ณด๋ธ๋ค.
2. ๊ธฐ์กด์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด POST ์ ๊ฐ์ด ์ ๊ท๋ก ์์ฑํ๋ค.
PUT ์์ฒญ์ ์ผ๋ถ ๋ฆฌ์์ค๋ง ๋ณ๊ฒฝํ๊ธธ ์ํ ๊ฒฝ์ฐ
1. age๋ง 50์ผ๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ํด๋น ๋ฐ์ดํฐ๋ฅผ PUT์ผ๋ก ์ ๋ฌํ๋ค.
2. ํ์ง๋ง ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์์ ํ ๋์ฒด๋์ด ์ด๋ฆ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๋ค. (์ด๋๋ PATCH ๋ฉ์๋๋ฅผ ์ด์ฉํด์ผ ํ๋ค)
HTTP ๋ฉ์๋ - PATCH
- ๋ฆฌ์์ค ์ผ๋ถ ๋ถ๋ถ์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋ (Update)
- ๋ง์ผ PATCH๋ฅผ ์ง์ํ์ง ์๋ ์๋ฒ์์๋ ๋์ ์ POST๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
1. age๋ง 50์ผ๋ก ๋ณ๊ฒฝํ๋ ค๊ณ ํด๋น ๋ฐ์ดํฐ๋ฅผ PATCH๋ก ์ ๋ฌํ๋ค.
2. PUT๊ณผ๋ ๋ค๋ฅด๊ฒ ํ์ ์ ๋ณด์์ age๋ง ๋ณ๊ฒฝ๋๋ค.
HTTP ๋ฉ์๋ - DELETE
- ๋ฆฌ์์ค ์ ๊ฑฐํ๋ ๋ฉ์๋ (Delete)
- ์ํ์ฝ๋๋ ๋๋ถ๋ถ 200์ ์ฌ์ฉํ๊ณ ์ํฉ์ ๋ฐ๋ผ 204๋ฅผ ์ฌ์ฉํ๋ค.
1. 100๋ฒ์งธ ๋ฉค๋ฒ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด DELETE๋ก ์ ๋ฌํ๋ค.
2. ์๋ฒ์์ ์์ฒญ์ ๋ฐ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํด๋น ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐ ํ๋ค.
HTTP ๋ฉ์๋ - HEAD
- GET๊ณผ ๋์ผํ์ง๋ง ์๋ฒ์์ Body๋ฅผ Return ํ์ง ์์
- ์๋ต์ ์ํ ์ฝ๋๋ง ํ์ธํ ๋์ ๊ฐ์ด Resource๋ฅผ ๋ฐ์ง ์๊ณ ์ค์ง ์ฐพ๊ธฐ๋ง ์ํ ๋ ์ฌ์ฉ (์ผ์ข ์ ๊ฒ์ฌ ์ฉ๋)
- ์๋ฒ์ ์๋ต ํค๋๋ฅผ ๋ด์ผ๋ก์จ Resource๊ฐ ์์ ๋์๋์ง ํ์ธ ๊ฐ๋ฅ
HTTP ๋ฉ์๋ - TRACE
- ์ด ๋ฉ์๋๋ ์ผ์ข ์ ๊ฒ์ฌ์ฉ
- ์๋ฒ์ ๋๋ฌ ํ์ ๋์ ์ต์ข ํจํท์ ์์ฒญ ํจํท ๋ด์ฉ์ ์๋ต ๋ฐ์ ์ ์๋ค.
- ์์ฒญ์ ์ต์ข ์์ ์๋ ๋ฐ๋์ ์ก์ ์์๊ฒ 200(OK) ์๋ต์ ๋ด์ฉ(Body)๋ก ์์ ํ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์กํด์ผ ํ๋ค.
- ์ต์ด Client์ ์์ฒญ์๋ Body๊ฐ ํฌํจ๋ ์ ์๋ค.
ํด๋ผ์ด์ธํธ์ ์์ฒญ ํจํท์ด ๋ฐฉํ๋ฒฝ, Proxy ์๋ฒ, Gateway ๋ฑ์ ๊ฑฐ์น๋ฉด์ ํจํท์ ๋ณ์กฐ๊ฐ ์ผ์ด๋ ์ ์๋๋ฐ, ๊ทธ๋์ TRACE ๋ฉ์๋๋ฅผ ํตํด ์์ฒญํ๋ ํจํท ๋ด์ฉ๊ณผ ์๋ต ๋ฐ์ ์์ฒญ ํจํท ๋ด์ฉ์ ๋น๊ตํ์ฌ ๋ณ์กฐ ์ ๋ฌด๋ฅผ ํ์ธ ํ ์ ์๋ค
HTTP ๋ฉ์๋ - OPTION
- ์๋น ์์ฒญ(Preflight)์ ์ฌ์ฉ๋๋ HTTP ๋ฉ์๋
- ์๋น ์์ฒญ์ด๋ ๋ณธ ์์ฒญ์ ํ๊ธฐ ์ ์ ์์ ํ์ง ๋ฏธ๋ฆฌ ๊ฒ์ฌํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค
- ์๋ฒ์ ์ง์ ๊ฐ๋ฅํ HTTP ๋ฉ์๋์ ์ถ์ฒ๋ฅผ ์๋ต ๋ฐ์ CORS ์ ์ฑ ์ ๊ฒ์ฌํ๊ธฐ ์ํ ์์ฒญ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ค์ HTTP ๋ฉ์๋ ์์ฒญํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ fetch ๋ฉ์๋๋ก HTTP ๋ฉ์๋ ์์ฒญ์ ๋ณด๋ด๋ณด๋ ์ค์ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ์ตํ๋ณด์.
fetch("https://jsonplaceholder.typicode.com/posts/1", {
method: "DELETE",
})
.then((response) => response.json())
.then((data) => console.log(data))
๐ Fetch API ์ผ๋ก AJAX ์์ฒญํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ AJAX ์์ฒญ ๋ฐฉ์ ์ ํต์ ์ผ๋ก XMLHttpRequest() ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ฌธ๋ฒ์ด ๋ํดํ๊ณ ๊ฐ๋ ์ฑ๋ ์ข์ง ์๋ค. ๋ฐ๋ผ์ ์ด๋ฒ์๊ฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ AJAX ํต์ ์ ์ต์ ๊ธฐ์
inpa.tistory.com
# ์ฐธ๊ณ ์๋ฃ
๋ชจ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ HTTP ์น ๊ธฐ๋ณธ ์ง์ - ๊น์ํ
https://medium.com/@lyhlg0201/http-method-d561b77df7