GiantStepDEV
article thumbnail

HTTP(HyperText Transfer Protocol)

  • ์ธํ„ฐ๋„ท์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ฃผ๋กœ HTML, CSS, JavaScript, ์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „์†กํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • HTTP๋Š” ์š”์ฒญ(Request)๊ณผ ์‘๋‹ต(Response)์˜ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•˜๊ณ , ์„œ๋ฒ„๋Š” ์ด์— ๋Œ€ํ•œ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ๊ณผ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋Š” ํ—ค๋”์™€ ๋ฐ”๋””๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋”์—๋Š” ์š”์ฒญ ํ˜น์€ ์‘๋‹ต์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ๋ฐ”๋””์—๋Š” ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›์•„์•ผ๋งŒ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP๋Š” ๋ณด์•ˆ์ ์ธ ์ด์œ ๋กœ HTTPS(HTTP Secure)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. SSL(Secure Sockets Layer) ๋˜๋Š” TLS(Transport Layer Security)๋ฅผ ์ด์šฉํ•˜์—ฌ ํ†ต์‹  ๋‚ด์šฉ์„ ์•”ํ˜ธํ™”ํ•˜๋ฏ€๋กœ, ์ œ 3์ž๊ฐ€ ์ค‘๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋กœ์ฑ„๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP๋Š” ์›น ์„œ๋ฒ„์™€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋น„๋กฏํ•œ ๋‹ค์–‘ํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ RESTful API, ์›น ์„œ๋น„์Šค ๋“ฑ์—์„œ๋„ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ตœ๊ทผ์—๋Š” ์›น ์†Œ์ผ“(Web Socket)์ด๋ผ๋Š” ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

ํ†ต์‹  ๋ฐฉ์‹

HTTP ํ†ต์‹ ์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ํ†ต์‹  ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ HTTP ํ†ต์‹  ๋ฐฉ์‹์—๋Š” ํฌ๊ฒŒ GET๊ณผ POST ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์™ธ์—๋„ PUT, DELETE, PATCH, OPTIONS ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ฃผ๋กœ RESTful API์—์„œ ์‚ฌ์šฉ ๋ฉ๋‹ˆ๋‹ค.

GET ๋ฐฉ์‹

  • GET ๋ฐฉ์‹์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. URL์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์†กํ•˜๋ฉฐ, ๋ณดํ†ต ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ฃผ์†Œ์ฐฝ์— URL์„ ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • GET ๋ฐฉ์‹์€ ์š”์ฒญ ์ •๋ณด๋ฅผ URL์— ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๊ฐ™์€ ์š”์ฒญ์„ ๋ฐ˜๋ณตํ•ด์„œ ๋ณด๋‚ผ ๋•Œ, ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ณด์•ˆ์„ฑ์ด ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ฐœ์ธ ์ •๋ณด ๋“ฑ์„ ์ „์†กํ•  ๋•Œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

POST ๋ฐฉ์‹

  • POST ๋ฐฉ์‹์€ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. HTML form ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ์ „์†ก ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • POST ๋ฐฉ์‹์€ ์š”์ฒญ ์ •๋ณด๋ฅผ URL์— ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, GET ๋ฐฉ์‹๋ณด๋‹ค ๋ณด์•ˆ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ๊ฐœ์ธ ์ •๋ณด ๋“ฑ์„ ์ „์†กํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํ†ต์‹ 

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ๋•Œ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„์—์„œ HTTP ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ์„ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ , ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HTTP ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” XMLHttpRequest ๊ฐ์ฒด๋‚˜ Fetch API๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์„ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์„ ๋ฐ›์•˜์„ ๋•Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ ๋ฉ”์‹œ์ง€


