๐Ÿ›ณ DevOps/๐Ÿ“ก Network

HTTP ๋ฉ”์„œ๋“œ

DevPoong 2022. 7. 14. 22:44

1. HTTP ๋ฉ”์„œ๋“œ๋ž€?

ํด๋ผ์ด์–ธํŠธ๊ฐ€  ์‚ฌ์šฉ์ž ์š”์ฒญ์˜ ๋ชฉ์ ์ด๋‚˜ ์ข…๋ฅ˜๋ฅผ ์›น ์„œ๋ฒ„์—๊ฒŒ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

2. HTTP ๋ฉ”์„œ๋“œ ์ข…๋ฅ˜

  • GET: ๋ฆฌ์†Œ์Šค ์กฐํšŒ
  • POST: ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ. ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ฃผ๋กœ ๋“ฑ๋ก์— ์‚ฌ์šฉ
  • PUT: ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์™„์ „ํžˆ ๋Œ€์ฒด
  • PATCH: ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ณ€๊ฒฝ
  • DELETE: ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œ

 


 

1. GET

  • ์„œ๋ฒ„์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ๋Š” Query Prameter, Query String์„ ํ†ตํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค.
  • Message Body๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„๊ฐ€ ๋งŽ์•„์„œ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2. POST

  • Message Body๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„๋กœ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  • ์„œ๋ฒ„์—์„œ๋Š” ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฃผ๋กœ ์‹ ๊ทœ ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก, ํ”„๋กœ์„ธ์Šค ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์€ ์ฆ‰ URI์— POST ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€๋Š” ๋ฆฌ์†Œ์Šค๋งˆ๋‹ค ๋”ฐ๋กœ ๋‚ด๊ฐ€ ์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • POST๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋“ฑ๋ก๋  ๋ฆฌ์†Œ์Šค์˜ URI ์œ„์น˜๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  POST ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กœ ๋“ฑ๋ก๋œ ๋ฆฌ์†Œ์Šค URI๋ฅผ ์ƒ์„ฑํ•ด์„œ ์•Œ๋ ค์ค€๋‹ค.
    • ์ปฌ๋ ‰์…˜(Collection): ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ๋งŒ์•ฝ์— /members์˜ post ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด /members๊ฐ€ ์ปฌ๋ ‰์…˜์ด ๋œ๋‹ค. 

 

  • 1. ์ƒˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ
  • 2. ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
    • ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ ๋˜๋Š” ๋ณ€๊ฒฝํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
      • ์˜ˆ์‹œ) ์ฃผ๋ฌธ์—์„œ ๊ฒฐ์ œ์™„๋ฃŒ -> ๋ฐฐ๋‹ฌ ์‹œ์ž‘์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ ๊ฐ’ ๋ณ€๊ฒฝ์„ ๋„˜์–ด ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ
    • ์—ฌ๊ธฐ์„œ POST์˜ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ž€ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • 3. ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์• ๋งคํ•œ ๊ฒฝ์šฐ์—
    • Message Body๋ฅผ ํ†ตํ•ด ์กฐํšŒ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ณ  ์‹ถ์€๋ฐ GET ๋ฉ”์„œ๋“œ๋Š” Message Body๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ POST๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ฐธ๊ณ ) ์ปจํŠธ๋กค URI

์ด์ „ ํฌ์ŠคํŒ…์—์„œ URI ์„ค๊ณ„๋ฅผ ํ•  ๋•Œ ํ–‰์œ„๋Š” ์šฐ์„  ๋ฐฐ์ œํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋งŒ ์‹๋ณ„ํ•˜์—ฌ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ด๊ฒŒ ํ•ญ์ƒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค.

์œ„์˜ ๊ฒฐ์ œ์™„๋ฃŒ์—์„œ ๋ฐฐ๋‹ฌ ์‹œ์ž‘์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” POST ์š”์ฒญ์—์„œ๋Š” URI๋ฅผ /orders/{orderId}/start-delivery์™€ ๊ฐ™์ด ํ–‰์œ„๋ฅผ URI์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ปจํŠธ๋กค URI๋กœ ์„ค๊ณ„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. 

๋˜๋Š” HTML Form์€ GET, POST๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ ์ œ์•ฝ์ด ์ƒ๊ธธ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ด๋Ÿฐ ์ œ์•ฝ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋™์‚ฌ๋กœ ๋œ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์˜ˆ์‹œ๋กœ POST: /members/{id}/delete ์ฒ˜๋Ÿผ ์–ด์ฉ”์ˆ˜ ์—†์ด delete๋ผ๋Š” ๋™์‚ฌ๋ฅผ URI์— ์ถ”๊ฐ€ํ•œ๋‹ค. 

 

