[HTTP] 4. HTTP ๋ฉ์๋
์๋ ํ์ธ์!
์ค๋์ HTTP ๋ฉ์๋๋ฅผ ๊ณต๋ถํ๊ณ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
์์ํด๋ณผ๊ฒ์ ๊ณ ๊ณ !!

1. HTTP API๋ฅผ ๋ง๋ค์ด ๋ณด์. (๊ณผ์ )
1-1. ์๊ตฌ์ฌํญ - ํ์ ์ ๋ณด ๊ด๋ฆฌ API๋ฅผ ๋ง๋ค์ด๋ผ!
- ํ์ ๋ชฉ๋ก ์กฐํ
- ํ์ ์กฐํ
- ํ์ ๋ฑ๋ก
- ํ์ ์์
- ํ์ ์ญ์
1-2. API URI ์ค๊ณ
URI = Uniform Resource Identifier
- ํ์ ๋ชฉ๋ก ์กฐํ: /read-member-list
- ํ์ ์กฐํ: /read-member-by-id
- ํ์ ๋ฑ๋ก: /create-member
- ํ์ ์์ : /update-member
- ํ์ ์ญ์ : /delete-member
URI ์ค๊ณ ํ์ ๊ฐ๋ฐ์ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ํ ๊ฐ์ง ์๋ฌธ์ ์ด ์์ต๋๋ค.
์ด๊ฒ์ ๊ณผ์ฐ ์ข์ URI ์ค๊ณ์ผ๊น์?
์ ๋ต์ NO!
๊ฐ์ฅ ์ค์ํ ๊ฒ์! ๋ฆฌ์์ค ์๋ณ์ ๊ธฐ์ค์ผ๋ก ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
1-2(1). API URI ๊ณ ๋ฏผ
๋ฆฌ์์ค๋ ๋ฌด์์ผ๊น์?
๋ฆฌ์์ค๋ ํ์์ ๋ฑ๋กํ๊ณ ์์ ํ๊ณ ์กฐํํ๋ ๋ฑ์ ํ์๋ฅผ ๋ปํ๋ ๊ฒ์ด ์๋๋๋ค.
์๋ฅผ ๋ค์ด "๊ฐ์์ง๋ฅผ ์ฐ์ฑ ์์ผ๋ผ"๋ผ๋ ๋ฌธ์ฅ์ด ์์ต๋๋ค.
์ฌ๊ธฐ์์ ๋ฆฌ์์ค๋ ์ฐ์ฑ ์์ผ๋ผ๊ฐ ์๋ ๊ฐ์์ง๊ฐ ๋ฉ๋๋ค.
์ฆ, ํ์์ด๋ผ๋ ๊ฐ๋ ์์ฒด๊ฐ ๋ฆฌ์์ค๋ผ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ผ ๋ฆฌ์์ค๋ฅผ ์ด๋ป๊ฒ ์๋ณํ๋๊ฒ ์ข์๊น์?
ํ์์ ๋ฑ๋กํ๊ณ ์์ ํ๊ณ ์กฐํํ๋ ๋ฑ์ ํ์๋ ๋ชจ๋ ๋ฐฐ์ ํ๊ณ ํ์์ด๋ผ๋ ๋ฆฌ์์ค๋ง ์๋ณํ๋ฉด ๋ฉ๋๋ค.
์ฆ, ํ์ ๋ฆฌ์์ค๋ฅผ URI์ ๋งคํํ๋ฉด ๋๋ค๋ ๋ป์ ๋๋ค.
1-2(2). API URI ์ค๊ณ
- ํ์ ๋ชฉ๋ก ์กฐํ: /members
- ํ์ ์กฐํ: /members/{id}
- ํ์ ๋ฑ๋ก: /members{id}
- ํ์ ์์ : /members/{id}
- ํ์ ์ญ์ : /members/{id}
์ด๋ ๊ฒ ํ์์ ๊ธฐ์ค์ผ๋ก ์ค๊ณํด์ผ ํฉ๋๋ค.
URI ๊ณ์ธต ๊ตฌ์กฐ ํ์ฉํด์ ํ์์ ์ฌ๋ฌ ๋ช ์ด๋๊น ๋ณต์ ๋จ์ด์ธ members๋ก ์ฌ์ฉํ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ณด๋ฉด ์์๋ค์ํผ ํ์ ์กฐํ๋ถํฐ ํ์ ์ญ์ ๊น์ง /members/{id}๋ก ๋ค ๋๊ฐ์ต๋๋ค.
์ด๊ฑฐ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น์?
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฆฌ์์ค์ ํ์๋ฅผ ๋ถ๋ฆฌํด์ผ ํฉ๋๋ค.
์๊น ์์์ ์๊ธฐํ URI๋ ๋ฆฌ์์ค(ํ์)๋ง ์๋ณํ๋ ๊ฒ์ด ๋ง์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ฆฌ์์ค์ ํด๋น ๋ฆฌ์์ค๋ฅผ ๋์์ผ๋ก ํ๋ ํ์๋ฅผ ๋ถ๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋ฆฌ์์ค: ํ์ (๋ช ์ฌ)
- ํ์: ์กฐํ, ๋ฑ๋ก, ์ญ์ , ๋ณ๊ฒฝ (๋์ฌ)
์ด๋ฐ ์์ผ๋ก ๋ง์ด์ฃ .
๊ทธ๋ผ ์ด ํ์(๋ฉ์๋)๋ ์ด๋ป๊ฒ ๊ตฌ๋ถํ ๊น์?
์ด ์ง๋ฌธ์ ๋ํด์ ํด๊ฒฐ์ ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ HTTP ๋ฉ์๋๋ผ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
2. HTTP ๋ฉ์๋ ์ข ๋ฅ
2-1. ์ฃผ์ ๋ฉ์๋ (GET, POST, PUT, PATCH, DELETE)
- GET: ๋ฆฌ์๋ ์กฐํ
- POST: ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ์ฃผ๋ก ๋ฑ๋ก์ ์ฌ์ฉ
- PUT: ๋ฆฌ์์ค๋ฅผ ๋์ฒด, ํด๋น ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑ (ํ์ผ์ ํด๋์ ๋ฃ์ ๋์ ๋น์ท)
- PATCH: ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ (ex. ํ์์ ์ด๋ฆ ๋ณ๊ฒฝ ๊ฐ์๊ฑฐ..?)
- DELETE: ๋ฆฌ์์ค ์ญ์

