[JS] Promise์™€ async/await

Yunhye Parkยท2023๋…„ 10์›” 15์ผ
0
post-thumbnail

๐ŸŒฑ ์˜ค๋Š˜์˜ ์ˆ˜์—… (10/14)

ES6์—์„œ ์ถ”๊ฐ€๋œ ๋ฌธ๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

  1. JS์˜ Class
  2. JS ํŠน์ง• : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹
    • ์™œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ผ์–ด๋‚ ๊นŒ?
    • ์–ด๋–จ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ?
    • ํ•ด๊ฒฐ์ฑ…
      • callback ํ•จ์ˆ˜
      • Promise
        (+ async/await)

์ •๋ฆฌํ•  ๋ถ€๋ถ„

โœ… callback hell(์ฝœ๋ฐฑ ํ—ฌ)
โœ… Promise(ํ”„๋กœ๋ฏธ์Šค)
โœ… async/await


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน์„ฑ์ธ ๋งŒํผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ์–ธ์ œ๋‚˜ ๋ฐœ์ƒํ•œ๋‹ค. ํ•˜์ง€๋งŒ setTimeout์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์—์„œ ๋œป๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

setTimeout(callback, delay)

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

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ?

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

์ด๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋์—†๋Š” ์ค‘์ฒฉ์„ ์•ผ๊ธฐํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋˜ ๋‹ค์‹œ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋ง์ด๋‹ค. ์ผ๋ช… ์ฝœ๋ฐฑ ํ—ฌ(callback hell)์— ๋น ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

๋์—†๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ํ•ด์„์ด ์‰ฝ์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋„ ์–ด๋ ต๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•  ๋ฐฉ๋ฒ•์œผ๋กœ ES6์—์„œ Promise๋ฅผ ๋„์ž…ํ–ˆ๋‹ค. ์ดํ›„์— Promise๋ฅผ ๋ณด์™„ํ•  async/await๋„ ๋“ฑ์žฅํ–ˆ๊ณ  ๋ง์ด๋‹ค.

์ด์ œ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.

1. Promise

Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ new ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค(Promise ๊ฐ์ฒด)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ECMAScript ์‚ฌ์–‘์— ์ •์˜๋˜์—ˆ์œผ๋ฏ€๋กœ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ํ‘œ์ค€ ๋นŒํŠธ์ธ ๊ฐ์ฒด๋‹ค.

์ด ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜ resolve์™€ reject๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜(์ธ์ž)๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์‹œ์ž‘๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๋ฏธ์Šค๋„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋งŒ ํ›„์ˆ ํ•  ๋ฉ”์„œ๋“œ์˜ ์กด์žฌ๋กœ ์ฝœ๋ฐฑ ํ—ฌ์— ๋น ์ง€์ง€ ์•Š๋Š”๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์„ฑ๊ณตํ•˜๋ฉด resolve ํ•จ์ˆ˜์— ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด ํ˜ธ์ถœํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด reject ํ•จ์ˆ˜์— ์—๋Ÿฌ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•ด ํ˜ธ์ถœํ•œ๋‹ค.

1.1 ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ : then, catch

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์ง„ํ–‰ ์ •๋„์— ๋”ฐ๋ผ ์ƒํƒœ ์ •๋ณด๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • pending : ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ƒ์„ฑ๋œ ์งํ›„ ๊ธฐ๋ณธ ์ƒํƒœ. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰ ์•„์ง ์•ˆ ํ•จ.
  • fulfilled : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰์— ์„ฑ๊ณตํ•ด์„œ resolve ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋ฉด fulfilled ์ƒํƒœ.
  • rejected : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ˆ˜ํ–‰ ์‹คํŒจํ•ด์„œ reject ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜๋ฉด rejected ์ƒํƒœ.
  • settled : ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ์ด๋ฅด๋Š” ์ƒํƒœ. ์ฆ‰ fulfilled์™€ rejected๋ฅผ ์•„์šฐ๋ฆ„.

