HTTP API ๋ง๋ค์ด๋ณด๊ธฐ
ex) ์๊ตฌ์ฌํญ: ํ์ ์ ๋ณด ๊ด๋ฆฌ API ๋ง๋ค๊ธฐ(ํ์ ๋ชฉ๋ก ์กฐํ, ํ์ ์กฐํ, ๋ฑ๋ก, ์์ , ์ญ์ )
API URI์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฆฌ์์ค ์๋ณ
๋ฆฌ์์ค?
ํ์์ ๋ฑ๋กํ๊ณ ์์ ํ๋ ๊ฒ์ด ๋ฆฌ์์ค๊ฐ ์๋ → ํ์์ด๋ผ๋๊ฐ๋ ์์ฒด๊ฐ ๋ฆฌ์์ค
ex) ๋ฏธ๋ค๋์ ์บ๋ผ → ๋ฏธ๋ค๋์ด ๋ฆฌ์์ค
๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ์๋ณ?
ํ์์ ๋ฑ๋กํ๊ณ ์์ ํ๊ณ ์กฐํํ๋ ๊ฒ์ ๋ชจ๋ ๋ฐฐ์
ํ์์ด๋ผ๋ ๋ฆฌ์์ค๋ง ์๋ณํ๋ฉด ๋จ → ํ์ ๋ฆฌ์์ค๋ฅผ URI์ ๋งคํ
API URI ์ค๊ณ → ๋ฆฌ์์ค ์๋ณ, URI ๊ณ์ธต ๊ตฌ์กฐ ํ์ฉ
ํ์ ๋ชฉ๋ก ์กฐํ /members
ํ์ ์กฐํ /members/{id}
ํ์ ๋ฑ๋ก /members/{id}
ํ์ ์์ /members/{id}
ํ์ ์ญ์ /members/{id}
? ์ด๋ป๊ฒ ๊ตฌ๋ถ? → ๋ฆฌ์์ค์ ํ์๋ฅผ ๋ถ๋ฆฌ
๋ฆฌ์์ค์ ํ์์ ๋ถ๋ฆฌ
URI๋ ๋ฆฌ์์ค๋ง ์๋ณ
๋ฆฌ์์ค์ ํด๋น ๋ฆฌ์์ค๋ฅผ ๋์์ผ๋ก ํ๋ ํ์๋ฅผ ๋ถ๋ฆฌ
๋ฆฌ์์ค: ํ์
ํ์: ์กฐํ, ๋ฑ๋ก, ์ญ์ , ๋ณ๊ฒฝ
๋ฆฌ์์ค๋ ๋ช ์ฌ, ํ์๋ ๋์ฌ (๋ฏธ๋ค๋์ ์บ๋ผ)
ํ์(๋ฉ์๋)๋ ์ด๋ป๊ฒ ๊ตฌ๋ถ? → HTTP๋ฉ์๋๊ฐ ๊ตฌ๋ถํด์ค
HTTP ๋ฉ์๋ - GET, POST
HTTP ๋ฉ์๋: ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญ์ ํ ๋ ๊ธฐ๋ํ๋ ํ๋
HTTP ๋ฉ์๋ ์ข ๋ฅ
[์ฃผ์ ๋ฉ์๋]
GET: ๋ฆฌ์์ค ์กฐํ
POST: ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
PUT: ๋ฆฌ์์ค๋ฅผ ๋์ฒด, ํด๋น ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ
PATCH: ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
DELETE: ๋ฆฌ์์ค ์ญ์
[๊ธฐํ ๋ฉ์๋]
HEAD: GET๊ณผ ๋์ผํ์ง๋ง ๋ฉ์์ง ๋ถ๋ถ์ ์ ์ธํ๊ณ , ์ํ ์ค๊ณผ ํค๋๋ง ๋ฐํ
OPTIONS: ๋์ ๋ฆฌ์์ค์ ๋ํ ํต์ ๊ฐ๋ฅ ์ต์ (๋ฉ์๋)์ ์ค๋ช (์ฃผ๋ก CORS์์ ์ฌ์ฉ)
CONNECT: ๋์ ์์์ผ๋ก ์๋ณ๋๋ ์๋ฒ์ ๋ํ ํฐ๋์ ์ค์ → ๊ฑฐ์ ์ฌ์ฉ ์ํจ
TRACE: ๋์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฉ์์ง ๋ฃจํ๋ฐฑ ํ ์คํธ๋ฅผ ์ํ → ๊ฑฐ์ ์ฌ์ฉ ์ํจ
GET
ex)
GET /members/100 HTTP/1.1
Host: localhost:8080
- ๋ฆฌ์์ค ์กฐํ
- ์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ query๋ฅผ ํตํด์ ์ ๋ฌ
- ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์ง๋ง, ์ง์ํ์ง ์๋ ๊ณณ์ด ๋ง์์ ๊ถ์ฅํ์ง ์์
POST
ex)
POST /members HTTP/1.1
Content-Type: application/json
{
"username":"hello",
"age": 20
}
- ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ ์ ๋ฌ
- ์๋ฒ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ
- ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ํ
- ์ฃผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ก ์ ๊ท ๋ฆฌ์์ค ๋ฑ๋ก, ํ๋ก์ธ์ค ์ฒ๋ฆฌ์ ์ฌ์ฉ
- ์๋ต ๋ฐ์ดํฐ๋ก ์์์ด ์์ฑ๋ ๊ฒฝ๋ก๋ฅผ ๋ณด๋ด์ค
- ์คํ: POST ๋ฉ์๋๋ ๋์ ๋ฆฌ์์ค๊ฐ ๋ฆฌ์์ค์ ๊ณ ์ ํ ์๋ฏธ ์ฒด๊ณ์ ๋ฐ๋ผ ์์ฒญ์ ํฌํจ๋ ํํ์ ์ฒ๋ฆฌํ๋๋ก ์์ฒญ
- ex) ๊ฒ์ํ ๊ธ์ฐ๊ธฐ, ์ ๊ท ์์ฑ, ๊ธฐ์กด ์์์ ๋ฐ์ดํฐ ์ถ๊ฐ ๋ฑ๋ฑ
- ๋ฆฌ์์ค URI์ POST ์์ฒญ์ด ์ค๋ฉด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๋ฆฌ์์ค๋ง๋ค ๋ฐ๋ก ์ ํด์ผ ํจ
- POST๋ ๋ชจ๋ ๊ฒ์ ํ ์ ์์, ํ์ง๋ง ์กฐํ ๋ถ๋ถ์ ์ต๋ํ GET์ ์ฌ์ฉํ๊ธฐ!
[์ ๋ฆฌ]
1. ์ ๋ฆฌ์์ค ์์ฑ(๋ฑ๋ก)
- ์๋ฒ๊ฐ ์์ง ์๋ณํ์ง ์์ ์ ๋ฆฌ์์ค ์์ฑ
2. ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋, ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋์ด์ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
ex) ์ฃผ๋ฌธ์์ ๊ฒฐ์ ์๋ฃ -> ๋ฐฐ๋ฌ ์์ -> ๋ฐฐ๋ฌ ์๋ฃ ์ฒ๋ผ ๋จ์ํ ๊ฐ ๋ณ๊ฒฝ์ ๋์ด ํ๋ก์ธ์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ
- POST์ ๊ฒฐ๊ณผ๋ก ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋์ง ์์ ์ ์์
ex) POST /orders/{orderId}/start-delivery (์ปจํธ๋กค URI)
3. ๋ค๋ฅธ ๋ฉ์๋๋ก ์ฒ๋ฆฌํ๊ธฐ ์ ๋งคํ ๊ฒฝ์ฐ
- ์ ๋งคํ๋ฉด POST
ex) JSON์ผ๋ก ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ผ ํ๋๋ฐ, GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ
HTTP ๋ฉ์๋ - PUT, PATCH, DELETE
PUT
ex)
PUT /members/100 HTTP/1.1
Content-Type: application/json
{
"username": "hello",
"age": 20
}
- ๋ฆฌ์์ค๋ฅผ ์์ ํ ๋์ฒด
- ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ๋์ฒด
- ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ
- → ๊ธฐ์กด์ ์๋ ํ์ผ์ ๋ฎ์ด๋ฒ๋ฆผ
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋ณ
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค ์์น๋ฅผ ์๊ณ URI ์ง์
- POST์ ์ฐจ์ด์
PATCH
ex)
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
"age": 50
}
- ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
- PATCH๊ฐ ์ง์์ด ์๋๋ ๊ฒฝ์ฐ์๋ POST ์ฌ์ฉ
DELETE
ex)
DELETE /members/100 HTTP/1.1
Host: localhost:8080
- ๋ฆฌ์์ค ์ ๊ฑฐ
HTTP ๋ฉ์๋์ ์์ฑ
์์ (Safe Methods)
- ํธ์ถํด๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์ → GET, HEAD
- ์ฌ๋ฌ๋ฒ ํธ์ถํ๋ ํ ๋ฒ ํธ์ถํ๋ ๋ณ๊ฒฝ์ด ์ผ์ด๋์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ์์ ํ๋ค๊ณ ํจ
- ๊ณ์ ํธ์ถํด์ ๋ก๊ทธ๊ฐ ์์ฌ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊น์ง๋ ๊ณ ๋ คํ์ง ์์ →ํด๋น ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ์ด๋๋๋ ์๋๋๋ง ๊ณ ๋ ค
๋ฉฑ๋ฑ(Idempotent)
- f(f(x))=f(x)
- ํ ๋ฒ ํธ์ถํ๋ ๋ ๋ฒ ํธ์ถํ๋ 100๋ฒ ํธ์ถํ๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ฐ๋ค.
- ๋ฉฑ๋ฑ ๋ฉ์๋
- GET: ํ ๋ฒ ์กฐํํ๋ , ๋ ๋ฒ ์กฐํํ๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์กฐํ๋จ
- PUT: ๊ฒฐ๊ณผ๋ฅผ ๋์ฒด, ๋ฐ๋ผ์ ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ํด๋ ์ต์ข ๊ฒฐ๊ณผ๋ ๊ฐ์
- DELETE: ๊ฒฐ๊ณผ๋ฅผ ์ญ์ . ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ํด๋ ์ญ์ ๋ ๊ฒฐ๊ณผ๋ ๋๊ฐ์
- POST: ๋ฉฑ๋ฑ์ด ์๋! ๋ ๋ฒ ํธ์ถํ๋ฉด ๊ฐ์ ๊ฒฐ์ ๊ฐ ์ค๋ณตํด์ ๋ฐ์ํ ์ ์์
- ํ์ฉ
- ์๋ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ
- ์๋ฒ๊ฐ TIMEOUT ๋ฑ์ผ๋ก ์ ์ ์๋ต์ ๋ชป์ฃผ์์ ๋, ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์์ฒญ์ ๋ค์ ํด๋ ๋๋๊ฐ?
- Q: ์ฌ์์ฒญ ์ค๊ฐ์ ๋ค๋ฅธ ๊ณณ์์ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํด๋ฒ๋ฆฌ๋ฉด?
- ์ฌ์ฉ์1: GET -> username:A, age:20
- ์ฌ์ฉ์2: PUT -> username:A, age:30
- ์ฌ์ฉ์1: GET -> username:A, age: 30 -> ์ฌ์ฉ์2์ ์ํฅ์ผ๋ก ๋ฐ๋ ๋ฐ์ดํฐ ์กฐํ
- A: ๋ฉฑ๋ฑ์ ์ธ๋ถ ์์ธ์ผ๋ก ์ค๊ฐ์ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ ๊น์ง๋ ๊ณ ๋ คํ์ง ์์
์บ์๊ฐ๋ฅ(Cacheable)
- ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์บ์์์ ์ฌ์ฉํ ์ ์๋๊ฐ?
- GET, HEAD, POST, PATCH ์บ์ ๊ฐ๋ฅ
- ์ค์ ๋ก๋ GET, HEAD ์ ๋๋ง ์บ์๋ก ์ฌ์ฉ
- POST, PATCH๋ ๋ณธ๋ฌธ ๋ด์ฉ๊น์ง ์บ์ ํค๋ก ๊ณ ๋ คํด์ผ ํ๋๋ฐ, ๊ตฌํ์ด ์ฝ์ง ์์
'์น ์๋น์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| HTTP ์ํ์ฝ๋ (0) | 2022.12.02 |
|---|---|
| HTTP ๋ฉ์๋ ํ์ฉ (0) | 2022.12.01 |
| HTTP ๊ธฐ๋ณธ (0) | 2022.11.29 |
| URI์ ์น ๋ธ๋ผ์ฐ์ ์์ฒญ ํ๋ฆ (0) | 2022.11.29 |
| ์ธํฐ๋ท ๋คํธ์ํฌ (0) | 2022.11.29 |