์›น ์„œ๋น„์Šค

HTTP ๋ฉ”์„œ๋“œ ํ™œ์šฉ

alswlfl 2022. 12. 1. 00:19

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

๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐฉ์‹

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

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

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

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

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

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

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

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

  • ์ฃผ๋กœ ๊ฒ€์ƒ‰, ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์—์„œ ์ •๋ ฌ ํ•„ํ„ฐ(๊ฒ€์ƒ‰์–ด)
  • ์กฐํšŒ ์กฐ๊ฑด์„ ์ค„์—ฌ์ฃผ๋Š” ํ•„ํ„ฐ, ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์ •๋ ฌ ์กฐ๊ฑด์— ์ฃผ๋กœ ์‚ฌ์šฉ
  • ์กฐํšŒ๋Š” GET ์‚ฌ์šฉ
  • GET์€ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  • GET๋„ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ ๋„ฃ์–ด์„œ ์ „์†กํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค๋ฌด์—์„œ๋Š” ๊ถŒ์žฅ ์•ˆํ•จ

3. HTML Form์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

  • ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
  • ex) ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒ์„ฑํ•œ ์š”์ฒญ HTTP ๋ฉ”์‹œ์ง€
POST /save HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded

username=kim&age=20

โ—๏ธ ์ฃผ์˜: GET์€ ์กฐํšŒ์—๋งŒ ์‚ฌ์šฉ! ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณณ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ

  • multipart/form-data: ์ฃผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ
  • HTML Form submit์‹œ POST ์ „์†ก
    • ex) ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
  • 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
    • ํŒŒ์ผ ์—…๋กœ๋“œ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ ์ „์†ก ์‹œ ์‚ฌ์šฉ
    • ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์—ฌ๋Ÿฌ ํŒŒ์ผ๊ณผ ํผ์˜ ๋‚ด์šฉ ํ•จ๊ป˜ ์ „์†ก ๊ฐ€๋Šฅ
  • ์ฐธ๊ณ : HTML Form์ „์†ก์€ GET, POST๋งŒ ์ง€์›

