HTTP API
API URI ์ค๊ณ
URI(Uniform Resource Identifier)
ํ์ ๋ชฉ๋ก์ ์กฐํ, ํ์ ์กฐํ, ํ์ ๋ฑ๋ก, ํ์ ์์ , ํ์ ์ญ์ ๋ฅผ ํ๋ URI๋ฅผ ์ค๊ณํ๋ค๊ณ ํ๋ฉด
๊ฐ๊ฐ read-member-list, read-member-by-id ... ์ด๋ฐ ์์ผ๋ก ์ค๊ณํ๋ ๊ฒ์ ์ข์ URI์ค๊ณ๊ฐ ์๋๋ค.
URI์ค๊ณ์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ ์ ์์ด์ผ ํ๋ค.
๋ฆฌ์์ค์ ์๋ฏธ๋ ๋ฌด์์ผ๊น. ํ์์ ๋ฑ๋กํ๊ณ ์์ ํ๊ณ ์กฐํํ๋ ๊ฒ์ ๋ฆฌ์์ค๊ฐ ์๋๋ค.
ํ์์ด๋ผ๋ ๊ฐ๋ ์์ฒด๊ฐ ๋ฐ๋ก ๋ฆฌ์์ค์ด๋ค. ( ์: ๋ฏธ๋ค๋์ ์บ๋ผ → ๋ฏธ๋ค๋์ด ๋ฆฌ์์ค )
๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ์๋ณํ๋๊ฒ ์ข์๊น?
ํ์์ ๋ฑ๋กํ๊ณ ์์ ํ๊ณ ์กฐํํ๋ ๊ฒ์ ๋ชจ๋ ๋ฐฐ์ ํด์ผ ํ๋ค.
ํ์์ด๋ผ๋ ๋ฆฌ์์ค๋ง ์๋ณํ๋ฉด ๋๋ค. → ํ์ ๋ฆฌ์์ค๋ฅผ URI์ ๋งคํ
๊ทธ๋ ๊ฒ ๋ฆฌ์์ค๋ฅผ ์๋ณํด์ URI๋ฅผ ์ค๊ณํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ ๋ชฉ๋ก ์กฐํ /members
ํ์ ์กฐํ /members/{id}
ํ์ ๋ฑ๋ก /members/{id}
ํ์ ์์ /members/{id}
ํ์ ์ญ์ /members/{id}
์ฐธ๊ณ : ๊ณ์ธต ๊ตฌ์กฐ์ ์์๋ฅผ ์ปฌ๋ ์ ์ผ๋ก ๋ณด๊ณ ๋ณต์ ๋จ์ด ์ฌ์ฉ ๊ถ์ฅ (member → members)
ํ์ง๋ง ์ด๋ ๊ฒ ๋ฆฌ์์ค๋ก๋ง ์๋ณ์ ํ๋ฉด ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ๋ถํด์ผ ํ ๊น.
๋ฆฌ์์ค์ ํ์๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค. ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ ๊ฒ์ด๋ค.
URI๋ ๋ฆฌ์์ค๋ง ์๋ณ์ ํ๊ณ , ๋ฆฌ์์ค์ ํด๋น ๋ฆฌ์์ค๋ฅผ ๋์์ผ๋ก ํ๋ ํ์๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค.
* ๋ฆฌ์์ค: ํ์ *ํ์: ์กฐํ, ๋ฑ๋ก, ์ญ์ , ๋ณ๊ฒฝ
๋ฆฌ์์ค๋ ๋ช ์ฌ์ด๊ณ ํ์๋ ๋์ฌ์ด๋ค. ํ์(๋ฉ์๋)๋ฅผ ๊ตฌ๋ถํ๋ ๋ฐฉ๋ฒ์ HTTP ๋ฉ์๋๊ฐ ๋์ ํด์ค๋ค.
HTTP ๋ฉ์๋
HTTP ์ฃผ์ ๋ฉ์๋
· GET: ๋ฆฌ์์ค ์กฐํ
· POST: ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
· PUT: ๋ฆฌ์์ค๋ฅผ ๋์ฒด, ํด๋น ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ
· PATCH: ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
· DELETE: ๋ฆฌ์์ค ์ญ์
๊ธฐํ ๋ฉ์๋
· HEAD: GET๊ณผ ๋์ผํ์ง๋ง ๋ฉ์์ง ๋ถ๋ถ์ ์ ์ธํ๊ณ , ์ํ ์ค๊ณผ ํค๋๋ง ๋ฐํ
· OPTIONS: ๋์ ๋ฆฌ์์ค์ ๋ํ ํต์ ๊ฐ๋ฅ ์ต์ (๋ฉ์๋)์ ์ค๋ช (์ฃผ๋ก CORS์์ ์ฌ์ฉ)
· CONNECT: ๋์ ์์์ผ๋ก ์๋ณ๋๋ ์๋ฒ์ ๋ํ ํฐ๋์ ์ค์
· TRACE: ๋์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฉ์์ง ๋ฃจํ๋ฐฑ ํ ์คํธ๋ฅผ ์ํ
GET
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
GET์ ๋ฆฌ์์ค๋ฅผ ์กฐํํ๋ ๋ฉ์๋์ด๋ค.
์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ query(์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, ์ฟผ๋ฆฌ ์คํธ๋ง)๋ฅผ ํตํด์ ์ ๋ฌํด์ผ ํ๋ค.
๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์ง๋ง, ์ง์ํ์ง ์๋ ๊ณณ์ด ๋ง์์ ๊ถ์ฅํ์ง๋ ์๋๋ค.
GET์ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ฉด ์๋ฒ๋ ์์ฒญํ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ณ ํด๋นํ๋ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๊ฒ ๋๋ค.
POST
POST /members HTTP/1.1
Content-Type: application/json
{
"username": "hello",
"age": 20
}
POST๋ ์๋ฒ์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ ์ฒ๋ฆฌํด๋ฌ๋ผ๋ ๋ฉ์๋์ด๋ค.
๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์๋ฒ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค. ( ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค. )
์ฃผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ก ์ ๊ท ๋ฆฌ์์ค๋ฅผ ๋ฑ๋กํ๊ฑฐ๋ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด POST๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋ค๋ ๋ป์ผ๊น.
์คํ: POST ๋ฉ์๋๋ ๋์ ๋ฆฌ์์ค๊ฐ ๋ฆฌ์์ค์ ๊ณ ์ ํ ์๋ฏธ ์ฒด๊ณ์ ๋ฐ๋ผ ์์ฒญ์ ํฌํจ๋ ํํ์ ์ฒ๋ฆฌํ๋๋ก ์์ฒญํฉ๋๋ค.
์๋ฅผ ๋ค์ด POST๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉ๋๋ค.
· HTML ์์์ ์ ๋ ฅ๋ ํ๋์ ๊ฐ์ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๋ก์ธ์ค์ ์ ๊ณต
→ ์) HTML FORM์ ์ ๋ ฅํ ์ ๋ณด๋ก ํ์ ๊ฐ์ , ์ฃผ๋ฌธ ๋ฑ์์ ์ฌ์ฉ
· ๊ฒ์ํ, ๋ด์ค ๊ทธ๋ฃน, ๋ฉ์ผ๋ง ๋ฆฌ์คํธ, ๋ธ๋ก๊ทธ ๋๋ ์ ์ฌํ ๊ธฐ์ฌ ๊ทธ๋ฃน์ ๋ฉ์์ง ๊ฒ์
→ ์) ๊ฒ์ํ ๊ธ์ฐ๊ธฐ, ๋๊ธ ๋ฌ๊ธฐ
· ์๋ฒ๊ฐ ์์ง ์๋ณํ์ง ์์ ์ ๋ฆฌ์์ค ์์ฑ
→ ์) ์ ๊ท ์ฃผ๋ฌธ ์์ฑ
· ๊ธฐ์กด ์์์ ๋ฐ์ดํฐ ์ถ๊ฐ
→ ์) ํ ๋ฌธ์ ๋์ ๋ด์ฉ ์ถ๊ฐํ๊ธฐ
· ์ ๋ฆฌ: ์ด ๋ฆฌ์์ค URI์ POST ์์ฒญ์ด ์ค๋ฉด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๋ฆฌ์์ค๋ง๋ค ๋ฐ๋ก ์ ํด์ผ ํ๋ค.
โท ์ ํด์ง ๊ฒ์ด ์๋ค.
POST ์ ๋ฆฌ
1. ์ ๋ฆฌ์์ค ์์ฑ(๋ฑ๋ก)
· ์๋ฒ๊ฐ ์์ง ์๋ณํ์ง ์์ ์ ๋ฆฌ์์ค ์์ฑ
2. ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
· ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋, ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋์ด์ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
์) ์ฃผ๋ฌธ์์ ๊ฒฐ์ ์๋ฃ โท ๋ฐฐ๋ฌ์์ โท ๋ฐฐ๋ฌ์๋ฃ ์ฒ๋ผ ๋จ์ํ ๊ฐ ๋ณ๊ฒฝ์ ๋์ด ํ๋ก์ธ์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ
· POST์ ๊ฒฐ๊ณผ๋ก ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋์ง ์์ ์๋ ์์
์) POST /orders/{orderId}/start-delivery (์ปจํธ๋กค URI)
3. ๋ค๋ฅธ ๋ฉ์๋๋ก ์ฒ๋ฆฌํ๊ธฐ ์ ๋งคํ ๊ฒฝ์ฐ
์) JSON์ผ๋ก ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ผ ํ๋๋ฐ, GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ
· ์ ๋งคํ๋ฉด POST
์ปจํธ๋กค URI๋ ๋ฆฌ์์ค๋ง์ผ๋ก ๋ชจ๋ ์๋ณํ ์ ์๋ ์ํฉ์์ ์ฌ์ฉํ๋ URI์ด๋ค.
๋ฆฌ์์ค๋ง์ผ๋ก ์ต๋ํ ์ค๊ณ๋ฅผ ํ์ง๋ง ์ด์ฉ ์ ์๋ ๋ถ๋ถ์ ํํด์ ์ปจํธ๋กค URI๋ก ์ค๊ณ๋ฅผ ํด์ผ ํ๋ค.
PUT
PUT /members/100 HTTP/1.1
Content-Type: application/json
{
"username": "hello",
"age": 20
}
PUT์ ๋ฆฌ์์ค๋ฅผ ๋์ฒดํ๋ ๋ฉ์๋์ด๋ค.
๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ๋์ฒด๋๊ณ , ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑํ๋ค. ์ฝ๊ฒ ์ด์ผ๊ธฐํด์ ๋ฎ์ด๋ฒ๋ฆฐ๋ค.
POST์์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ POST๋ /members๋ก members์ ์ถ๊ฐ๋ฅผ ํด์ ๋ช ๋ฒ์ ์ถ๊ฐ๋๋์ง๋ ๋ชจ๋ฅธ๋ค.
ํ์ง๋ง PUT์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ค. ( ์: /members/100 )
ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค ์์น๋ฅผ ์๊ณ URI๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ์ ์ ๋ฆฌ์์ค๋ฅผ ์์ ํ ๋์ฒดํ๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ๋ค์ด ๊ธฐ์กด์ /members/100 ์๋ username: young, age: 20์ด๋ผ๋ ๋ฆฌ์์ค๊ฐ ์์ ๋,
age๋ง 50์ผ๋ก ๋ณ๊ฒฝํ๋ ค๊ณ PUT์ ์ฌ์ฉํด age:50์ด๋ผ๋ ์ ๋ณด๋ง ๋์ฒดํ ๊ฒฝ์ฐ
๊ธฐ์กด์ ์๋ usernameํ๋๋ ์์ ํ ์ฌ๋ผ์ง๊ณ , age: 50์ด๋ผ๋ ๋ฆฌ์์ค๋ง ๋จ๊ฒ ๋๋ค.
PUT์ ์์ ํ๋ ๋ฉ์๋๊ฐ ์๋, ๊ธฐ์กด์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ง์ฐ๊ณ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋ ์ฌ์ฉ๋๋ค.
์ด๋ ๊ฒ ๋ถ๋ถ์ ์ธ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ PATCH๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
PATCH
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
"age":50
}
PATCH๋ ๋ฆฌ์์ค์ ๋ถ๋ถ๋ง ๋ณ๊ฒฝ์ ํ๋ ๋ฉ์๋์ด๋ค.
PATCH๋ members/100์ username๊ณผ age๋ฆฌ์์ค๊ฐ ์์ ๋ age์ ๋ฆฌ์์ค๋ง ๋ณ๊ฒฝํ ๋ ์ฌ์ฉ๋๋ค.
๊ฐํน๊ฐ๋ค๊ฐ PATCH๋ฅผ ์ง์ํ์ง ์๋ ์๋ฒ๊ฐ ์๋ค. ๊ทธ๋ด ๋๋ POST๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
DELETE
DELETE /members/100 HTTP/1.1
Host: localhost:8080
DELETE๋ ์ด๋ฆ ๊ทธ๋๋ก ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ ๋ ์ฌ์ฉ๋๋ค.
HTTP ๋ฉ์๋์ ์์ฑ
์์ - Safe
์์ ์ ํธ์ถํด๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
GET์ ํธ์ถํด๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ ์์ ํ๋ค๊ณ ๋งํ ์ ์๋ค.
ํ์ง๋ง POST, PUT, DELETE๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ญ์ ํ๋ ๋ฉ์๋์ด๋ ์์ ํ์ง ์๋ค.
GET์ด ๊ณ์ ํธ์ถํด์, ๋ก๊ทธ ๊ฐ์ ๊ฒ ์์ฌ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ด ์์ ์ ์์ง๋ง,
์์ ์ ํด๋น ๋ฆฌ์์ค๋ง ๊ณ ๋ คํ๋ค. ๊ทธ๋ฐ ๋ถ๋ถ๊น์ง ๊ณ ๋ คํ์ง ์๋๋ค.
ํด๋น ๋ฆฌ์์ค๊ฐ ๋ณํ๋์ง ๋ณํ์ง ์๋์ง ๊ทธ๋ฐ ๋ถ๋ถ๋ง ๊ณ ๋ คํ๋ค.
๋ฉฑ๋ฑ - Idempotent
๋ฉฑ๋ฑ์ ๊ฐ๋จํ๊ฒ ํ ๋ฒ ํธ์ถํ๋ ๋ ๋ฒ ํธ์ถํ๋ 100๋ฒ ํธ์ถํ๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ฐ์์ผ ํ๋ค. โท f(f(x)) = f(x)
๋ฉฑ๋ฑ ๋ฉ์๋
· GET: ํ ๋ฒ ์กฐํํ๋ , ๋ ๋ฒ ์กฐํํ๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์กฐํ๋๋ค.
· PUT: ๊ฒฐ๊ณผ๋ฅผ ๋์ฒดํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ํด๋ ์ต์ข ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
· DELETE: ๊ฒฐ๊ณผ๋ฅผ ์ญ์ ํ๋ค. ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ํด๋ ์ญ์ ๋ ๊ฒฐ๊ณผ๋ ๋๊ฐ๋ค.
· POST: ๋ฉฑ๋ฑ์ด ์๋๋ค. ๋ ๋ฒ ํธ์ถํ๋ฉด ๊ฐ์ ๊ฒฐ์ ๊ฐ ์ค๋ณตํด์ ๋ฐ์ํ ์ ์๋ค.
๋ฉฑ๋ฑ์ ํ์ฉํ ์์๋ก๋ ์๋ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ์ ์๊ฐํ๋ฉด ๋๋ค.
์๋ฒ๊ฐ TIMEOUT ๋ฑ์ผ๋ก ์ ์ ์๋ต์ ๋ชป์ฃผ์์ ๋,
ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์์ฒญ์ ๋ค์ ํด๋ ๋๋๊ฐ? ์ ๋ํ ํ๋จ ๊ทผ๊ฑฐ๊ฐ ๋๋ค.
๋ง์ฝ ํด๋ผ์ด์ธํธ์์ DELETE๋ฅผ ์๋ฒ์ ์ ์กํ๋๋ฐ ์๋ฒ์์ ์๋ต์ด ์์ ๋,
ํด๋ผ์ด์ธํธ์์ ๋ค์ DELETE๋ฅผ ์ฌ์๋ํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๋ค.
DELETE๋ ๋ฉฑ๋ฑํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
์บ์ ๊ฐ๋ฅ - Cacheable
์น ๋ธ๋ผ์ฐ์ ์ ํฐ ์ด๋ฏธ์ง๋ฅผ ์์ฒญ์ ํ๋ฉด ๋ค์์ ๋ ํฐ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ํ์๊ฐ ์๋ค.
๊ทธ๋์ ์น ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅ์ ํ๊ณ ์๋ค. ์ด๊ฒ์ ์ด์ ์บ์๋ผ๊ณ ํ ์ ์๋ค.
GET, HEAD, POST, PATCH๋ ์บ์๊ฐ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์ค์ ๋ก๋ GET, HEAD ์ ๋๋ง ์บ์๋ก ์ฌ์ฉํ๊ณ ์๋ค.
๊ทธ ์ด์ ๋ก๋ POST์ PATCH๋ ๋ณธ๋ฌธ ๋ด์ฉ๊น์ง ์บ์ ํค๋ก ๊ณ ๋ คํด์ผ ํ๋๋ฐ, ๊ตฌํํ๊ธฐ ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
HTTP ๋ฉ์๋ ํ์ฉ
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ ์ ์ก
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ ๋ฌ ๋ฐฉ์์๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
· ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
→ GET
→ ์ฃผ๋ก ์ ๋ ฌ ํํฐ(๊ฒ์์ด)
· ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
→ POST, PUT, PATCH
→ ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฆฌ์์ค ๋ฑ๋ก, ๋ฆฌ์์ค ๋ณ๊ฒฝ
ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ํฉ์๋ ๋ํ์ ์ผ๋ก 4๊ฐ์ง ์ํฉ์ด ์๋ค.
· ์ ์ ๋ฐ์ดํฐ ์กฐํ
→ ์ด๋ฏธ์ง, ์ ์ ํ ์คํธ ๋ฌธ์
· ๋์ ๋ฐ์ดํฐ ์กฐํ
→ ์ฃผ๋ก ๊ฒ์, ๊ฒ์ํ ๋ชฉ๋ก์์ ์ ๋ ฌ ํํฐ(๊ฒ์์ด)
· HTML Form์ ํตํ ๋ฐ์ดํฐ ์ ์ก
→ ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
· HTTP API๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ์ก
→ ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
→ ์๋ฒ to ์๋ฒ, ์ฑ ํด๋ผ์ด์ธํธ, ์น ํด๋ผ์ด์ธํธ(Ajax)
์ ๋ฆฌ
์ ์ ๋ฐ์ดํฐ ์กฐํ
· ์ด๋ฏธ์ง, ์ ์ ํ ์คํธ ๋ฌธ์
· ์กฐํ๋ GET ์ฌ์ฉ
· ์ ์ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์์ด ๋ฆฌ์์ค ๊ฒฝ๋ก๋ก ๋จ์ํ๊ฒ ์กฐํ ๊ฐ๋ฅ
๋์ ๋ฐ์ดํฐ ์กฐํ
· ์ฃผ๋ก ๊ฒ์, ๊ฒ์ํ ๋ชฉ๋ก์์ ์ ๋ ฌ ํํฐ(๊ฒ์์ด)
· ์กฐํ ์กฐ๊ฑด์ ์ค์ฌ์ฃผ๋ ํํฐ, ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๋ ์ ๋ ฌ ์กฐ๊ฑด์ ์ฃผ๋ก ์ฌ์ฉ
· ์กฐํ๋ GET ์ฌ์ฉ
· GET์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
HTML Form ๋ฐ์ดํฐ ์ ์ก
· HTML Form submit์ POST ์ ์ก
์) ํ์ ๊ฐ์ , ์ํ ์ฃผ๋ฌธ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ
· 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
· ํ์ผ ์ ๋ก๋ ๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ ์ก ์ ์ฌ์ฉ
· ๋ค๋ฅธ ์ข ๋ฅ์ ์ฌ๋ฌ ํ์ผ๊ณผ ํผ์ ๋ด์ฉ ํจ๊ป ์ ์ก ๊ฐ๋ฅ(๊ทธ๋์ ์ด๋ฆ์ด multipart)
· ์ฐธ๊ณ : HTML Form ์ ์ก์ GET, POST๋ง ์ง์
HTTP API ๋ฐ์ดํฐ ์ ์ก
· ์๋ฒ to ์๋ฒ
· ๋ฐฑ์๋ ์์คํ ํต์
· ์ฑ ํด๋ผ์ด์ธํธ
· ์์ดํฐ, ์๋๋ก์ด๋
· ์น ํด๋ผ์ด์ธํธ
· HTML์์ Form ์ ์ก ๋์ ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํตํ ํต์ ์ ์ฌ์ฉ(AJAX)
์) React, VueJs ๊ฐ์ ์น ํด๋ผ์ด์ธํธ์ API ํต์
· POST, PUT, PATCH: ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ์ก
· GET: ์กฐํ, ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ดํฐ ์ ๋ฌ
· Content-Type: application/json์ ์ฃผ๋ก ์ฌ์ฉ (์ฌ์ค์ ํ์ค)
· TEXT, XML, JSON ๋ฑ
HTTP API ์ค๊ณ ์์
HTTP API ์ค๊ณ ์์๋ก๋ ๋ํ์ ์ผ๋ก 3๊ฐ์ง ์์๊ฐ ์๋ค.
· HTTP API - ์ปฌ๋ ์
· POST ๊ธฐ๋ฐ ๋ฑ๋ก
์) ํ์ ๊ด๋ฆฌ API ์ ๊ณต
· HTTP API - ์คํ ์ด
· PUT ๊ธฐ๋ฐ ๋ฑ๋ก
์) ์ ์ ์ปจํ ์ธ ๊ด๋ฆฌ, ์๊ฒฉ ํ์ผ ๊ด๋ฆฌ
· HTML FORM ์ฌ์ฉ
· ์น ํ์ด์ง ํ์ ๊ด๋ฆฌ
· GET, POST๋ง ์ง์
ํ์ ๊ด๋ฆฌ ์์คํ
API ์ค๊ณ - POST ๊ธฐ๋ฐ ๋ฑ๋ก
· ํ์ ๋ชฉ๋ก /members → GET
· ํ์ ๋ฑ๋ก /members → POST
· ํ์ ์กฐํ /members/{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
์ด๊ฒ์ด POST ๊ธฐ๋ฐ ๋ฑ๋ก๊ณผ PUT ๊ธฐ๋ฐ ๋ฑ๋ก์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ๋ฆฌ์์ค์ URI๋ฅผ ์ง์ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ํ์์ ์คํ ์ด(Store)์ด๋ผ๊ณ ํ๋ค.
์คํ ์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ์ ์ฅ์์ด๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ URI๋ฅผ ์๊ณ ๊ด๋ฆฌ๋ฅผ ํ๋ค. ์ฌ๊ธฐ์ ์คํ ์ด๋ /files๊ฐ ๋๋ค.
์ค๋ฌด์์๋ ์ปฌ๋ ์ ๊ณผ ์คํ ์ด ๋ ์ค์์ ์ปฌ๋ ์ ์ ๋๋ถ๋ถ ์ฌ์ฉํ๋ค.
PUT์ ๊ฑฐ์ ๋๋ถ๋ถ ์ ์ฌ์ฉํ์ง ์๋๋ค.
HTML FORM ์ฌ์ฉ
· HTML FORM์ GET, POST๋ง ์ง์
· AJAX ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํด์ ํด๊ฒฐ ๊ฐ๋ฅ → ํ์ API ์ฐธ๊ณ
· ์ฌ๊ธฐ์๋ ์์ HTML, HTML FORM ์ด์ผ๊ธฐ
· GET, POST๋ง ์ง์ํ๋ฏ๋ก ์ ์ฝ์ด ์์
· ํ์ ๋ชฉ๋ก /members → GET
· ํ์ ๋ฑ๋ก ํผ / member/new → GET
· ํ์ ๋ฑ๋ก / member/new, /members → POST
· ํ์ ์กฐํ /members/{id} → GET
· ํ์ ์์ ํผ /members/{id}/edit → GET
· ํ์ ์์ /members/{id}/edit, members/{id} → POST
· ํ์ ์ญ์ /members/{id}/delete → POST
HTML FORM์ GET๊ณผ POST๋ง ์ง์์ ํ๋ค.
์ด๋ฌํ ์ ์ฝ์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋์ฌ๋ก ๋ ๋ฆฌ์์ค ๊ฒฝ๋ก(์ปจํธ๋กค URI)๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
POST์ /new, /edit, /delete๊ฐ ์ปจํธ๋กค URI์ด๋ค.
HTTP ๋ฉ์๋๋ก ํด๊ฒฐํ๊ธฐ ์ ๋งคํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ์ ํ๋ค.(HTTP API๋ ํฌํจ)
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ปจํธ๋กค URI๋ฅผ ๋ฌด์ํ๊ฒ ์ฌ์ฉํด์๋ ์๋๋ค.
์ต๋ํ ๋ฆฌ์์ค๋ผ๋ ๊ฐ๋ ์ ๊ฐ์ง๊ณ URI๋ฅผ ์ค๊ณํ๊ณ , ๊ทธ๋ฐ ์ํฉ์์ ์ค๊ณ๊ฐ ์๋ ๋ ์ปจํธ๋กค URI๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
HTTP ๋ฉ์๋ ํ์ฉ - ์ ๋ฆฌ
· HTTP API - ์ปฌ๋ ์
→ POST ๊ธฐ๋ฐ ๋ฑ๋ก
→ ์๋ฒ๊ฐ ๋ฆฌ์์ค URI ๊ฒฐ์
· HTTP API - ์คํ ์ด
→ PUT ๊ธฐ๋ฐ ๋ฑ๋ก
→ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค URI ๊ฒฐ์
· HTML FORM ์ฌ์ฉ
→ ์์ HTML + HTML form ์ฌ์ฉ
→ GET, POST๋ง ์ง์
· ๋ฌธ์(document)
· ๋จ์ผ ๊ฐ๋ (ํ์ผ ํ๋, ๊ฐ์ฒด ์ธ์คํด์ค, ๋ฐ์ดํฐ๋ฒ ์ด์ค row)
์) /members/100, /file/star.jpg
· ์ปฌ๋ ์ (collection)
· ์๋ฒ๊ฐ ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ๋๋ ํฐ๋ฆฌ
· ์๋ฒ๊ฐ ๋ฆฌ์์ค์ URI๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌ
์) /members
· ์คํ ์ด(store)
· ํด๋ผ์ด์ธํธ๊ฐ ๊ด๋ฆฌํ๋ ์์ ์ ์ฅ์
· ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ URI๋ฅผ ์๊ณ ๊ด๋ฆฌ
์) /files
· ์ปจํธ๋กค๋ฌ(controller), ์ปจํธ๋กค URI
· ๋ฌธ์, ์ปฌ๋ ์ , ์คํ ์ด๋ก ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ์ถ๊ฐ ํ๋ก์ธ์ค ์คํ
· ๋์ฌ๋ฅผ ์ง์ ์ฌ์ฉ
์) /members/{id}/delete
→ https://restfulapi.net/resource-naming
์ถ์ฒ: [์ธํ๋ฐ]๋ชจ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ HTTP ์น ๊ธฐ๋ณธ ์ง์
'๐ Web > HTTP ์น ๊ธฐ๋ณธ ์ง์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[HTTP]HTTP ํค๋2 - ์บ์์ ์กฐ๊ฑด๋ถ ์์ฒญ (0) | 2022.10.21 |
---|---|
[HTTP]HTTP ํค๋1 - ์ผ๋ฐ ํค๋ (0) | 2022.10.21 |
[HTTP]HTTP ์ํ์ฝ๋ (0) | 2022.10.20 |
[HTTP]HTTP ๊ธฐ๋ณธ (0) | 2022.10.19 |
[HTTP]์ธํฐ๋ท ๋คํธ์ํฌ (0) | 2022.10.19 |