[HTTP] 5.HTTP ๋ฉ”์„œ๋“œ ํ™œ์šฉ

 

1. ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

[๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹์€ ํฌ๊ฒŒ 2๊ฐ€์ง€]

1) ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

   - GET

   - ์ฃผ๋กœ ์ •๋ ฌ ํ•„ํ„ฐ (๊ฒ€์ƒ‰์–ด)

 

2) ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

   - POST, PUT, PATCH

   - ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก, ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ

 

[4๊ฐ€์ง€ ์ƒํ™ฉ]

1) ์ •์  ๋ฐ์ดํ„ฐ ์กฐํšŒ (์ด๋ฏธ์ง€, ์ •์  ํ…์ŠคํŠธ ๋ฌธ์„œ)

2) ๋™์  ๋ฐ์ดํ„ฐ ์กฐํšŒ (์ฃผ๋กœ ๊ฒ€์ƒ‰, ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์—์„œ ์ •๋ ฌ ํ•„ํ„ฐ-๊ฒ€์ƒ‰์–ด)

3) HTML Form์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก (ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ)

4) HTTP API๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก (ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ + ์„œ๋ฒ„ to ์„œ๋ฒ„, ์•ฑ ํด๋ผ์ด์–ธํŠธ, ์›น ํด๋ผ์ด์–ธํŠธ(Ajax)

 

1) ์ •์  ๋ฐ์ดํ„ฐ ์กฐํšŒ

<์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฏธ์‚ฌ์šฉ>

- GET ๊ฒฝ๋กœ static/star.jpg ๋“ค์–ด๊ฐ€๋ฉด ์„œ๋ฒ„์—์„œ ์ด๋ฏธ์ง€ ์ฐพ์•„์„œ ํด๋ผ์ด์–ธํŠธ์— ๋‚ด๋ ค์คŒ

- ์ด๋ฏธ์ง€, ์ •์ ํ…์ŠคํŠธ ๋ฌธ์„œ 

- ์กฐํšŒ๋Š” GET ์‚ฌ์šฉ

- ์ •์  ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์กฐํšŒ ๊ฐ€๋Šฅ

 

2) ๋™์  ๋ฐ์ดํ„ฐ ์กฐํšŒ

<์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ>

 

์ •๋ฆฌ)

- ์ฃผ๋กœ ๊ฒ€์ƒ‰, ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์—์„œ ์ •๋ ฌ ํ•„ํ„ฐ (๊ฒ€์ƒ‰์–ด)

- ์กฐํšŒ ์กฐ๊ฑด์„ ์ค„์—ฌ์ฃผ๋Š” ํ•„ํ„ฐ, ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์ •๋ ฌ ์กฐ๊ฑด์— ์ฃผ๋กœ ์‚ฌ์šฉ

- ์กฐํšŒ๋Š” GET ์‚ฌ์šฉ

- GET์€ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ

 

3) HTML Form ๋ฐ์ดํ„ฐ ์ „์†ก

<POST ์ „์†ก - ์ €์žฅ>

* POST๋ฉด ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ์ •๋ณด ์ „๋‹ฌ

* ๋งŒ์•ฝ POST๊ฐ€ ์•„๋‹Œ GET์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค๋ฉด?

-> url ๊ฒฝ๋กœ์— ๋„ฃ์–ด์„œ ์ฟผ๋ฆฌ๋กœ ์ „๋‹ฌ

-> /save๋Š” POST ์‚ฌ์šฉํ•ด์•ผํ•จ

-> GET์€ ๋‹จ์ˆœ ์กฐํšŒ์—๋งŒ!!

 

+ ํŒŒ์ผ ์ „์†กํ•  ๋•Œ (multipart/form-data)

์—ฌ๋Ÿฌ type ๋ฐ์ดํ„ฐ (text, file) ์„ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ

์ฃผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ

 

์ •๋ฆฌ)

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๋งŒ ์ง€์›

 