์ƒํƒœ ์ •๋ณด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฑด ์ƒํƒœ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ๊ฒฐ๊ณผ ๊ฐ’๋„ ๊ฐ€์ง„๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค. ์ฆ‰ ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํƒœ์™€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๊ณ  ๋‚˜๋ฉด ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. fulfilled ์ƒํƒœ๋Š” then ๋ฉ”์„œ๋“œ๋ฅผ, rejected ์ƒํƒœ๋Š” catch ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. catch ๋ฉ”์„œ๋“œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
์ด๋ก ์ƒ then ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— reject๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ•œ ์ค„์— ๋‘ ๊ฐœ์ด๋‹ค. ๊ฐ€๋…์„ฑ์„ ์ƒ๊ฐํ•ด์„œ catch ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

Promise.prototype.finally
then๊ณผ catch๋Š” ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ˜ธ์ถœ ์—ฌ๋ถ€๊ฐ€ ๋‹ฌ๋ผ์กŒ๋‹ค๋ฉด, finally๋Š” ๊ฒฐ๊ณผ์™€ ๋ฌด๊ด€ํ•˜๋‹ค. ์ฆ‰ ํ”„๋กœ๋ฏธ์Šค์˜ ์ƒํƒœ์™€ ๊ด€๋ จ ์—†๋Š” ๊ณตํ†ต ์ˆ˜ํ–‰์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ํ•œ ๊ฐœ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค.

1.2 ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹

then, catch, finally ๋ฉ”์„œ๋“œ๋Š” ์–ธ์ œ๋‚˜ ํ›„์† ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋กœ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฐ์†์ ์ธ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๋ฅผ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹(promise chaining)์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹ ์‚ฌ์šฉ ์‹œ ์žฅ์ ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋‹ค.

  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์„œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ํ—ฌ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • catch ๋ฉ”์„œ๋“œ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ„ํŽธํ•˜๋‹ค.

์ด๋Ÿฐ ์ ์—์„œ ๊ธฐ์กด์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ณด๋‹ค๋Š” ๋‚ซ์ง€๋งŒ, ํ”„๋กœ๋ฏธ์Šค๋„ ์ฝœ๋ฐฑ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ ๊ฐœ์„ ์— ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ES8์— ๋„์ž„๋œ async/await๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

2. async/await

then์ด๋‚˜ catch ๊ฐ™์€ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ ์—†์ด ๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ฒ˜๋Ÿผ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•œ๋‹ค.

  • asyn ํ•จ์ˆ˜

    • async ํ•จ์ˆ˜๋Š” ์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ช…์‹œ์ ์œผ๋กœ๋Š” ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์•”๋ฌต์ ์œผ๋กœ ๋ฐ˜ํ™˜๊ฐ’์„ resolveํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • await ํ‚ค์›Œ๋“œ

    • ํ”„๋กœ๋ฏธ์Šค๊ฐ€ settled ์ƒํƒœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ -> setteld ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolveํ•œ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ๋ฐ˜๋“œ์‹œ async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.

์ˆ˜์—… ์‹œ๊ฐ„์— ์ œ๊ณต๋œ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์™€ ์‚ดํŽด๋ณด๋ฉด ์ •๋ฆฌํ•˜๊ธฐ ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

2.1 ์˜ˆ์‹œ

(4 + 5) * 3 - 3 ์„promise์™€ async/await๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ.

// ๋”ํ•˜๊ธฐ ํ•จ์ˆ˜ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ์ƒ์„ฑ
function add(n1, n2) {
    return new Promise(function(res){
        setTimeout(function(){
            let result = n1 + n2;
            res(result);
        });
    }, 2000);
}

// ๊ณฑํ•˜๊ธฐ ํ•จ์ˆ˜ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ์ƒ์„ฑ
function mul(n) {
    return new Promise(function(res){
        setTimeout(() => {
            let result = n * 3;
            res(result);
        }, 2000);
    });
}