2-1(1). GET
GET์ ๋ฆฌ์์ค๋ฅผ ์กฐํํ๋ ๋ฉ์๋ ์ ๋๋ค.
์๋ฒ์ ์ ๋ฌํ๊ณ ์ถ์ ๋ฐ์ดํฐ๋ query(์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, ์ฟผ๋ฆฌ ์คํธ๋ง)๋ฅผ ํตํด์ ์ ๋ฌํฉ๋๋ค.
๋ํ, ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์๋ ์์ง๋ง, ์ง์ํ์ง ์๋ ๊ณณ์ด ๋ง์์ ๊ถ์ฅํ์ง๋ ์์ต๋๋ค.
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
GET์ด ์ ํํ ์ด๋ค ๋ฉ์๋์ธ์ง ๊ทธ๋ฆผ์ ํตํด์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
- ๋ฆฌ์์ค ์กฐํ1 - ๋ฉ์์ง ์ ๋ฌ

ํด๋ผ์ด์ธํธ๊ฐ id๊ฐ 100๋ฒ์ธ ํ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด๋ฌ๋ผ๊ณ ์๋ฒ์๊ฒ ์์ฒญํฉ๋๋ค.
- ๋ฆฌ์์ค ์กฐํ2 - ์๋ฒ ๋์ฐฉ

์์ฒญํ ๋ฉ์์ง๊ฐ ์๋ฒ์ ๋์ฐฉํ์ต๋๋ค.
- ๋ฆฌ์์ค ์กฐํ3 - ์๋ต ๋ฐ์ดํฐ