4) HTTP API๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก (ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ + ์„œ๋ฒ„ to ์„œ๋ฒ„, ์•ฑ ํด๋ผ์ด์–ธํŠธ, ์›น ํด๋ผ์ด์–ธํŠธ(Ajax)

<POST ์ „์†ก - ์ €์žฅ>

์ •๋ฆฌ)

์„œ๋ฒ„ to ์„œ๋ฒ„
  - ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ ํ†ต์‹ 

์•ฑ ํด๋ผ์ด์–ธํŠธ
  - ์•„์ดํฐ, ์•ˆ๋“œ๋กœ์ด๋“œ

์›น ํด๋ผ์ด์–ธํŠธ
  - HTML์—์„œ Form ์ „์†ก ๋Œ€์‹  ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ํ†ต์‹ ์— ์‚ฌ์šฉ(AJAX)
    ์˜ˆ) React, VueJs ๊ฐ™์€ ์›น ํด๋ผ์ด์–ธํŠธ์™€ API ํ†ต์‹ 

POST, PUT, PATCH: ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก

GET:
์กฐํšŒ, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ

Content-Type: application/json
์„ ์ฃผ๋กœ ์‚ฌ์šฉ (์‚ฌ์‹ค์ƒ ํ‘œ์ค€)
  - TEXT, XML, JSON ๋“ฑ๋“ฑ

 


2. HTTP API ์„ค๊ณ„ ์˜ˆ์‹œ

1) HTTP API - ์ปฌ๋ ‰์…˜

- POST ๊ธฐ๋ฐ˜ ๋“ฑ๋ก

- ex) ํšŒ์› ๊ด€๋ฆฌ API ์ œ๊ณต

 

2) HTTP API - ์Šคํ† ์–ด

- PUT ๊ธฐ๋ฐ˜ ๋“ฑ๋ก

- ex) ์ •์  ์ปจํ…์ธ  ๊ด€๋ฆฌ, ์›๊ฒฉ ํŒŒ์ผ ๊ด€๋ฆฌ

 

3) HTML FORM ์‚ฌ์šฉ

- ์›น ํŽ˜์ด์ง€ ํšŒ์› ๊ด€๋ฆฌ

- GET, POST๋งŒ ์ง€์›

 

[ํšŒ์› ๊ด€๋ฆฌ ์‹œ์Šคํ…œ]

 

1) API ์„ค๊ณ„ - POST ๊ธฐ๋ฐ˜ ๋“ฑ๋ก

ํšŒ์› ๋ชฉ๋ก /members -> GET
ํšŒ์› ๋“ฑ๋ก /members -> POST
ํšŒ์› ์กฐํšŒ /members/{id} -> GET
ํšŒ์› ์ˆ˜์ • /members/{id} -> PATCH > PUT > POST
* ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •ํ• ๋• PUT์ด ์ข‹์„ ์ˆ˜๋„
ํšŒ์› ์‚ญ์ œ /members/{id} -> DELETE

 

POST (์‹ ๊ทœ ์ž์› ๋“ฑ๋ก ํŠน์ง•)

- ํด๋ผ์ด์–ธํŠธ๋Š” ๋“ฑ๋ก๋  ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ๋ชจ๋ฆ„

   ํšŒ์›๋“ฑ๋ก /members -> POST

   POST/members

- ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กœ ๋“ฑ๋ก๋œ ๋ฆฌ์†Œ์Šค URI๋ฅผ ์ƒ์„ฑํ•ด์คŒ

   HTTP/1.1 201 Created Location: /members/100

- ์ปฌ๋ ‰์…˜ (Collections) 

   ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ

   ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ

   ์—ฌ๊ธฐ์„œ ์ปฌ๋ ‰์…˜์€ /members

 

2) API ์„ค๊ณ„ - PUT ๊ธฐ๋ฐ˜ ๋“ฑ๋ก

ํŒŒ์ผ ๋ชฉ๋ก /files -> GET
ํŒŒ์ผ ์กฐํšŒ /files/{filename} -> GET
ํŒŒ์ผ ๋“ฑ๋ก /files/{filename} -> PUT
ํŒŒ์ผ ์‚ญ์ œ /files/{filename} -> DELETE
ํŒŒ์ผ ๋Œ€๋Ÿ‰ ๋“ฑ๋ก /files -> POST

 

 PUT (์‹ ๊ทœ ์ž์› ๋“ฑ๋ก ํŠน์ง•)

- ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค URI๋ฅผ ์•Œ๊ณ ์žˆ์–ด์•ผ ํ•จ

   ํŒŒ์ผ ๋“ฑ๋ก / files/{filename} -> PUT

   PUT /files/star.jpg

- ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์ง€์ •

- ์Šคํ† ์–ด (store)

   ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ €์žฅ์†Œ

   ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์•Œ๊ณ  ๊ด€๋ฆฌ

   ์—ฌ๊ธฐ์„œ ์Šคํ† ์–ด๋Š” /files

 

* ๋Œ€๋ถ€๋ถ„ POST๊ธฐ๋ฐ˜ / PUT ๋น„์ค‘ ๋‚ฎ์Œ

 

3) HTML FORM ์‚ฌ์šฉ

- HTML FORM์€ GET, POST๋งŒ ์ง€์›

- AJAX๊ฐ™์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ -> ํšŒ์› API ์ฐธ๊ณ 

- ์—ฌ๊ธฐ์„œ๋Š” ์ˆœ์ˆ˜ HTML, HTML FORM

- GET, POST๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์ œ์•ฝ์žˆ์Œ

 

API ์„ค๊ณ„ - HTML FORM

ํšŒ์› ๋ชฉ๋ก /members -> GET
ํšŒ์› ๋“ฑ๋ก ํผ /members/new -> GET
ํšŒ์› ๋“ฑ๋ก /members/new, /members -> POST
ํšŒ์› ์กฐํšŒ /members/{id} -> GET
ํšŒ์› ์ˆ˜์ • ํผ /members/{id]/edit -> GET
ํšŒ์› ์ˆ˜์ • /members/{id}/edit, /members/{id} -> POST
ํšŒ์› ์‚ญ์ œ /members/{id}/delete -> POST

* ๋“ฑ๋ก ํผ๊ณผ ๋“ฑ๋ก ๊ฐ™์ด /new๋กœ ํ•˜๋Š” ์ด์œ  -> ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ POST ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ํšŒ์›๊ฒฐ๊ณผ ํผ์œผ๋กœ ๋‹ค์‹œ ๋ณด๋‚ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ™์œผ๋ฉด ๋‹ค์‹œ ํผ์œผ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Œ

 

- GET, POST๋งŒ ์ง€์›

- ์ปจํŠธ๋กค URI

   GET, POST๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ฝ์ด ์žˆ์Œ

   ์ด๋Ÿฐ ์ œ์•ฝ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋™์‚ฌ๋กœ ๋œ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ ์‚ฌ์šฉ

   POST์˜ /new, /edit, /delete๊ฐ€ ์ปจํŠธ๋กค URI

   HTTP ๋ฉ”์„œ๋“œ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ (HTTP API ํฌํ•จ)

 

[์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์€ URI ์„ค๊ณ„ ๊ฐœ๋…] : https://restfulapi.net/resource-naming

1) ๋ฌธ์„œ(document)
  ๋‹จ์ผ ๊ฐœ๋…(ํŒŒ์ผ ํ•˜๋‚˜, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค row)
  ์˜ˆ) /members/100, /files/star.jpg 

2) ์ปฌ๋ ‰์…˜(collection)
  ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ
  ์˜ˆ) /members

3) ์Šคํ† ์–ด(store)
  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž์› ์ €์žฅ์†Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์•Œ๊ณ  ๊ด€๋ฆฌ
  ์˜ˆ) /files

4) ์ปจํŠธ๋กค๋Ÿฌ(controller), ์ปจํŠธ๋กค URI
  ๋ฌธ์„œ, ์ปฌ๋ ‰์…˜, ์Šคํ† ์–ด๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ์ถ”๊ฐ€ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ๋™์‚ฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ
  ์˜ˆ) /members/{id}/delete

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