3. PUT

  • ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์™„์ „ํžˆ ๋Œ€์ฒดํ•˜๊ณ  ์—†์œผ๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•œ๋‹ค.
  • POST๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค ์œ„์น˜๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์ƒˆ๋กœ ๋“ฑ๋ก๋œ ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์ƒ์„ฑํ•ด์„œ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š”๋ฐ PUT์€ /members/100์ฒ˜๋Ÿผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค ์œ„์น˜๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  URI๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

4. PATCH

  • ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์„œ๋ฒ„๊ฐ€ ์กด์žฌํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ ํ™•์ธํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋˜์ง€ POST๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

 

5. DELETE

  • ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

HTTP ๋ฉ”์„œ๋“œ์˜ ์†์„ฑ

  • ์•ˆ์ „ (Safe Methods)
  • ๋ฉฑ๋“ฑ (Idempotent Methods)
  • ์บ์‹œ ๊ฐ€๋Šฅ (Chacheable Methods)

 

1. ์•ˆ์ „

  • ํ˜ธ์ถœํ•ด๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • GET์€ ์•ˆ์ „ํ•˜์ง€๋งŒ ๊ทธ๊ฑธ ์ œ์™ธํ•œ POST, PUT, PATCH, DELETE๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.
  • ์•ˆ์ „์€ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š”์ง€๋งŒ ๊ณ ๋ คํ•œ๋‹ค.

 

2. ๋ฉฑ๋“ฑ 

  • ๋™์ผํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋– ํ•œ ์š”์ฒญ์„ ํ•œ ๋ฒˆ ํ˜ธ์ถœํ•˜๋“  ๋ช‡ ๋ฒˆ์„ ํ˜ธ์ถœํ•˜๋“  ๊ฒฐ๊ณผ๊ฐ€ ๋™์ผํ•˜๋‹ค.
  • ์™ธ๋ถ€ ์š”์ธ์œผ๋กœ ์ธํ•ด ์ค‘๊ฐ„์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ๊นŒ์ง€๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • GET, DELETE๋Š” ๋‹น์—ฐํžˆ ๋ฉฑ๋“ฑํ•  ๊ฒƒ์ด๊ณ  PUT์€ ์™œ ๋ฉฑ๋“ฑํ•˜๋ƒ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ž‘์—…์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•ด๋„ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. POST๋Š” ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ™์€ ์ฃผ๋ฌธ์ด ์—ฌ๋Ÿฌ๋ฒˆ ์ค‘๋ณตํ•ด์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉฑ๋“ฑ์ด ์•„๋‹ˆ๋‹ค.
  • ์ •๋ฆฌํ•˜์ž๋ฉด
    • GET, PUT, DELETE : ๋ฉฑ๋“ฑO
    • POST: ๋ฉฑ๋“ฑX
  • ์–ด๋””์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜?
    • ์ž๋™ ๋ณต๊ตฌ ๋งค์ปค๋‹ˆ์ฆ˜
    • ์„œ๋ฒ„๊ฐ€ ์ •์ƒ ์‘๋‹ต์„ ๋ชป์ฃผ์—ˆ์„ ๋•Œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ™•์‹คํžˆ ํ•˜๋ ค๊ณ  ๊ฐ™์€ ์š”์ฒญ์„ ๋‹ค์‹œ ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ํ•ด๋„ ๋˜๋Š”์ง€ ํŒ๋‹จ ๊ทผ๊ฑฐ๊ฐ€ ๋จ

3. ์บ์‹œ ๊ฐ€๋Šฅ

  • ์‘๋‹ต ๊ฒฐ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹œํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  • GET, HEAD, POST, PATCH๋Š” ์บ์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ•˜์ง€๋งŒ, ์บ์‹œ ํ•˜๋ ค๋ฉด ๋ฐ”๋”” ๋‚ด์šฉ๊นŒ์ง€ ์บ์‹œ ํ‚ค๋กœ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š”๋ฐ POST, PATCH ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ตฌํ˜„์ด ์‰ฝ์ง€ ์•Š๋‹ค.
  • ๋”ฐ๋ผ์„œ, ์‹ค์ œ๋กœ๋Š” GET, HEAD ๋งŒ ์บ์‹œ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. GET์€ URI๋งŒ ์žก๊ณ  ์บ์‹œํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ

 


์ฐธ๊ณ  URI ์„ค๊ณ„ ๊ฐœ๋…

1. ๋ฌธ์„œ(document)

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

2. ์ปฌ๋ ‰์…˜(collection)

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

3. ์Šคํ† ์–ด(store)

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

4. ์ปจํŠธ๋กค๋Ÿฌ(controller), ์ปจํŠธ๋กค URI

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

์ฐธ๊ณ : https://restfulapi.net/resource-naming