์๋ฒ๊ฐ id๊ฐ 100๋ฒ์ธ ํ์์ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํด์ ์๋ตํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฐ ํ์๋ฅผ ํ๋ ๋ฉ์๋๋ฅผ GET์ด๋ผ๊ณ ํฉ๋๋ค.
2-1(2). POST
POST๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์๋ ์ ๋๋ค.
GET๊ณผ ๋ค๋ฅด๊ฒ ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ์๋ฒ๋ก ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ , ์๋ฒ๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
POST์ ๋ํ์ ์ธ ํน์ง์ ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์ฃผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ก ์ ๊ท ๋ฆฌ์์ค ๋ฑ๋ก, ํ๋ก์ธ์ค ์ฒ๋ฆฌ(๋ณ๊ฒฝ๋ ํ๋ก์ธ์ค ๋ฐ๊ฟ ๋ฑ)์ ์ฌ์ฉํฉ๋๋ค.
๊ฟํ!!
์ ๋งคํ๊ฑฐ๋ ์ด๊ฒ ๋ญ์ง? ์ถ์ผ๋ฉด ์ ๋งํ๋ฉด POST ์ ๋๋ค.

POST /members HTTP/1.1
Content-Type: application/json
{
"username": "song",
"age": 20
}
POST๊ฐ ์ ํํ ์ด๋ค ๋ฉ์๋์ธ์ง ๊ทธ๋ฆผ์ ํตํด์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
- ๋ฆฌ์์ค ๋ฑ๋ก1 - ๋ฉ์์ง ์ ๋ฌ

ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฆ์ด song์ด๊ณ ๋์ด๊ฐ 20์ด์ธ ํ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฑ๋กํด๋ฌ๋ผ๊ณ ์๋ฒ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌ(์์ฒญ)ํฉ๋๋ค.
- ๋ฆฌ์์ค ๋ฑ๋ก2 - ์ ๊ท ๋ฆฌ์์ค ์์ฑ

์ ๊ท ๋ฆฌ์์ค ์๋ณ์(/members/100)๋ฅผ ์์ฑํด์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฆฌ์์ค ๋ฑ๋ก3 - ์๋ต ๋ฐ์ดํฐ