// ๋นผ๊ธฐ ํ•จ์ˆ˜ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ์ƒ์„ฑ
function sub(n) {
    return new Promise(function(res){
        setTimeout(function(){
            let result = n - 3;
            res(result);
        }, 2000);
    });
}
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ƒํ™ฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด setTimeout ์‚ฌ์šฉ.
  • ๋ชจ๋“  ์—ฐ์‚ฐ์ด 2์ดˆ ๋’ค์— ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ์„ค์ •์ธ๋ฐ, ์ด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ(add-mul-sub) ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•จ.
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ์‹คํŒจํ•  ์ผ€์ด์Šค๊ฐ€ ์—†์–ด์„œ ํ”„๋กœ๋ฏธ์Šค์— res(resolve)๋งŒ ์ „๋‹ฌ.

์ด๋ฅผ async/await๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.


async function exec(){
    const sum = await add(4, 5);
    console.log(`1: ${sum}`);
    const mult = await mul(sum);
    console.log(`2: ${mult}`);
    const subb = await sub(mult);
    console.log(`3: ${subb}`);
}

exec();
  • ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋ ค๋ฉด await๋ฅผ ์ง€์ •ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•œ๋‹ค. ์ฆ‰ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ await๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์„ ๋• ๊ตฌํƒœ์—ฌ ์ด ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฐธ๊ณ 

  • [์ฑ…] ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ Deep Dive

