๋ฐ˜์‘ํ˜•

TL;DR


async/await๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฌธ๋ฒ•์  ์„คํƒ•(Syntax Sugar)์ด๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” async ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘๋‹จํ–ˆ๋‹ค๊ฐ€ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๋ฅผ ํ†ตํ•ด ๋‹ค์‹œ ์žฌ๊ฐœ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋…ผ๋ธ”๋กœํ‚น์„ ์œ ์ง€ํ•œ๋‹ค.

 

async/await๋Š” ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ค‘๋‹จ/์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์™€ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, await ์ดํ›„์˜ ์ฝ”๋“œ๋Š” ์‚ฌ์‹ค์ƒ .then() ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

promise.then(() => { /* await ์ดํ›„์˜ ์ฝ”๋“œ */ })

 

 

async/await ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜


  1. async ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์ผ๋ฐ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰
  2. async ํ•จ์ˆ˜ ์‹คํ–‰ ์ค‘ await ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ํ•ด๋‹น ์ง€์ ์—์„œ ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ , ํ˜ธ์ถœ์ž์—๊ฒŒ ์ œ์–ด๊ถŒ ๋ฐ˜ํ™˜. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„  Promise ์ฒ˜๋ฆฌ ์‹œ์ž‘.
  3. async ํ•จ์ˆ˜๊ฐ€ ์ผ์‹œ ์ค‘์ง€(suspend)๋œ ๋™์•ˆ JS ๋Ÿฐํƒ€์ž„์€ ํ˜ธ์ถœ์ž ์ปจํ…์ŠคํŠธ์˜ ๋‹ค์Œ ๋™๊ธฐ ์ฝ”๋“œ ๊ณ„์† ์‹คํ–‰. ๋•๋ถ„์— ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น๋˜์ง€ ์•Š๊ณ , UI ๋ Œ๋”๋ง ๊ฐ™์€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ง€์—ฐ ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ.
  4. ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ฒ˜๋ฆฌ(์ดํ–‰ ํ˜น์€ ๊ฑฐ๋ถ€)๋˜๋ฉด, ์ค‘๋‹จ ์ง€์  ์ดํ›„์˜ ์ฝ”๋“œ๊ฐ€ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์— ์ถ”๊ฐ€๋˜๊ณ , ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ฝœ์Šคํƒ์— ๋“ค์–ด๊ฐ€์„œ ์‹คํ–‰ ์žฌ๊ฐœ. ์ด๋•Œ await ํ‘œํ˜„์‹์€ ์ดํ–‰๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ฑฐ๋ถ€๋œ ๊ฒฝ์šฐ ์˜ˆ์™ธ throw.
  5. ๋‚˜๋จธ์ง€ ๋™๊ธฐ ์ฝ”๋“œ ์‹คํ–‰. async ํ•จ์ˆ˜ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ await๋ฅผ ๋งŒ๋‚˜๋ฉด 2-4 ๊ณผ์ • ๋ฐ˜๋ณต.

 

 

async/await ์‹คํ–‰ ํ๋ฆ„ ์˜ˆ์ œ


function main() {
  // Promise ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ›๋Š” executor ํ•จ์ˆ˜ ์ž์ฒด๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋จ
  return new Promise((resolve) => {
    console.log(3);
    resolve(4);
    console.log(5);
  });
}

async function f() {
  console.log(2);
  let r = await main(); // ์—ฌ๊ธฐ์„œ f() ์‹คํ–‰ ์ผ์‹œ ์ค‘๋‹จ
  console.log(r); // main() ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌ ํ›„ ์‹คํ–‰
}

console.log(1);
f();
console.log(6);

// 1, 2, 3, 5, 6, 4

 

  1. console.log(1) : ์ „์—ญ ์Šค์ฝ”ํ”„์˜ ๋™๊ธฐ์  ์ฝ”๋“œ ์‹คํ–‰
  2. f() ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • console.log(2) : ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋™๊ธฐ์  ์ฝ”๋“œ ์‹คํ–‰
    • main() ํ•จ์ˆ˜ ํ˜ธ์ถœ
      • console.log(3) : ์‹คํ–‰์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋™๊ธฐ์  ์ฝ”๋“œ ์‹คํ–‰
      • resolve(4) : ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ดํ–‰(fulfilled) ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ → ์ด ์‹œ์ ์— await๋กœ ๋Œ€๊ธฐ์ค‘์ธ f() ํ•จ์ˆ˜์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์— ๋“ฑ๋ก๋จ
      • console.log(5) : ์‹คํ–‰์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋™๊ธฐ์  ์ฝ”๋“œ ์‹คํ–‰
      • main() ํ•จ์ˆ˜๋Š” ์ดํ–‰๋œ ์ƒํƒœ์˜ ํ”„๋กœ๋ฏธ์Šค ๋ฐ˜ํ™˜
    • main() ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ™•์ธํ•˜๊ณ , f() ํ•จ์ˆ˜ ์‹คํ–‰ ์ผ์‹œ ์ค‘๋‹จ ๋ฐ ์ „์—ญ ์Šค์ฝ”ํ”„๋กœ ์ œ์–ด๊ถŒ ๋ฐ˜ํ™˜
  3. console.log(6) : ์ „์—ญ ์Šค์ฝ”ํ”„์˜ ๋™๊ธฐ์  ์ฝ”๋“œ ์‹คํ–‰
  4. f() ํ•จ์ˆ˜์˜ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ ์‹คํ–‰ → ์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”๊ฑธ ํ™•์ธํ•œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์˜ ์ž‘์—…์„ ์ฝœ์Šคํƒ์— ์ถ”๊ฐ€ํ•จ
    • await ํ‘œํ˜„์‹์—์„œ ํ”„๋กœ๋ฏธ์Šค ๊ฒฐ๊ณผ๊ฐ’ 4 ๋ฐ˜ํ™˜
    • console.log(4) : ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋™๊ธฐ์  ์ฝ”๋“œ ์‹คํ–‰

 

์œ„ ์ฝ”๋“œ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•