1. Ajax(Asynchronous JavaScript and XML)

  • JavaScript๋ฅผ ์ด์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ธฐ์ˆ  ์ž…๋‹ˆ๋‹ค.
  • Ajax๋ฅผ ์ด์šฉํ•˜๋ฉด ์›น ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Ajax๋Š” XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์— ๋น„๋™๊ธฐ์ ์œผ๋กœ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์—์„œ ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ํ™”๋ฉด์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ 

  • ์›น ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ ๋„, ์›น ํŽ˜์ด์ง€์˜ ์ผ๋ถ€๋ถ„๋งŒ์„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›น ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„์— ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›น ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋œ ํ›„์— ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์˜์—ญ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ 

  • Ajax๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ํด๋ง ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์„œ๋ฒ„ ํ‘ธ์‹œ ๋ฐฉ์‹์˜ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค๋Š” ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Ajax๋กœ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Ajax ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ Ajax ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ์˜ PC๋กœ Ajax ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

XMLHttpRequest ๊ฐ์ฒด

Ajax์˜ ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” XMLHttpRequest ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ์ฒด๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘ฉ‍๐Ÿ’ป ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ณ„์†ํ•ด์„œ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋ฐ”๋กœ ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘ฉ‍๐Ÿ’ป ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๊ณ ์นจํ•˜์ง€ ์•Š์•„๋„ URL์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์ฒ˜๋ฆฌ์˜ ํ๋ฆ„

  1. XMLHttpRequest ๊ฐ์ฒด ์ƒ์„ฑ
  2. ์š”์ฒญ ์ „์†ก
  3. ์‘๋‹ต ์ฒ˜๋ฆฌ

1๏ธโƒฃ ๊ฐ์ฒด ์ƒ์„ฑ

XMLHttpRequest ๊ฐ์ฒด๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” Web API์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋งŒ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘๋ฉ๋‹ˆ๋‹ค.

(node.js ํ™˜๊ฒฝ์—์„œ๋Š” ์ œ๊ณต X)

const xhr = new XMLHttpRequest();

2๏ธโƒฃ ์š”์ฒญ ์ „์†ก

ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” HTTP Method, ์š”์ฒญ URL์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

(XMLHttpRequest์˜ ๋‚ด์žฅ ํ•จ์ˆ˜์ธ open()์„ ์ด์šฉ)

xhr.open('HTTP Method', '/์„œ๋ฒ„ ์ฃผ์†Œ', ๋น„๋™๊ธฐ ์—ฌ๋ถ€(boolean));
// HTTP Method
// (1) GET(์š”์ฒญํ•  ๋•Œ(๋‹จ์ˆœ ์กฐํšŒ, ๊ฒฝ๋กœ๊ฐ€ ๋“œ๋Ÿฌ๋‚จ))
// (2) POST(์„ธํŒ…ํ•  ๋•Œ(ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๋“ฑ), ๊ฒฝ๋กœ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์Œ)

// ์„œ๋ฒ„ ์ฃผ์†Œ : IP์ฃผ์†Œ, port๋ฒˆํ˜ธ, ๋ฐฑ์—”๋“œ๊ฐ€ ์ˆ˜์‹ ํ•  ์ปจํŠธ๋กค๋Ÿฌ
// ์ง‘ ์ฃผ์†Œ(==ip์ฃผ์†Œ)์— ์‚ฌ๋Š” ๋ˆ„๊ตฌ(==port๋ฒˆํ˜ธ)์•ผ, ์ด๋Ÿฐ ์ผ์„ ํ•ด!(์ปจํŠธ๋กค๋Ÿฌ)

๐Ÿ’ก๋น„๋™๊ธฐ ์—ฌ๋ถ€(๊ธฐ๋ณธ ๊ฐ’ true)

open() ํ•จ์ˆ˜์—์„œ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” HTTP Method, ์ฆ‰ HTTP ์š”์ฒญ ๋ฐฉ์‹ ์ž…๋‹ˆ๋‹ค.

๐Ÿ’กDB์˜ CRUD์™€ ์œ ์‚ฌํ•œ..?!


ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ HTTP ์š”์ฒญ์„ ํ•˜๊ธฐ ์ „์— ์š”์ฒญ์— ๋งž๋Š” ํ—ค๋”๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

setRequestHeader() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์š”์ฒญ ํ—ค๋” ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญํ•  ๋•Œ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

xhr.setRequestHeader('content-type','application/json');

๐Ÿ‘‰ open() ํ•จ์ˆ˜์™€ setRequestHeader() ํ•จ์ˆ˜๋กœ ์š”์ฒญ์— ํ•„์š”ํ•œ ์ •์˜๊ฐ€ ๋๋‚˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ send() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