์๋ฒ๊ฐ ์ ๊ท ๋ฆฌ์์ค ์๋ณ์(/members/100)์ ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ฑ๋ก๋์๋ค๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค.
POST๋ ์ค์ํ ์ ์ด ๋ง๊ธฐ์ ์์์ ์ ๋ฆฌ๋ณธ์ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.
๋จผ์ , POST๋ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋ค๋ ๋ป์ผ๊น์?
POST๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํฉ๋๋ค.
(์์ ์์ฃผ๋ก ๋ณด์๋ฉด ๋ฉ๋๋ค)
1. HTML ์์์ ์ ๋ ฅ๋ ํ๋์ ๊ฐ์ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๋ก์ธ์ค์ ์ ๊ณต
ex) HTML FORM์ ์ ๋ ฅํ ์ ๋ณด๋ก ํ์ ๊ฐ์ , ์ฃผ๋ฌธ ๋ฑ์์ ์ฌ์ฉ
2. ๊ฒ์ํ, ๋ด์ค ๊ทธ๋ฃน, ๋ฉ์ผ๋ง ๋ฆฌ์คํธ, ๋ธ๋ก๊ทธ ๋๋ ์ ์ฌํ ๊ธฐ์ฌ ๊ทธ๋ฃน์ ๋ฉ์์ง ๊ฒ์
ex) ๊ฒ์ํ ๊ธ์ฐ๊ธฐ, ๋๊ธ ๋ฌ๊ธฐ
3. ์๋ฒ๊ฐ ์์ง ์๋ณํ์ง ์์ ์ ๋ฆฌ์์ค ์์ฑ
ex) ์ ๊ท ์ฃผ๋ฌธ ์์ฑ
4. ๊ธฐ์กด ์์์ ๋ฐ์ดํฐ ์ถ๊ฐ
ex) ํ ๋ฌธ์ ๋์ ๋ด์ฉ ์ถ๊ฐํ๊ธฐ
๊ฒฐ๊ตญ ์ด ๋ฆฌ์์ค URI์ POST ์์ฒญ์ด ์ค๋ฉด ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๋ฆฌ์์ค๋ง๋ค ๋ฐ๋ก ์ ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์๋ํ๋ฉด ์ ํด์ง ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ด์ฃ .
POST ์ต์ข ์ ์ผ๋ก ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
<POST ๋ฉ์๋๊ฐ ํ๋ ์ผ>
1. ์ ๋ฆฌ์์ค ์์ฑ(๋ฑ๋ก)
- ์๋ฒ๊ฐ ์์ง ์๋ณํ์ง ์์ ์ ๋ฆฌ์์ค ์์ฑ
2. ์์ฒญ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋์ด์ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ
- ex) ์ฃผ๋ฌธ์์ ๊ฒฐ์ ์๋ฃ -> ๋ฐฐ๋ฌ ์์ -> ๋ฐฐ๋ฌ ์๋ฃ ์ฒ๋ผ ๋จ์ํ ๊ฐ ๋ณ๊ฒฝ์ ๋์ด ํ๋ก์ธ์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ
- POST์ ๊ฒฐ๊ณผ๋ก ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋์ง ์์ ์๋ ์์ต๋๋ค.
- ex) POST /orders/{orderId}/start-delivery (์ปจํธ๋กค URI)
์ด ์์์์ ๊ตต์ ๊ธ์จ์ธ start-delivery ๋ถ๋ถ์ ๋ณด๋ฉด ๋ถ๋ช ๋ฆฌ์์ค๋ ๋ช ์ฌ๊ฐ ์จ๋ค๊ณ ํ๋๋ฐ ๋์ฌ๊ฐ ์์ต๋๋ค.
์ด๋ฐ ๋์ฌ์ URI๋ฅผ ์ปจํธ๋กค URI๋ผ๊ณ ํ๊ณ , ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ ๋ฆฌ์์ค๊ฐ ์์ฑ๋์ง ์์๋ POST๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
3. ๋ค๋ฅธ ๋ฉ์๋๋ก ์ฒ๋ฆฌํ๊ธฐ ์ ๋งคํ ๊ฒฝ์ฐ
- ex) JSON์ผ๋ก ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ผ ํ๋๋ฐ, GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ
=> ์กฐํ๋ผ ์๋ GET์ธ๋ฐ ๋ฉ์์ง ๋ฐ๋์ ๋ด์ฉ์ ์ ๋ฌํด์ผํ๋ ๊ฒฝ์ฐ์๋ ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ง์ํ์ง ์๋ ๊ณณ์ด ๋ง์์ ์ด๋ฐ ์ ๋งคํ ๊ฒฝ์ฐ์๋ POST๋ฅผ ์ฌ์ฉํฉ๋๋ค.
2-1(3). PUT
PUT์ ๋ํ์ ์ผ๋ก 2๊ฐ์ง ํน์ง์ด ์๋ ๋ฉ์๋ ์ ๋๋ค.
์ฒซ ๋ฒ์งธ๋ก, ๋ฆฌ์์ค๋ฅผ ๋์ฒด(์์ ํ)ํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ๋์ฒดํ๊ณ , ๋ฆฌ์์ค๊ฐ ์์ผ๋ฉด ์์ฑํ๋ ์ญํ ์ ํฉ๋๋ค.
์ฝ๊ฒ ๋งํด์ ํ์ผ ๋ณต์ฌ์ฒ๋ผ ๊ธฐ์กด ํ์ผ์ด ์์ผ๋ฉด ๋ฎ์ด์ฐ๊ณ ๊ธฐ์กด ํ์ผ์ด ์์ผ๋ฉด ์์ฑํ๋ค๋ ์๋ฏธ์ ๋๋ค.
๋ ๋ฒ์งธ๋ก, ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ค๋ ๊ฒ์ ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ ์์น๋ฅผ ์๊ณ URI๋ฅผ ์ง์ ํ๋ค๋ ๋ป์ด๊ณ , ์ด๊ฑด PUT๋ง์ ํน์ง์ ๋๋ค.
POST์์ ์ฐจ์ด์ ์ ์ค๋ช ํ์๋ฉด...
POST๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ ์์น๊ฐ 100๋ฒ์ธ์ง 200๋ฒ์ธ์ง.. ๋ชจ๋ฆ ๋๋ค.
๊ทธ๋ฐ๋ฐ, PUT์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฆฌ์์ค์ ์์น๋ฅผ ์์์ URI๋ฅผ ์ง์ ํฉ๋๋ค.
PUT /members/100 HTTP/1.1
Content-Type: application/json
{
"username": "ssari",
"age": 25
}
PUT์ด ์ ํํ ์ด๋ค ๋ฉ์๋์ธ์ง ๊ทธ๋ฆผ์ ํตํด์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
- ๋ฆฌ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ1