4. HTTP API๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก

  • ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
  • ์„œ๋ฒ„ to ์„œ๋ฒ„
    • ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ ํ†ต์‹ 
  • ์•ฑ ํด๋ผ์ด์–ธํŠธ
    • ์•„์ดํฐ, ์•ˆ๋“œ๋กœ์ด๋“œ
  • ์›น ํด๋ผ์ด์–ธํŠธ(Ajax)
    • HTML์—์„œ Form ์ „์†ก ๋Œ€์‹  ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ํ†ต์‹ ์— ์‚ฌ์šฉ(AJAX)
    • ์˜ˆ) React, Vue.js ๊ฐ™์€ ์›น ํด๋ผ์ด์–ธํŠธ์™€ API ํ†ต์‹ 
  • POST, PUT, PATCH: ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „์†ก
  • GET: ์กฐํšŒ, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
  • Content-Type: application/json์„ ์ฃผ๋กœ ์‚ฌ์šฉ(์‚ฌ์‹ค์ƒ ํ‘œ์ค€)
    • TEXT, XML, JSON ๋“ฑ๋“ฑ

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

  • HTTP API - ์ปฌ๋ ‰์…˜
    • POST ๊ธฐ๋ฐ˜ ๋“ฑ๋ก
    • ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค URI ๊ฒฐ์ •
    • ์˜ˆ) ํšŒ์› ๊ด€๋ฆฌ API ์ œ๊ณต
  • HTTP API - ์Šคํ† ์–ด
    • PUT ๊ธฐ๋ฐ˜ ๋“ฑ๋ก
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค URI ๊ฒฐ์ •
    • ์˜ˆ) ์ •์  ์ปจํ…์ธ  ๊ด€๋ฆฌ, ์›๊ฒฉ ํŒŒ์ผ ๊ด€๋ฆฌ
  • HTML FORM ์‚ฌ์šฉ
    • ์›น ํŽ˜์ด์ง€ ํšŒ์› ๊ด€๋ฆฌ
    • GET, POST ๋งŒ ์ง€์›
    • ์ˆœ์ˆ˜ HTML+HTML form ์‚ฌ์šฉ

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

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

  • ํšŒ์› ๋ชฉ๋ก /members -> GET
  • ํšŒ์› ๋“ฑ๋ก /members -> POST
  • ํšŒ์› ์กฐํšŒ /memers/{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
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์ง€์ •
  • ์Šคํ† ์–ด(Store)
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์ €์žฅ์†Œ
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์•Œ๊ณ  ๊ด€๋ฆฌ
    • ์—ฌ๊ธฐ์„œ ์Šคํ† ์–ด๋Š” /files

๋Œ€๋ถ€๋ถ„ POST ๊ธฐ๋ฐ˜์˜ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ

HTML FORM ์‚ฌ์šฉ

  • HTML FROM์€ GET, POST๋งŒ ์ง€์›
  • AJAX ๊ฐ™์€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ -> ํšŒ์› API ์ฐธ๊ณ 
  • ์—ฌ๊ธฐ์„œ๋Š” ์ˆœ์ˆ˜ HTML, HTML FROM ์ด์•ผ๊ธฐ
  • GET, POST๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์ œ์•ฝ์ด ์žˆ์Œ
  • ์ปจํŠธ๋กค URI
    • GET, POST๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์ œ์•ฝ์ด ์žˆ์Œ
    • ์ด๋Ÿฐ ์ œ์•ฝ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋™์‚ฌ๋กœ ๋œ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ ์‚ฌ์šฉ
    • POST์˜ /new, /edit, /delete๊ฐ€ ์ปจํŠธ๋กค URI
    • HTTP ๋ฉ”์„œ๋“œ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ(HTTP API ํฌํ•จ)
  • ํšŒ์› ๋ชฉ๋ก /members -> GET
  • ํšŒ์› ๋“ฑ๋ก ํผ /members/new -> GET
  • ํšŒ์› ๋“ฑ๋ก /members/new, /members -> POST
  • ํผ์€ GET์œผ๋กœ ๋‚˜์˜ค๊ณ , ๋“ฑ๋ก์€ GET๊ณผ ๊ฐ™์€ URL์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ POSTํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•จ(๋‘ ๊ฐœ์˜ ๊ฒฝ๋กœ ๋งž์ถฐ๋†“์œผ๋ฉด ๊น”๋”ํ•˜๊ฒŒ ์ด๋™ ๊ฐ€๋Šฅ)
  • ํšŒ์› ์กฐํšŒ /members/{id} -> GET
  • ํšŒ์› ์ˆ˜์ • ํผ /members/{id}/edit -> GET
  • ํšŒ์› ์ˆ˜์ • /members/{id}/edit, /members/{id} -> POST
  • ํšŒ์› ์‚ญ์ œ /members/{id}/delete -> POST

โญ๏ธ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์€ URI ์„ค๊ณ„ ๊ฐœ๋…

https://restfulapi.net/resource-naming/ 

 

REST Resource Naming Guide

In REST, having a strong and consistent REST resource naming strategy – will prove one of the best design decisions in the long term.

restfulapi.net

  • ๋ฌธ์„œ(document)
    • ๋‹จ์ผ ๊ฐœ๋…(ํŒŒ์ผ ํ•˜๋‚˜, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค row)
    •  ์˜ˆ) /members/100, files/start.jpg
  • ์ปฌ๋ ‰์…˜(collection)
    • ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ
    • ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌ
    • ์˜ˆ) /members
  • ์Šคํ† ์–ด(store)
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์ž์› ์ €์žฅ์†Œ
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์•Œ๊ณ  ๊ด€๋ฆฌ
    • ์˜ˆ) /files
  • ์ปจํŠธ๋กค๋Ÿฌ(controller), ์ปจํŠธ๋กค URI
    • ๋ฌธ์„œ, ์ปฌ๋ ‰์…˜, ์Šคํ† ์–ด๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ์ถ”๊ฐ€ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰
    • ๋™์‚ฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ
    • ์˜ˆ) /members/{id}/delete