const xhr = new XMLHttpRequest(); // XMLHttpRequest ๊ฐ์ฒด ์ƒ์„ฑ
xhr.open("POST", "/posts"); // HTTP Method, URL ์ •์˜
xhr.setRequestHeader("content-type", "application/json"); // ํ—ค๋”๊ฐ’์˜ content-type ์ •์˜

const data = {
    id : 100,
    title :"XMLHttpRequest ์ „์†กํ•˜๊ธฐ",
    author : "ํ™๊ธธ๋™"
};

xhr.send(JSON.stringify(data)); // JSON.stringify๋ฅผ ํ†ตํ•ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์ „์†ก

3๏ธโƒฃ ์‘๋‹ต ์ฒ˜๋ฆฌ

ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „์†กํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์š”์ฒญํ•œ ๊ฒฐ๊ณผ๋ฅผ ์‘๋‹ต ํ•ฉ๋‹ˆ๋‹ค!!


๐Ÿ›œ ํ…Œ์ŠคํŠธ

JSONPlaceHolder(https://json-placeholder.typicode.com/)์€ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” JSON ๋ฐ์ดํ„ฐ API ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” JSON ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

์ด ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์€ REST API๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ฑฐ๋‚˜ ํ”„๋กœํ†  ํƒ€์ž…์„ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™” ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชฉ์ ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

JSONPlaceHolder์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณต ํ•ฉ๋‹ˆ๋‹ค.

  • /posts
  • /comments
  • /albums
  • /photos
  • /todos
  • /users

์œ„ ํ…Œ์ŠคํŠธ ์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

// XMLHttpRequest()๋Š” ํƒ€์ž„ ์•„์›ƒ ๊ฑธ ๋•Œ๊ฐ€ ์—†์–ด์„œ ์„œ๋ฒ„์—์„œ ์‘๋‹ต ์—†์œผ๋ฉด ๋ฌดํ•œ๋Œ€๊ธฐ ๊ฑธ๋ ค๋ฒ„๋ฆฌ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.)
const xhr = new XMLHttpRequest(); // XMLHttpRequest ๊ฐ์ฒด ์ƒ์„ฑ
xhr.open("POST", "https://jsonplaceholder.typicode.com/posts"); // HTTP Method, URI
xhr.setRequestHeader("content-type", "application/json"); // ํ—ค๋” ๊ฐ’ content-type ์ •์˜
const data = {
  // ์•„๋ž˜ ๋ณ€์ˆ˜๋“ค์€ ์ถ”ํ›„์—๋Š” input์—์„œ ๋ฐ›์•„์˜จ ๊ฐ’(~.value)์ด ๋“ค์–ด๊ฐ.
  id : "test1",
  pwd : "test!@#$1",
  name : "ํ™๊ธธ๋™",
  addr : "์„œ์šธ์‹œ ๊ฐ•๋‚จ๊ตฌ" 
}
xhr.send(JSON.stringify(data)); // XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋กœ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฉ”์†Œ๋“œ
// GET์€ open()์— ์ •๋ณด๋ฅผ ๋‹ค ๋‹ด์•„์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— send()๋Š” parameter๊ฐ€ ์—†์Œ.
// POST๋Š” send()์— ์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ ํ™•์ธ ๋ถˆ๊ฐ€

// XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTTP ์‘๋‹ต์„ ๋ฐ›์•˜์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ
xhr.onload = () => { // onload() : ๋กœ๋”ฉ์ด ๋˜๋ฉด ...(์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ์ฃผ๋ฉด) 'onload()'๊ฐ€ ๋ถˆ๋ ค์ง€๋Š”..์ฝœ๋ฐฑ ํ•จ์ˆ˜
  // XMLHttpRequest ๊ฐ์ฒด์—์„œ ์š”์ฒญ์ด ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ
  if (xhr.status === 201) {
    // ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต๋˜๋ฉด status๊ฐ€ 200์ด๋‚˜ ํ•ด๋‹น test ์‚ฌ์ดํŠธ๋Š” 201์ด ์ •์ƒ ์‘๋‹ต์ธ๊ฐ€ ๋ด„.
    // const res = JSON.parse(xhr.response); // ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ JSON.parse ํ•จ์ˆ˜๋กœ JSON ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ
    console.log(xhr.response);
  } else {
    // ์—๋Ÿฌ ๋ฐœ์ƒ
    console.error(xhr.status, xhr.statusText); // ์‘๋‹ต ์ƒํƒœ์™€ ์‘๋‹ต ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ
  }
};

์ •์ƒ์ ์œผ๋กœ ๋„˜์–ด์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

2. Promise

Promise๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๋‚ด์žฅ ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ž€? ํŠน์ • ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธ ํ•ฉ๋‹ˆ๋‹ค.

์›๋ž˜ ์›น์€ ์š”์ฒญ(request)์— ๋Œ€ํ•œ ๋ฐ˜์‘(response)์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๊ณ , ๋จผ์ € ์‹คํ–‰๋œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— Ajax(Asynchronous JavaScript and XML)๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ XMLHttpRequest ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์กŒ๊ณ , ๊ทธ๋Ÿผ์œผ๋กœ์จ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ธ ํ›„ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ํ•„์š” ์—†์ด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

Promise๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ Web API๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‹คํ–‰ํ•œ ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ , ๋ฐ”๋กœ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ณ , ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด then() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

์ด๋ฅผ ์‰ฝ๊ฒŒ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


A๋Š” ํ•™์›์˜ ํ•œ ์ˆ˜์—… ์ปค๋ฆฌํ˜๋Ÿผ์„ ๋ณด๊ณ  ์‹ ์ฒญ์„ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง ๋ชจ์ง‘ ์ธ์›์ด ๋‹ค ๋ชจ์ด์ง€ ์•Š์•„์„œ ๊ฐœ๊ฐ•ํ•˜๊ธฐ๊นŒ์ง€๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ A๋Š” ํ•™์› ํ–‰์ •์‹ค์— ๊ฐœ๊ฐ• ๋‚ ์งœ๊ฐ€ ํ™•์ •์ด๋˜๋ฉด ์•Œ๋ ค๋‹ฌ๋ผ ํ•˜๊ณ , ๋Œ€๊ธฐ๋ฅผ ๊ฑธ์–ด๋†“๊ณ  ์ง‘์— ์™”์Šต๋‹ˆ๋‹ค.

A๋Š” ์ˆ˜์—…์ด ๊ฐœ๊ฐ•๋  ๋•Œ๊นŒ์ง€ ๋ฏธ๋ฆฌ ๊ณต๋ถ€๋ฅผ ํ•˜๊ณ , ์•Œ๋ฐ”๋ฅผ ํ•˜๋ฉฐ ์ผ์ƒ ์ƒํ™œ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
๋ฉฐ์น  ํ›„, ํ•™์›์—์„œ ๊ฐœ๊ฐ• ๋˜์—ˆ๋‹ค๋Š” ์—ฐ๋ฝ์„ ๋ฐ›๊ณ  A๋Š” ์ˆ˜์—…์„ ๋“ค์œผ๋Ÿฌ ํ•™์›์— ๊ฐ‘๋‹ˆ๋‹ค.

์–ด๋–ค๊ฐ€์š”? ์ดํ•ด๊ฐ€ ์‰ฝ๊ฒŒ ๋˜์‹œ๋‚˜์š”? ใ…Žใ…Ž

๋จธ๋ฆฌ๋กœ ์ดํ•ดํ•œ ๊ฒƒ์„ ๊ธ€๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์–ธ์ œ๋‚˜ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.๐Ÿ˜…

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

// GET - ์ •๋ณด ์กฐํšŒ
// ์—…๊ณ„ ๊ธฐ๋ณธ ๊ฐ’์€ GET ๋ฐฉ์‹, JSON ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ๋„ฃ์–ด๋„ ์ •๋ณด๋Š” ๋„˜์–ด์˜ด.
fetch("https://jsonplaceholder.typicode.com/posts/1") // userId 1์ธ ๊ฐ์ฒด๋งŒ ์š”์ฒญ
  .then((response) => response.json())
  .then((json) => console.log(json))
  .catch((error) => console.error(error));

// POST - ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
fetch("https://jsonplaceholder.typicode.com/posts", {
  method: "POST",
  body: JSON.stringify({
    //์ „์†กํ•  ๋ฐ์ดํ„ฐ
    title: "ํ…Œ์ŠคํŠธ ์ž…๋‹ˆ๋‹ค.",
    userName: "ํ™๊ธธ๋™",
    userId: "test1",
  }),
  headers: {
    //ํ—ค๋” ๊ฐ’ ์ •์˜
    "content-type": "application/json; charset=UTF-8", //content-type ์ •์˜
  },
})
  .then((response) => response.json())
  .then((json) => console.log(json));

// PUT - ๋ฐ์ดํ„ฐ ์ˆ˜์ •
fetch("https://jsonplaceholder.typicode.com/posts/1", {
  method: "PUT",
  body: JSON.stringify({
    id: 1,
    title: "PUT ํ…Œ์ŠคํŠธ",
    body: "bar",
    userId: 1,
  }),
  headers: {
    "Content-type": "application/json; charset=UTF-8",
  },
})
  .then((response) => response.json())
  .then((json) => console.log(json));

// DELETE - ๋ฐ์ดํ„ฐ ์‚ญ์ œ
fetch("https://jsonplaceholder.typicode.com/posts/1", {
  method: "DELETE",
});
// ์ƒˆ๋กœ์šด Promise๋ฅผ ๋งŒ๋“ค ๋•Œ, executor ํ•จ์ˆ˜๊ฐ€ ์ž๋™์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•  ๋•Œ์—๋งŒ ํ†ต์‹ ์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•  ๋•Œ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ.
// ์ฆ‰ ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์Œ
const promise = new Promise((resolve, reject) => {
  // ๋น„๋™๊ธฐ ์ž‘์—…()...(๋„คํŠธ์›Œํฌ, ํŒŒ์ผ ์ฝ๊ธฐ ๋“ฑ)
  console.log("์ž‘์—…์ค‘...");
  setTimeout(() => {
    // resolve('kongmi');
    reject(new Error("๋„คํŠธ์›Œํฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."));
  }, 2000);
});

promise
.then(value => {
  console.log(value);
})
.catch(error => {
  console.log(error);
})
.finally(() => { // ์„ฑ๊ณต ์—ฌ๋ถ€ ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด.
  console.log('finally!!!');
});

// ์—ฐ๊ฒฐํ•˜๊ธฐ
const fetchNumber = new Promise((resolve, reject) => {
  setTimeout(() => resolve(1), 1000);
});

fetchNumber
.then(num => num * 2)
.then(num => num * 3)
.then(num => {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(num - 1), 1000);
  });
})
.then(num => console.log(num)); // 5

3. Async / Await

Async/Await ์—ญ์‹œ Promise์™€ ๋™์ผํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Async๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋น„๋™๊ธฐ ์‹คํ–‰์„ ๋งํ•˜๋ฉฐ, Await์€ ๋น„๋™๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ ์ž…๋‹ˆ๋‹ค.

 

Async/Await์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ•จ์ˆ˜ ์•ž์— await์„ ์ •์˜ํ•˜๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์œผ๋ฉด ์‹คํ–‰๋˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

 

await์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋Š” ๋ฐ˜๋“œ์‹œ async์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ‚ค์›Œ๋“œ์ธ function ์•ž์— async ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async function myFunction() {
  const res1 = await fetch(
    "https://jsonplaceholder.typicode.com/posts/1"
  );
  const res1Json = await res1.json();
  console.log(res1Json);

  const res2 = await fetch(
    "https://jsonplaceholder.typicode.com/posts/1",
    {
      method: "PUT",
      body: JSON.stringify({
        id: 1,
        title: "foo",
        body: "bar",
        userId: 1,
      }),
      headers: {
        "Content-type": "application/json; charset=UTF-8",
      },
    }
  );
  const res2Json = await res2.json();
  console.log(res2Json);
}

myFunction();

 

profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!