JS - Fetch API

sarang_daddyยท2023๋…„ 4์›” 1์ผ
0

Javascript

๋ชฉ๋ก ๋ณด๊ธฐ
17/26
post-thumbnail
post-custom-banner

๐Ÿค” ๋น„๋™๊ธฐ ์ ์œผ๋กœ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ JavaScript๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ?
API๋ž€ ๋ฌด์—‡์ธ์ง€ ๊ทธ๋ฆฌ๊ณ  ๋น„๋™๊ธฐ๋ฅผ ๋ณต์Šตํ•˜๋ฉฐ fetch API์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

โœ… API(Application Programming Interface)

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

โœ… ๋น„๋™๊ธฐ

์ƒ์œ„ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์Œ์—๋„ ํ•˜์œ„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ผ ํ•œ๋‹ค.
์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” JS์—๊ฒŒ database์ ‘๊ทผ์ด๋‚˜, ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์ž‘์—… ๋“ฑ์—
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” blocking ๋˜์ง€ ์•Š๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

์ฝœ์Šคํ…๊ณผ ์ฝœ๋ฐฑํ

JS๋Š” ์‹ฑ๊ธ€์“ฐ๋ ˆ๋“œ๋กœ ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ํƒœ์Šคํฌ๋งŒ ์ฒ˜๋ฆฌํ•œ๋‹ค.
์•„๋ž˜ JS์—”์ง„ ๋‚ด์˜ Call Stack์— ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ์กด์žฌํ•˜๋ฉด JS์—”์ง„์€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ์ฝœ๋ฐฑํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ์šฐ Call Stack์ด ์•„๋‹Œ
๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” Callback Queue์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Event Loop๊ฐ€ ๊ณ„์†ํ•ด์„œ JS ์—”์ง„์˜ Call Stack๊ณผ ๋ธŒ๋ผ์šฐ์ €์˜ Callback Queue๋ฅผ ํ™•์ธํ•˜๋ฉด์„œ
Call Stack์ด ๋น„์–ด์žˆ๋‹ค๋ฉด Callback Quere์— ์žˆ๋˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ Call Stack์œผ๋กœ ์ด๋™์‹œํ‚ค๊ณ 
JS์—”์ง„์ด ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

๋น„๋™๊ธฐ ํ•จ์ˆ˜ (์ฝœ๋ฐฑํ•จ์ˆ˜)

ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ผ ํ•œ๋‹ค.

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์‹คํ–‰๋˜๋ฉด ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์™„๋ฃŒ๋˜์ง€ ์•Š์•„๋„ ์ข…๋ฃŒ๋œ๋‹ค.
    โ†’ Callback Queue๋กœ ๋“ค์–ด๊ฐ„๋‹ค.
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์— ์™„๋ฃŒ๋œ๋‹ค.
  • ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์™„๋ฃŒ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ์ƒ์œ„ ์Šค์ฝ”ํ”„๋กœ ํ• ๋‹น ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋•Œ๋ฌธ์—, ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—๊ฒŒ ์ฝœ๋ฐฑํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ‘‰ย ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์—์„œ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ผ ํ•˜๊ณ ,
๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•จ์ˆ˜์—๊ฒŒ ์ฝœ๋ฐฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.
๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋งํ•œ๋‹ค.

์ฝœ๋ฐฑ ํ—ฌ

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

โœ… Promise

๋น„๋™๊ธฐ ํ•จ์ˆ˜(์ฝœ๋ฐฑํ•จ์ˆ˜)์˜ ์ฝœ๋ฐฑ ํ—ฌ์„ ๋ณด์™„ํ•˜๊ณ ์ž ๋„์ž…๋œ Promise๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋‹ค.
Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜(์ฝœ๋ฐฑํ•จ์ˆ˜)๋ฅผ resolve์™€ reject๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.

์—ฌ๊ธฐ์„œ resolve์™€ reject๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜(์ฝœ๋ฐฑํ•จ์ˆ˜)๊ฐ€ ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
โ†’ Callback Queue๋กœ ๋“ค์–ด๊ฐ์„ ๋งํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์•ž์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค.
Promise๋กœ ์ „๋‹ฌ๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์ฝœ๋ฐฑ ๋ฐ›์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

then, catch, finally

Promise์—์„œ ์ฒ˜๋ฆฌ๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜(์ฝœ๋ฐฑํ•จ์ˆ˜)์˜ ๋‚ด๋ถ€ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฉ”์„œ๋“œ๋กœ
then, catch, fainally๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • then ์€ ๊ฐ’์„ ๋ฐ”๋กœ ์ „๋‹ฌ ํ•˜๊ฑฐ๋‚˜ ๋˜ ๋‹ค๋ฅธ promise๋ฅผ ์ „๋‹ฌ ํ• ์ˆ˜ ์žˆ๋‹ค.
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