๊ธฐ์กด /members/100์๋ ์ด๋ฆ์ด song์ด๊ณ ๋์ด๊ฐ 20์ด์ธ ํ์์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ต๋๋ค.ํด๋ผ์ด์ธํธ๊ฐ /members/100์ ์ด๋ฆ์ด ssari์ด๊ณ ๋์ด๊ฐ 25์ด์ธ ํ์์ ๋ฐ์ดํฐ๋ก ๋์ฒดํ๋ผ๊ณ ์๋ฒ์๊ฒ ์์ฒญํฉ๋๋ค.
- ๋ฆฌ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ2

์๋ฒ๊ฐ /members/100์ ๋ฆฌ์์ค๋ฅผ ํด๋ผ์ด์ธํธ์์ ์์ฒญํ ๋ฆฌ์์ค๋ก ๋์ฒดํ์ต๋๋ค.
- ๋ฆฌ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ1

์๋ฒ์๋ ์ด์ ๋ฆฌ์์ค๊ฐ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ /members/100์ ์ด๋ฆ์ด ssari์ด๊ณ ๋์ด๊ฐ 25์ด์ธ ํ์์ ๋ฐ์ดํฐ๋ก ๋์ฒดํ๋ผ๊ณ ์๋ฒ์๊ฒ ์์ฒญํฉ๋๋ค.
- ๋ฆฌ์์ค๊ฐ ์๋ ๊ฒฝ์ฐ2

์๋ฒ๊ฐ ์ ๊ท ๋ฆฌ์์ค๋ฅผ ์์ฑํ์์ต๋๋ค(๋์ฒด๋ ๋ฐ์ดํฐ ๋ค์ด๊ฐ์์).
- ์ฃผ์!! - ๋ฆฌ์์ค๋ฅผ ์์ ํ ๋์ฒด1

๊ธฐ์กด /members/100์๋ ์ด๋ฆ์ด song์ด๊ณ ๋์ด๊ฐ 20์ด์ธ ํ์์ ์ ๋ณด๊ฐ ๋ค์ด์์ต๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ /members/100์ ์๋ ํ์์ ์ ๋ณด์์ ์ด๋ฆ ํ๋ ์์ด ๋์ด๋ง 25์ด๋ก ๋์ฒด(์์ )ํ๋ผ๊ณ ์๋ฒ์๊ฒ ์์ฒญํฉ๋๋ค.
- ์ฃผ์!! - ๋ฆฌ์์ค๋ฅผ ์์ ํ ๋์ฒด2

/members/100์ ์๋ ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ๋ค ๋ ๋ผ๊ฐ๊ณ ํด๋ผ์ด์ธํธ์์ ์์ฒญํ ๋์ด 25์ด ๋ฆฌ์์ค๋ก ๋์ฒด๋์์ต๋๋ค.
2-1(4). PATCH
PATCH๋ ๋ฆฌ์์ค๋ฅผ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋ ์ ๋๋ค.
PATCH๊ฐ ๊ฐ์ฅ ์ต๊ทผ์ ์๊ธด ๋ฉ์๋์ฌ์ ๋ง์ฝ์ PATCH๋ฅผ ์ง์์ ์ ํ ๊ฒฝ์ฐ์๋ POST๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
PATCH /members/100 HTTP/1.1
Content-Type: application/json
{
"age": 25
}
PATCH๊ฐ ์ ํํ ์ด๋ค ๋ฉ์๋์ธ์ง ๊ทธ๋ฆผ์ ํตํด์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
- ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ1