์ƒ๊ฐ

  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ์–ผ์ถ” ์•Œ๊ฒ ๋Š”๋ฐ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ์ง€ ๊ฐ์ด ์•ˆ ์žกํžŒ๋‹ค. ์˜†์— ๋ถ„ ๋ง๋กœ๋Š” ํ”„๋กœ์ ํŠธ ํ•˜๋‚˜ ์ง„ํ–‰ํ•˜๋ฉด ์˜จ๊ฐ– ๋ธ”๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•ด ๊ฐ€๋ฉฐ ์ €์ ˆ๋กœ ์•Œ๊ฒŒ ๋œ๋‹ค๋Š”๋ฐ.. ํ•œ ๋‹ฌ ๋’ค๋ฉด ์ง€๊ธˆ๊ณผ ๋‹ค๋ฅธ ๋Š๋‚Œ์ผ์ง€ ๊ถ๊ธˆํ•ด์ง„๋‹ค.

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

    • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•œ ๋ฒˆ์— ๋๋‚˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ํ›„์† ์ž‘์—…์˜ ํ›„์† ์ž‘์—…์ด ์ค‘์ฒฉ๋˜๋ฉด ํ•จ์ˆ˜ ๋‚ด์— ํ•จ์ˆ˜๊ฐ€ ๋์—†์ด ์ „๋‹ฌ๋œ๋‹ค. ์–ด๋–ค ๊ฑธ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฑด์ง€ ๋ณด์ด์ง€ ์•Š๊ณ  ๊ณ„์† ์ „๋‹ฌ๋œ ์ธ์ž๋“ค๋งŒ ๋ณด์ด๋‹ˆ ํ•ด์„์—” ์–ด๋ ค์›€์ด ๋”ฐ๋ฅด๊ณ . ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋„ ์–ด๋ ค์›Œ์ง„๋‹ค.
    • ๊ธฐ์กด์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ๊ฒƒ์ด๋ผ ๊ทธ๋Ÿฐ์ง€ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” ๋˜‘๊ฐ™๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋„ ์ฝœ๋ฐฑ ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค. resolve์™€ reject ํ•จ์ˆ˜ ๋ชจ๋‘ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์“ฐ์ด๋‹ˆ๊นŒ!
    • ํ•˜์ง€๋งŒ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ์ธ then๊ณผ catch์˜ ํŠน์ง•(์–ธ์ œ๋‚˜ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜)๊ณผ ์‚ฌ์šฉ ์œ„์น˜(ํ”„๋กœ๋ฏธ์Šค ํ•จ์ˆ˜ ๋’ค์— .๊ณผ ํ•จ๊ป˜ ์—ฐ๊ฒฐ) ๋•๋ถ„์— ์ฝœ๋ฐฑ ํ—ฌ์— ๋น ์ง€์ง„ ์•Š๋Š”๋‹ค. catch๋กœ ํ•œ๋ฒˆ์— ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋„ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ข‹๋‹ค.
    • ์ตœ์†Œํ•œ์˜ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ–ˆ์œผ๋‚˜, ๊ฐ€๋…์„ฑ์€ ์—ฌ์ „ํžˆ ๊ฐœ์„ ํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ async/await. promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋‘๊ณ , ์ด ํ•จ์ˆ˜๋“ค์„ ์‹คํ–‰ํ•  ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค. ๊ทธ ํ•จ์ˆ˜ ์•ˆ์— ์‹คํ–‰ํ•  ํ•จ์ˆ˜ ์ธ์ˆ˜๋ฅผ ๊ฐ๊ฐ ์ „๋‹ฌํ•˜๊ณ , await๋กœ ์ˆœ์„œ๋ฅผ ์ง€์ •(settledํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ)ํ•œ๋‹ค. ๊ทธ๋Ÿผ ๋™๊ธฐ ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์‹คํ–‰๋ฌธ๋งŒ ๋ณด์•„๋„ ์–ด๋–ค ํ๋ฆ„์œผ๋กœ ์ด์–ด์ง€๋Š”์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•… ๊ฐ€๋Šฅํ•˜๋‹ค.
    • ๋‹จ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๋ฌธ์ œ์ ์„ ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด ๊ทธ๋งŒํผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ I/O ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์ฃผ์š” ํŠน์ง•์œผ๋กœ ์‚ผ์ง€ ์•Š์•˜๋‚˜. ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด ์ตœ๋Œ€ํ•œ ๊ทธ๋Œ€๋กœ ๋ƒ…๋‘๊ณ , ์ •๋ง ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒŒ ๊ด€๊ฑด์ด๊ฒ ๋‹ค.
  • ์ˆ˜์—…์ด ํ•˜๋ฃจ 6์‹œ๊ฐ„์ธ ๋งŒํผ ๋งŽ์€ ๋‚ด์šฉ์„ ํ•œ ๋ฒˆ์— ์ ‘ํ•˜๊ฒŒ ๋˜์–ด์„œ ์–ด๋–ป๊ฒŒ ์ •๋ฆฌํ• ์ง€ ๊ณ ๋ฏผ์Šค๋Ÿฌ์› ๋Š”๋ฐ ์ด์ œ์•ผ ํ‹€์ด ์žกํ˜”๋‹ค. ๋ฐฐ์šด ๋‚ด์šฉ์˜ ๋ชฉ์ฐจ๋ฅผ ์งœ๊ณ , ๊ทธ ๋‚ด์šฉ ์ค‘์—์„œ ์ค‘์š”ํ•œ ํ‚ค์›Œ๋“œ๋‚˜ ์•Œ๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์„ ๊ณ ๋ฅธ๋‹ค. ์ฆ‰ ์ฃผ์ œ๊ฐ€ ์•„๋‹Œ ์†Œ์žฌ๋ฅผ ํƒํ•œ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํ•œ ๊ฐœ๋งŒ ๊ณจ๋ผ๋„ ์ถ”๊ฐ€ ์ž๋ฃŒ๋ฅผ ์ฐพ๋‹ค๋ณด๋ฉด ์ €์ ˆ๋กœ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—... ๋ฌดํŠผ ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ธฐ๋กํ•˜๋Š” ๊ฒŒ ๋‚˜์ค‘์— ๋‹ค์‹œ ์ฐพ์•„๋ณผ ๋•Œ์—๋„ ์ดํ•ดํ•˜๊ธฐ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

profile
์ผ๋‹จ ํ•ด๋ณด๋Š” ํŽธ

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