์ด์ฒ˜๋Ÿผ then์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ย ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹ ์ด๋ผ ํ•œ๋‹ค.

โœ… ๋น„๋™๊ธฐ ๋„คํŠธ์›Œํฌ API

๋น„๋™๊ธฐ ๋„คํŠธ์›Œํฌ API๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ์‘๋‹ต ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์˜ API๋ฅผ ๋งํ•œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ณผ์ •์—์„œ
๋ธ”๋กœํ‚น ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ… fetch API

๋น„๋™๊ธฐ ๋„คํŠธ์›Œํฌ API ์ค‘ ํ•˜๋‚˜๋กœ JavaScript์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค.
XMLHttpRequest์™€ ๊ฐ™์€ ์ด์ „์˜ ๋„คํŠธ์›Œํฌ API ๋ณด๋‹ค ๋” ๊ฐ„ํŽธํ•˜๊ณ  ์œ ์—ฐํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์œผ๋กœ๋Š” Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ณด๋‚ด๊ธฐ
    : fetch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GET, POST, PUT, DELETE ๋“ฑ์˜ HTTP ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ
    : fetch ํ•จ์ˆ˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” JSON, Blob, ArrayBuffer, Text ๋“ฑ์˜ ํ˜•์‹์„ ์ง€์›ํ•œ๋‹ค.
  • CORS(Cross-Origin Resource Sharing) ์ฒ˜๋ฆฌํ•˜๊ธฐ
    : fetch API๋Š” CORS๋ฅผ ์ง€์›ํ•˜์—ฌ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

fetch API ๊ตฌ์กฐ

fetch(url, options)
  .then(response => {
    // handle response
  })
  .catch(error => {
    // handle error
  });
  • fetch ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ URL์„ ๋ฐ›๋Š”๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์š”์ฒญ ์˜ต์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š”๋‹ค.
  • ์š”์ฒญ ์˜ต์…˜ ๊ฐ์ฒด๋Š” HTTP์š”์ฒญ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์„ค์ •์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. (method, headers, body ์†์„ฑ ์„ค์ •)
  • fetch ํ•จ์ˆ˜๋Š” Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • Promise๋Š” ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

fetch API๋กœ ์„œ๋ฒ„์— ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

fetch('https://example.com/api/data')
  .then(response => response.json())
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error(error);
  });
  • ์„œ๋ฒ„์—์„œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ ์˜ˆ์ œ๋‹ค.
  • fetch ํ•จ์ˆ˜๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, then() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ JSON์œผ๋กœ ํŒŒ์‹ฑํ•˜๊ณ 
  • ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

โญ๏ธ fetch์™€ then ๊ทธ๋ฆฌ๊ณ  ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”๊ฐ€?

์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋กœ fetch(URL).then(cp1).then(cp2)๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž.

function getData() {
  debugger;
  fetch("http://localhost:3000/goods")
    .then((response) => response.json())
    .then((json) => console.log(json));
}

console.log("1")
getData();
console.log("2")

mdn Promise

Promise๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • ๋Œ€๊ธฐ(pending): ์ดํ–‰ํ•˜์ง€๋„, ๊ฑฐ๋ถ€ํ•˜์ง€๋„ ์•Š์€ ์ดˆ๊ธฐ ์ƒํƒœ.
  • ์ดํ–‰(fulfilled): ์—ฐ์‚ฐ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ.
  • ๊ฑฐ๋ถ€(rejected): ์—ฐ์‚ฐ์ด ์‹คํŒจํ•จ.

๋Œ€๊ธฐ ์ค‘์ธ ํ”„๋กœ๋ฏธ์Šค๋Š” ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ดํ–‰ํ•  ์ˆ˜๋„, ์–ด๋–ค ์ด์œ (์˜ค๋ฅ˜)๋กœ ์ธํ•ด ๊ฑฐ๋ถ€๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ–‰์ด๋‚˜ ๊ฑฐ๋ถ€๋  ๋•Œ, ํ”„๋กœ๋ฏธ์Šค์˜ย thenย ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ๋Œ€๊ธฐ์—ด(ํ)์— ์ถ”๊ฐ€๋œ ์ฒ˜๋ฆฌ๊ธฐ๋“ค์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ดํ–‰ํ–ˆ๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋œ ํ”„๋กœ๋ฏธ์Šค์— ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์—ฐ๊ฒฐํ•ด๋„ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ, ๋น„๋™๊ธฐ ์—ฐ์‚ฐ๊ณผ ์ฒ˜๋ฆฌ๊ธฐ ์—ฐ๊ฒฐ ์‚ฌ์ด์— ๊ฒฝํ•ฉ ์กฐ๊ฑด์€ ์—†์Šต๋‹ˆ๋‹ค.