ํด๋ผ์ด์ธํธ๊ฐ /members/100 ๋ฆฌ์์ค์์ ๋์ด๋ง 25์ด๋ก ๋ฐ๊ฟ๋ฌ๋ผ๊ณ ์๋ฒ์๊ฒ ์์ฒญํฉ๋๋ค.
- ๋ฆฌ์์ค ๋ถ๋ถ ๋ณ๊ฒฝ2

ํด๋ผ์ด์ธํธ์์ ์์ฒญํ ๋๋ก ์ด๋ฆ์ ๊ทธ๋๋ก ๋๋๊ณ ๋์ด๋ง 25์ด๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.
2-1(5). DELETE
DELETE๋ ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ๋ ๋ฉ์๋ ์ ๋๋ค.
DELETE /members/100 HTTP/1.1
Host: localhost:8080
DELETE๊ฐ ์ ํํ ์ด๋ค ๋ฉ์๋์ธ์ง ๊ทธ๋ฆผ์ ํตํด์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
- ๋ฆฌ์์ค ์ ๊ฑฐ1

ํด๋ผ์ด์ธํธ๊ฐ id๊ฐ 100๋ฒ์ธ ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํด๋ฌ๋ผ๊ณ ์๋ฒ์๊ฒ ์์ฒญํฉ๋๋ค.
- ๋ฆฌ์์ค ์ ๊ฑฐ2

