yeon's blog

[HTTP ์›น ๊ธฐ๋ณธ ์ง€์‹] HTTP ๋ฉ”์„œ๋“œ ํ™œ์šฉ - ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ณธ๋ฌธ

HTTP

[HTTP ์›น ๊ธฐ๋ณธ ์ง€์‹] HTTP ๋ฉ”์„œ๋“œ ํ™œ์šฉ - ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก

yeonii 2023. 12. 3. 17:59

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

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

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

์ฃผ๋กœ GET ๋ฐฉ์‹์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ๊ฒ€์ƒ‰์–ด๋กœ ๊ฒ€์ƒ‰ํ•  ๋•Œ, ๊ฒŒ์‹œํŒ ๋ฆฌ์ŠคํŠธ์— ์ •๋ ฌ ์กฐ๊ฑด์„ ๋„ฃ์„ ๋•Œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

 

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

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

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ „์†กํ•  ๋•Œ HTTP ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. POST, PUT, PATCH ๋ฐฉ์‹์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค๋ฉด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์ „์†กํ•  ๋•Œ 4๊ฐ€์ง€ ์ƒํ™ฉ

1. ์ •์  ๋ฐ์ดํ„ฐ ์กฐํšŒ - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฏธ์‚ฌ์šฉ

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

ํด๋ผ์ด์–ธํŠธ์—์„œ /static/star.jpg ๋ฅผ ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ์„œ๋ฒ„์—์„œ star ์ด๋ฏธ์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•ด์ค€๋‹ค. ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” ์ด๋ฏธ์ง€๋‚˜ ์ •์  ํ…์ŠคํŠธ ๋ฌธ์„œ๋กœ ์กฐํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— GET์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ๋‹จ์ˆœํ•œ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋กœ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

2. ๋™์  ๋ฐ์ดํ„ฐ ์กฐํšŒ - ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ์‚ฌ์šฉ

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

๊ตฌ๊ธ€์—์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ ๊ฒ€์ƒ‰์–ด๋‚˜ ์ถ”๊ฐ€ ์กฐ๊ฑด์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญํ•œ๋‹ค. ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์„œ๋ฒ„์—์„œ key์™€ value๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฑฐ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•œ๋‹ค. ์ฃผ๋กœ ๊ฒ€์ƒ‰์„ ํ•˜๊ฑฐ๋‚˜ ๊ฒŒ์‹œํŒ ๋ชฉ๋ก์—์„œ ์ •๋ ฌํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐํ•  ๋•Œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋“ค์ด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์š”์ฒญํ•œ๋‹ค. ์กฐํšŒ ์กฐ๊ฑด์„ ์ค„์—ฌ์ฃผ๋Š” ํ•„ํ„ฐ ๋‹ค์Œ์— ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•˜๋Š” ์ •๋ ฌ ์กฐ๊ฑด์— ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ๋„ ์กฐํšŒ๋ผ GET ๋ฐฉ์‹์œผ๋กœ ์ด์šฉํ•ด์„œ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•œ๋‹ค.

 

 

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

1) POST ์ „์†ก์˜ ์ €์žฅ

form ํƒœ๊ทธ์—์„œ action์€ /save, POST ๋ฉ”์„œ๋“œ, username ํผ๊ณผ age ํผ, ์ „์†ก ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด์„œ ์ „์†ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์„œ HTTP ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ž‘ ์œ ์‚ฌํ•˜๊ฒŒ key์™€ value ์Šคํƒ€์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ HTTP ๋ฐ”๋”” ๋ฉ”์‹œ์ง€์— ๋„ฃ๊ณ  POST ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„์— ์ „์†ก์„ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ์„ ํ•œ๋‹ค.

 

2) GET ์ „์†ก์˜ ์ €์žฅ

form์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ ์ „์†กํ•  ๋•Œ GET ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด GET์€ ๋ฉ”์‹œ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์„œ๋ฒ„์— ์ „๋‹ฌํ•œ๋‹ค. save ๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ GET ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. GET์€ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

3) GET์ „์†ก์˜ ์กฐํšŒ

form์„ ํ†ตํ•ด์„œ GET ๋ฐฉ์‹์œผ๋กœ HTTP ๋ฉ”์‹œ์ง€์— username์ด ๊น€์ด๊ณ  age๊ฐ€ 20์‚ด ์‚ฌ๋žŒ์„ ๋ฆฌ์ŠคํŠธ์—์„œ ํ•„ํ„ฐ๋ง์„ ๋‹ด์•„์„œ ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค.

 

4) multipart/form-data

๋ฉ”์‹œ์ง€ ๋ฐ”๋””์— username๊ณผ age๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฐ”์ดํŠธ๋กœ ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ๊นŒ์ง€ POST ๋ฉ”์„œ๋“œ๋กœ ์ „์†กํ•œ๋‹ค. Content-type์€ multipart/form-data ๋ฐ์ดํ„ฐ๋กœ ๋“ค์–ด๊ฐ€๊ณ  boundary๋Š” ์›น์œผ๋กœ ์ž๋™ ์ƒ์„ฑํ•ด์„œ ๊ฒฝ๊ณ„๋กœ ๋‚˜๋ˆ ์ง„๋‹ค.

 

HTML Form์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ์ •๋ฆฌ

  • HTML Form submit ์‹œ POST ์ „์†ก
    • ์˜ˆ) ํšŒ์› ๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ
  • Context-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 ๋ฐ์ดํ„ฐ ์ „์†ก

ํด๋ผ์ด์–ธํŠธ์—์„œ HTTP API๋กœ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ ์ „์†กํ•˜๋ฉด ๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์— /members๊ฐ€ ์žˆ๊ณ  Content-Type์— application/json์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์†กํ•˜๋ฉด ๋œ๋‹ค.

 

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