Promise.prototype.then() ๋ฐย Promise.prototype.catch() ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€
์ƒˆ๋กœ์šด ํ”„๋กœ๋ฏธ์Šค์ด๋ฏ€๋กœ ์„œ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ๋™์ ์ธ ํ•จ์ˆ˜ console.log(โ€1โ€) ์‹คํ–‰ ๋ฐ ์ข…๋ฃŒ

2. ์ฝœ์Šคํƒ์— ๋“ค์–ด๊ฐ„ getData() ์‹คํ–‰

3. fetch ์‹คํ–‰ : fetch๋Š” ๋™์ ์œผ๋กœ ์ฝœ์Šคํ…์— ์˜ฌ๋ผ๊ฐ„ ๋’ค wep API์—์„œ ์‹คํ–‰๋œ๋‹ค.

  • window ๋ฉ”์„œ๋“œ๋กœ fetch๊ฐ€ ์กด์žฌํ•จ์„ ํ™•์ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

4. fetch๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ pending ์ƒํƒœ์˜ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • Promise ๊ฐ์ฒด์—๋Š” pending, fulfilled, rejected ์™€ ๊ฐ™์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ์‘๋‹ต ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€๋‹ค.
  • then()๊ณผ catch() ๋ฉ”์„œ๋“œ์˜ return ๊ฐ’์€ ์ƒˆ๋กœ์šด Promise์ด๋ฏ€๋กœ ์„œ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • fetch(URL).then(cp1).then(cp2)๊ฐ€ ๋™์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • ์ด๋ฅผ Promise Chaining ๋ผ๊ณ  ํ•œ๋‹ค.

5. fetch(URL).then(cp1).then(cp2)์˜ ๊ฐ Promise(pending) ๋ฐ˜ํ™˜ ํ›„ getData() ์ข…๋ฃŒ.

  • wep API์—๋Š” fetch Promise ๊ฐ์ฒด, then(cp1) Promise๊ฐ์ฒด, then(cp2) Promise ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • ๊ฐ Promise ๊ฐ์ฒด๋Š” ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” pending ์ƒํƒœ๋‹ค.
  • then์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ cp1๊ณผ cp2๋Š” ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌํ์— ๋“ค์–ด๊ฐ€์„œ ๋Œ€๊ธฐํ•œ๋‹ค.

๋งˆ์ดํฌ๋กœ ํ…Œ์Šคํฌ ํ๋ž€ ์šฐ์„ ์ ์œผ๋กœ Promise๋“ค์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ํƒœ์Šคํฌํ์™€๋Š” ๋ณ„๊ฐœ์˜ ๊ณต๊ฐ„์ด๋‹ค.

6. console.log(โ€2โ€) ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋œ๋‹ค.

7. fetch๊ฐ€ response๋ฅผ ๋ฐ›์œผ๋ฉด Promise ๊ฐ์ฒด๊ฐ€ fullfill ์ƒํƒœ๊ฐ€ ๋˜๋ฉด์„œ ๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌํ์— ์žˆ๋˜ cp1์ด ์šฐ์„ ์ ์œผ๋กœ ์ฝœ์Šคํƒ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

8. cp1์˜ ์‹คํ–‰ ํ›„ resoponse๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋‹ค์Œ Promise ๊ฐ์ฒด๊ฐ€ fullfill์ด ๋˜๋ฉด์„œ cp2๊ฐ€ ์ฝœ์Šคํƒ์— ๋“ค์–ด๊ฐ€๊ณ  ์‹คํ–‰๋œ๋‹ค.

9. ์‹คํ–‰๊ฒฐ๊ณผ getData()๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


์ฐธ๊ณ ์ž๋ฃŒ

JavaScript Visualized: Promises & Async/Await
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์ด๋ฒคํŠธ ๋ฃจํ”„
๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ, ๋งคํฌ๋กœํƒœ์Šคํฌ
ํ”„๋กœ๋ฏธ์Šค
What really happens when you fetch() ?

profile
ํ•œ ๋ฐœ์ž๊ตญ, ํ•œ ๊ฑธ์Œ ๋Š๋ฆฌ๋”๋ผ๋„ ํ•˜๋ฃจํ•˜๋ฃจ ๋ฐœ์ „ํ•˜๋Š” ์‚ถ์„ ์‚ด์ž.
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€