/members/100 ๋ฆฌ์์ค๊ฐ ์ ๊ฑฐ๋์์ต๋๋ค.
2-2. ๊ธฐํ ๋ฉ์๋
- HEAD: GET๊ณผ ๋์ผํ์ง๋ง ๋ฉ์์ง ๋ถ๋ถ(๋ฉ์์ง ๋ฐ๋) ์ ์ธํ๊ณ ์ํ ์ค๊ณผ ํค๋๋ง ๋ฐํํฉ๋๋ค.
- OPTIONS: ๋์ ๋ฆฌ์์ค์ ๋ํ ํต์ ๊ฐ๋ฅ ์ต์ (๋ฉ์๋)์ ์ค๋ช ํฉ๋๋ค. (์ฃผ๋ก CORS์์ ์ฌ์ฉ)
- CONNECT: ๋์ ๋ฆฌ์์ค๋ก ์๋ณ๋๋ ์๋ฒ์ ๋ํ ํฐ๋์ ์ค์ ํฉ๋๋ค. (๊ฑฐ์ ์ฌ์ฉX)
- TRACE: ๋์ ๋ฆฌ์์ค์ ๋ํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ๋ฉ์์ง ๋ฃจํ๋ฐฑ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค. (๊ฑฐ์ ์ฌ์ฉX)
3. HTTP ๋ฉ์๋์ ์์ฑ
3-1. ์์ (Safe)
- ํธ์ถํด๋ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค.
- Q. ๊ณ์ ํธ์ถํ๋ค๊ฐ ๋ก๊ทธ ๊ฐ์๊ฒ ์์ฌ์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด?
- A. ์์ ์ ํด๋น ๋ฆฌ์์ค๋ง ๊ณ ๋ คํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฐ ๋ถ๋ถ๊น์ง ๊ณ ๋ คํ์ง ์์ต๋๋ค.
- GET, PUT, PATCH, DELETE๋ ์์ O / POST๋ ์์ X
3-2. ๋ฉฑ๋ฑ (Idempotent)
- f(f(x)) = f(x) => ํ ๋ฒ ํธ์ถํ๋ ์ฌ๋ฌ๋ฒ ํธ์ถํ๋ ๊ฒฐ๊ณผ๊ฐ ๋๊ฐ๋ค๋ ๋ป์ ๋๋ค.
- ๋ฉฑ๋ฑ ๋ฉ์๋
- GET: ํ ๋ฒ ์กฐํํ๋ , ์ฌ๋ฌ๋ฒ ์กฐํํ๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์กฐํ๋ฉ๋๋ค. (๋๊ฐ์ ์ ๋ณด ๊ณ์ ์กฐํํด๋ดค์ ๋๊ฐ์)
- PUT: ๊ฒฐ๊ณผ๋ฅผ ๋์ฒดํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ํด๋ ์ต์ข ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค. (๋๊ฐ์ ํ์ผ ๊ณ์ ์ ๋ก๋ํด๋ ์์ ๋ ๋ฆฌ๊ณ ๋ฎ์ด์ฐ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๊ธฐ์ ๊ณ์ ๋๊ฐ์)
- DELETE: ๊ฒฐ๊ณผ๋ฅผ ์ญ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์์ฒญ์ ์ฌ๋ฌ๋ฒ ํด๋ ์ญ์ ๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค.
- POST: ๋ฉฑ๋ฑ์ด ์๋๋๋ค. ์๋ํ๋ฉด ๋ ๋ฒ ํธ์ถํ๋ฉด ๊ฐ์ ๊ฒฐ์ ๊ฐ ์ค๋ณตํด์ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. (๋ง์ฝ์ ์ฌ์ฅ์ด ๋ฐฐ์ก์ 2๋ฒ ๋๋ฅด๋ฉด ๋ฌธ์ ๊ฐ ์ผ์ด๋จ)
- ํ์ฉ
- ์๋ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ
- Q. ์๋ฒ๊ฐ TIMEOUT ๋ฑ์ผ๋ก ์ ์ ์๋ต์ ์ฃผ์ง ๋ชปํ์ ๋, ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ์์ฒญ์ ๋ค์ ํด๋ ๋๋๊ฐ?
- A. ๋ฉฑ๋ฑ์ด๋ฉด ๊ด์ฐฎ์ต๋๋ค.
- Q. ์ฌ์์ฒญ ์ค๊ฐ์ ๋ค๋ฅธ ๊ณณ์์ ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํด๋ฒ๋ฆฌ๋ฉด?
- ์ฌ์ฉ์1: GET -> username:A, age:20 (์กฐํ)
- ์ฌ์ฉ์2: PUT -> username:A, age:40 (์ค๊ฐ์ ๋์ฒดํด๋ฒ๋ฆผ)
- ์ฌ์ฉ์1: GET -> username:A, age:40 => ์ฌ์ฉ์2์ ์ํฅ์ผ๋ก ๋ฐ๋ ๋ฐ์ดํฐ ์กฐํ(์ฒ์ ์กฐํํ ๋๋ ๋ค๋ฆ)
- A. ๋ฉฑ๋ฑ์ ์ธ๋ถ ์์ธ์ผ๋ก ์ธํด ์ค๊ฐ์ ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ ๊น์ง๋ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ์๋ฒ๊ฐ ์์์ ์ฒดํฌํ๋๋ก!
3-3. ์บ์ ๊ฐ๋ฅ (Cacheable)
์์ 2๊ฐ์ ๊ฐ๋ ๋ณด๋ค ๋ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. (์์ธํ ์ค๋ช ์ ๋์ค์..)
- Q. ์๋ต ๊ฒฐ๊ณผ ๋ฆฌ์์ค๋ฅผ ์บ์ํด์ ์ฌ์ฉํด๋ ๋๋๊ฐ?
- A. GET, HEAD, POST, PATCH๋ ์บ์ ๊ฐ๋ฅํฉ๋๋ค.
- BUT, ์ค์ ๋ก๋ GET, HEAD ์ ๋๋ง ์บ์๋ก ์ฌ์ฉํฉ๋๋ค.
- POST, PATCH๋ ๋ณธ๋ฌธ ๋ด์ฉ๊น์ง ์บ์ ํค๋ก ๊ณ ๋ ค(๋๊ฐ์ ์บ์ ํค์ฌ์ผ ํจ)ํด์ผ ํ๋๋ฐ ๊ตฌํ์ด ์ฝ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.