๐ ๊น์ํ ๋์ "๋ชจ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ HTTP ์น ๊ธฐ๋ณธ ์ง์" ๊ฐ์ ๋ฃ๊ณ ์ ๋ฆฌ
๐HTTP API๋ฅผ ๋ง๋ค์ด๋ณด์
*API URI์ค๊ณ ์์ (์ด๊ฒ ์ข์ URI ์ค๊ณ์ผ๊น?)
ํ์ ๋ชฉ๋ก ์กฐํ | /read-member-list |
ํ์ ์กฐํ | /read-member-by-id |
ํ์ ๋ฑ๋ก | /create-member |
ํ์ ์์ | /update-member |
ํ์ ์ญ์ | /delete-member |
No!
API URI์์ ๊ฐ์ฅ ์ค์ํ ๊ฑด ๋ฆฌ์์ค ์๋ณ์ด๋ค.
๋ฆฌ์์ค๋ ๋ฌด์์ผ๊น?
ํ์์ ์กฐํํ๊ณ ์์ ํ๋ ๊ฒ์ด ๋ฆฌ์์ค๊ฐ ์๋๋ผ "ํ์"์ด๋ผ๋ ๊ฐ๋ ์์ฒด๊ฐ ๋ฆฌ์์ค์ด๋ค.
๊ทธ๋ผ ์ด๊ฑธ ์ด๋ป๊ฒ ์๋ณํ ๊น?
ํ์์ ๋ฐฐ์ ํ๊ณ "ํ์"์ด๋ผ๋ ๋ฆฌ์์ค๋ง ์๋ณํ์ฌ URI์ ๋งคํํ๋ฉด ๋๋ค.
๋ฆฌ์์ค ์๋ณ๊ณผ URI ๊ณ์ธต ๊ตฌ์กฐ ํ์ฉํด ๋ค์ ์ค๊ณํด๋ณด์
(* ๊ณ์ธต ๊ตฌ์กฐ์ ์์๋ฅผ ์ปฌ๋ ์ ์ผ๋ก ๋ณด๊ณ ๋ณต์๋จ์ด ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์๋ค (member -> members))
ํ์ ๋ชฉ๋ก ์กฐํ | /members |
ํ์ ์กฐํ | /members/{id} |
ํ์ ๋ฑ๋ก | /members |
ํ์ ์์ | /members/{id} |
ํ์ ์ญ์ | /members/{id} |
???? ๊ทธ๋ผ ๋๊ฐ์ ๊ฒ์ด 4๊ฐ๋ ์๊ธฐ๊ฒ ๋๋ค. ๊ตฌ๋ถ์ด ์๋๋ ๋ฐ ์ด๋ ์ด๋ฅผ ๊ตฌ๋ถํ๊ฒ ํ๋๊ฒ ๋ฐ๋ก HTTP ๋ฉ์๋์ด๋ค.
URI๋ ๋ฆฌ์์ค๋ง ์๋ณํ๊ณ ํ์๋ ๋ชจ๋ HTTP ๋ฉ์๋๋ก ๊ตฌ๋ถํ๊ฒ ๋๋ค. (๋ฆฌ์์ค๋ ๋ช ์ฌ, ํ์๋ ๋์ฌ)
๐HTTP ๋ฉ์๋ - GET, POST
HTTP ๋ฉ์๋๋ผ๋ ๊ฑด ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญํ ๋ ๊ธฐ๋ํ๋ ํ๋์ด๋ค.
์ฃผ๋ก ์ฌ์ฉ๋๋ ๋ฉ์๋์ ๋ํด ๋ฏธ๋ฆฌ ๊ฐ๋ตํ๊ฒ ๋ณด์๋ฉด
- GET : ๋ฆฌ์์ค ์กฐํ
- POST : ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
- PUT : ๋ฆฌ์์ค๋ฅผ ๋์ฒด, ํด๋น ๋ฆฌ์์ค ์์ผ๋ฉด ์์ฑ
- PATCH : ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
- DELETE : ๋ฆฌ์์ค ์ญ์
๊ธฐํ ๋ฉ์๋๋ค๋ ๋ณด๋ฉด
- HEAD : GET๊ณผ ๋์ผํ์ง๋ง ๋ฉ์์ง ๋ถ๋ถ์ ์ ์ธํ๊ณ , ์ํ ์ค๊ณผ ํค๋๋ง ๋ฐํ
- OPTIONS : ๋์ ๋ฆฌ์์ค์ ๋ํ ํต์ ๊ฐ๋ฅ ์ต์ (๋ฉ์๋)์ ์ค๋ช (์ฃผ๋ก CORS์์ ์ฌ์ฉํ๋ค)
- CONNECT : ๋์ ์์์ผ๋ก ์๋ณ๋๋ ์๋ฒ์ ๋ํ ํฐ๋์ ์ค์
- TRACE : ๋์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฉ์์ง ๋ฃจํ๋ฐฑ ํ ์คํธ๋ฅผ ์ํ
์ด ์๋ค.
* GET
- ๋ฆฌ์์ค ์กฐํ (path์ ์๋ ์์์ ์ฃผ์ธ์!)
- ๊ฒ์ ๋ฑ์ผ๋ก ์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ query(query parameter, query string)๋ฅผ ํตํด ์ ๋ฌํ๋ค.
- ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์๋ ์์ง๋ง, ์ง์ํ์ง ์๋ ๊ณณ์ด ๋ง์ ๊ถ์ฅํ์ง ์๋๋ค
GET /members/100
Host: localhost:8080
์๋ฒ๋ ์ด ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด /members์ 100๋ฒ์ ๋ฌ๋ผ๋ ๋ง๋ก ํด์ํ์ฌ ์ฒ๋ฆฌํ์ฌ ์๋ ์ฒ๋ผ Response ๋ฉ์์ง๋ก ๋ณด๋ด๊ฒ ๋๋ค.
HTTP/1.1 200 OK
Content-Type: application/json
Content-length: 34
{
"username" : "young",
"age" : 20
}
* POST
- ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ
- ํด๋ผ์ด์ธํธ๋ ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ
- ์๋ฒ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ (๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ๊ธฐ๋ฅ ์ํ)
POST /members HTTP/1.1
Content-Type: application/json
{
"username" : "young",
"age" : 20
}
์๋ต (members 100๋ฒ์ ํด๋น ์์์ด ์ ๊ท ๋ฑ๋ก๋์๋ค)
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 34
Location: /members/100
{
"username" : "young",
"age" : 20
}
์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋ค๋ ๋ป์ผ๊น?
POST ๋ฉ์๋๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๋ฆฌ์์ค URI์ ๋ฆฌ์์ค๋ง๋ค ๋ฐ๋ก ์ ํ๋ค. (์ ์ํ๊ธฐ ๋๋ฆ)
ํฌ๊ฒ ๋ฌถ์ด๋ณด์๋ฉด
- ์๋ฒ๊ฐ ์์ง ์๋ณํ์ง ์์ ์ ๋ฆฌ์์ค ๋ฑ๋ก(์กฐํ)
- ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ (๋ฐ์ดํฐ ์์ฑ, ์์ ์ธ์๋ ํ๋ก์ธ์ค ์ฒ๋ฆฌ ๊ฒฝ์ฐ๋ ์์)
- ๋ค๋ฅธ ๋ฉ์๋๋ก ์ฒ๋ฆฌ ์ ๋งคํ ๊ฒฝ์ฐ (GET ๋ฉ์๋๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์)
๐HTTP ๋ฉ์๋ - PUT, PATCH, DELETE
* PUT
- ๋ฆฌ์์ค ๋์ฒด (๋ฆฌ์์ค๊ฐ ์๋ค๋ฉด ์์ ํ ๋์ฒด, ์๋ค๋ฉด ์์ฑ)
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋ณ
- Post๋ ๊ทธ๋ฅ /members ์์ ๋๋ฌ๋ค๋ฉด Put ๊ฒฝ์ฐ /members/100 ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ๋ฆฌ์์ค ๊ฒฝ๋ก๋ฅผ ์๋ณ
PUT /members/100 HTTP/1.1
Content-Type: application/json
{
"username" : "old",
"age" : 50
}
์๋ฒ์ ํด๋น ๋ฆฌ์์ค ์์ผ๋ฉด ์ถ๊ฐ, ์์ผ๋ฉด ํด๋น ๊ฐ์ผ๋ก ๋์ฒดํ๋ค.
/members/100 ์ ๊ธฐ์กด๊ฐ | /members/100 ์ ๋ณ๊ฒฝ๊ฐ | /members/100 ์ ๊ฒฐ๊ณผ๊ฐ |
{ "username" : "young", "age" : 20 } |
{ "username" : "old", "age" : 50 } |
{ "username" : "old", "age" : 50 } |
์ด๋ ์์ ํ ๋์ฒดํ๋ค๋ ๋ง์ ์ฃผ์ํด์ผ ํ๋ค.
๊ธฐ์กด ๊ฐ ๊ฐ์ด๋ฐ ์ผ๋ถ๋ง ๋ณ๊ฒฝํ๊ณ ์ถ์ด PUT์ ์ฌ์ฉํ๋ฉด
/members/100 ์ ๊ธฐ์กด๊ฐ | /members/100 ์ ๋ณ๊ฒฝ๊ฐ | /members/100 ์ ๊ฒฐ๊ณผ๊ฐ |
{ "username" : "young", "age" : 20 } |
{ "age" : 50 } |
{ "age" : 50 } |
๋์ด๋ง ๋ฐ๊ฟ๋! | ๐ฑ ?????? |
์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค. ์๋๋ฉด ์ผ๋ถ ๋ณ๊ฒฝ์ด ์๋๋ผ ์์ ๋์ฒด์ด๊ธฐ ๋๋ฌธ. ๊ธฐ์กด ๊ฑธ ์ง์๋ฒ๋ฆฌ๊ณ ๋ฐ๊ฟ์ฃผ๋ ค๋ ๊ฐ์ผ๋ก ๋์ฒดํด๋ฒ๋ฆฐ๋ค.
์์ ๊ฐ์ ์๋๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด PATCH๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
* PATCH
- ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
"age" : 50
}
/members/100 ์ ๊ธฐ์กด๊ฐ | /members/100 ์ ๋ณ๊ฒฝ๊ฐ | /members/100 ์ ๊ฒฐ๊ณผ๊ฐ |
{ "username" : "young", "age" : 20 } |
{ "age" : 50 } |
{ "username" : "young", "age" : 50 } |
๋์ด๋ง ๋ฐ๊ฟ๋! | ๐๐ |
+ PATCH๊ฐ ์ง์์ด ์๋๋ค๋ฉด POST์ฌ์ฉ!
* DELETE
- ๋ฆฌ์์ค ์ ๊ฑฐ
DELETE /members/100
Host: localhost:8080
๐HTTP ๋ฉ์๋์ ์์ฑ
* ์์ (Safe Methods)
- ํธ์ถํด๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค. (์์ ์ ํด๋น ๋ฆฌ์์ค๋ง ๊ณ ๋ คํจ)
* ๋ฉฑ๋ฑ (Idenmpotent Methods)
- ํ๋ฒ ํธ์ถํ๋ ๋๋ฒ ํธ์ถํ๋ 100๋ฒ ํธ์ถํ๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ฐ๋ค.
- ๋ฉฑ๋ฑ ๋ฉ์๋ ("๊ฐ์ ๋ฐ์ดํฐ, ๊ฐ์ ํ์ผ์ ๋ํ ๊ฐ์ ์์ฒญ"์ ํ ๋๋ฅผ ์๊ฐํด๋ณผ๊ฒ)
- GET : ํ ๋ฒ ์กฐํํ๋ , ๋๋ฒ ์กฐํํ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์กฐํ
- PUT : ๊ฒฐ๊ณผ๋ฅผ ๋์ฒดํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ํด๋ ์ต์ข ๊ฒฐ๊ณผ๋ ๊ฐ๋ค
- DELETE : ๊ฒฐ๊ณผ๋ฅผ ์ญ์ ์ฌ๋ฌ๋ฒ ์ญ์ ํด๋ ๊ฒฐ๊ตญ ์ญ์ ๋๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค
- POST ? POST๋ ๋ฉฑ๋ฑ์ด ์๋๋ค. ๊ฐ์ ์์ฒญ์ ํด๋ ๋๋ง๋ค ํ๋ก์ธ์ค๋ฅผ ์งํํ ์๋ ์์ด ์ค๋ณต์ด ๋ ์ ์๊ธฐ ๋๋ฌธ
+ ๋ฉฑ๋ฑ์ฑ (idempotent)
๋ฉฑ๋ฑ์ฑ์ ๋ฉฑ(ๅช)์ ๊ฑฐ๋ญ์ ๊ณฑ์ด๋ ๋ป์ด ์์ผ๋ฉฐ ๋ฑ(็ญ)์ ๊ฐ๋ค๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค.
๊ฑฐ๋ญํด๋ ๊ฐ๋ค๋ ๋ป์ผ๋ก ์ํ์์๋ ์ฐ์ฐ์ ์ฌ๋ฌ๋ฒ ์ ์ฉํ๋๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋ ์ฑ์ง์ ์๋ฏธํ๋ฉฐ, ์น์์๋ ๋์ผํ ์์ฒญ์ ํ ๋ฒ ๋ณด๋ด๋ ๊ฒ๊ณผ ์ฌ๋ฌ๋ฒ ์ฐ์์ผ๋ก ๋ณด๋ด๋ ๊ฒ์ด ๊ฐ์ ํจ๊ณผ๋ฅผ ์ง๋๊ณ , ์๋ฒ์ ์ํ์๋ ๋์ผํ๊ฒ ๋จ์ ๋, ํด๋น HTTP ๋ฉ์๋๊ฐ ๋ฉฑ๋ฑ์ฑ์ ๊ฐ์ก๋ค๊ณ ํ๋ค.
๋ฉฑ๋ฑ์ด๋ ๊ฐ๋ ์ด ์ ํ์ํ ๊น?
์๋ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- ์๋ฒ๊ฐ ์ ์ ์๋ต์ ๋ชป์ฃผ์์ ๋, ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์์ฒญ์ ๋ค์ ํด๋ ๋๋์ง ํ๋จ์ ๊ทผ๊ฑฐ
์ด? ๊ทธ๋ผ ์ฌ์์ฒญ ์ฌ์ด์ ์ธ๋ถ์์ ๊ทธ๊ฑธ ๋ฐ๊ฟ๋ฒ๋ฆฐ๋ค๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์งํ ๋ฐ?
๋ฉฑ๋ฑ์ ์ธ๋ถ์์ธ๊น์ง ๊ณ ๋ คํ์ง ์๋ ๊ฐ๋ ์ด๋ค. ๋ด๊ฐ ๋์ผํ ์์ฒญ์ ํ์๋ ๋ง์ ํ๋จ
* ์บ์๊ฐ๋ฅ (Cacheable Methods)
- ์๋ต ๊ฒฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ์บ์ํด์ ์ฌ์ฉํด๋ ๋๋๊ฐ?
- GET, HEAD, POST, PATCH ์บ์๊ฐ๋ฅ (์ค์ ๋ก๋ GET, HEAD ์ ๋๋ง ์บ์ ์ฌ์ฉ, POST, PATCH๋ ๊ตฌํ์ด ์ฝ์ง ์๊ธฐ ๋๋ฌธ)
'Computer Science > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
HTTP ์น ์ง์ - HTTP ์ํ์ฝ๋ ์๊ฐ (0) | 2023.03.08 |
---|---|
HTTP ์น ์ง์ - HTTP ๋ฉ์๋ ํ์ฉ (0) | 2023.03.08 |
HTTP ์น ์ง์ - ๋ชจ๋ ๊ฒ์ด HTTP (0) | 2023.03.06 |
HTTP ์น ์ง์ - URI์ ์น ๋ธ๋ผ์ฐ์ ์์ฒญ ํ๋ฆ (0) | 2023.03.06 |
HTTP ์น ์ง์ - ์ธํฐ๋ท ๋คํธ์ํฌ (0) | 2023.03.06 |