async await

ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ง ๋งŽ์ด ์ ‘ํ•˜๋Š” ์š”์†Œ๊ฐ€ ๋ฐ”๋กœ async await ๊ตฌ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๊ณ„์ ์œผ๋กœ async์—๋Š” await์„ ์‚ฌ์šฉํ•ด์•ผ์ง€ ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜๊ฒƒ ๊ฐ™์•„ ์ด๋ฒˆ ๊ธฐํšŒ์— ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์ข€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ๊ณต๋ถ€ํ•˜๊ณ ์ž ํ•œ๋‹ค.

1๏ธโƒฃ async / await

๋จผ์ € ๊ฐ„๋‹จํžˆ async/await์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. async/await์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ•จ์ˆ˜ ์•ž์— async๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ๋ถ™์ธ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , Promise๊ฐ€ ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด Promise๋กœ ๊ฐ’์„ ๊ฐ์‹ธ ๋ฐ˜ํ™˜์‹œํ‚จ๋‹ค.

await๋Š” async ํ•จ์ˆ˜ ์•ˆ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. Promise๊ฐ€ ์ฒ˜๋ฆฌ๋ ๋•Œ๊นŒ์ง€ ํ•จ์ˆ˜ ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•œ๋‹ค. ์ดํ›„ Promise๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ฉด ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ ์‹คํ–‰๋œ๋‹ค.

async function Test() {
  return "Finish";
}

const doTest = Test();
console.log(doTest);

function Test2() {
  return new Promise((resolve, reject) => {
    resolve("Finish");
  });
}

const doTest2 = Test2();
console.log(doTest2);

> Promise { 'Finish' }
> Promise { 'Finish' }

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Test๋ผ๋Š” ํ•จ์ˆ˜๋Š” async๋ฅผ ์•ž์— ๋ถ™์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์ด Promise๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Promise๋กœ ๊ฐ์‹ผ Promise { 'Finish' }๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ Test2๋ผ๋Š” ํ•จ์ˆ˜๋Š” ์•„์˜ˆ ๋ฐ˜ํ™˜๊ฐ’์ด Promise์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์€ ๊ฐ™๋‹ค.

2๏ธโƒฃ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด async ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ ์ž‘์—…์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด Promise.resolve()๋ฅผ, ์‹คํŒจํ•˜๋ฉด Promise.reject()๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด Promise.reject()๋ฅผ ์–ด๋””์„œ ๋ฐœ์ƒํ•˜๊ฒŒ ํ• ๊ฒƒ์ด๋ƒ๊ฐ€ ๋ฐ”๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ์˜ ์š”์ ์ด๋‹ค.

์˜ˆ์‹œ๋ฅผ ํ•œ๋ฒˆ ์ž‘์„ฑํ•ด๋ณด์ž

1. try/catch

async function test() {
  console.log("Do Test!");
  throw new Error("New Error in function test");
}

function main() {
  try {
    console.log("try start");
    test();
    console.log("try end");
  } catch (err) {
    console.error("catch err in main");
    console.log(err);
    return console.log("main end in catch");
  }
  return console.log("main end");
}
main();

>
try start
Do Test!
try end
main end
Error: New Error in function test

์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ์‚ดํŽด๋ณด์ž. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•œ test๋ผ๋Š” ํ•จ์ˆ˜์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ, ํ•ด๋‹น ์—๋Ÿฌ๊ฐ€ catch์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , mainํ•จ์ˆ˜๋ฅผ ๋ชจ๋‘ ์‹คํ–‰ํ•œ ์ดํ›„์— ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์œ ๋Š” mainํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ testํ•จ์ˆ˜๊ฐ€ Promise๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

testํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์ด ์ฒ˜๋ฆฌ๋œ ์‹œ์ ์— ์ด๋ฏธ mainํ•จ์ˆ˜์˜ try/catch๋ฌธ์€ ๋ชจ๋‘ ์‹คํ–‰์„ ์™„๋ฃŒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— catch๋ฌธ์— ๊ฑธ๋ฆฌ์ง€ ์•Š์•„ ๊ฑฐ๋ถ€๋œ Promise๋ฅผ ์ฒ˜๋ฆฌ ํ• ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์—๋Ÿฌ๋ฅผ catch๋ฌธ์—์„œ ์žก๊ธฐ ์œ„ํ•ด์„œ๋Š”

  • await ์‚ฌ์šฉ

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ catch๋ฌธ ์—ฐ๊ฒฐ

์ด๋ผ๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.

2. await์„ ์ด์šฉํ•œ try/catch

๋จผ์ € await์„ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณด์ž

async function test2() {
  console.log("test2 start");
  throw new Error("New Error in function test");
}

async function main() {
  try {
    console.log("try start");
    await test2();
    console.log("try end");
  } catch (err) {
    console.error("catch from main");
    console.error(err);
    return console.log("main end in catch");
  }
return console.log("main end");
}

main();

>
try start
test2 start
catch from main
Error: New Error in function test
main end in catch

await๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„๋•Œ์™€ ์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž

  • main ํ•จ์ˆ˜์˜ console.log("try start")๋ฅผ ์‹คํ–‰.

  • await์„ ์‚ฌ์šฉํ•˜์—ฌ test2 ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ Promise๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ• ๋•Œ๊นŒ์ง€ ์ดํ›„ ์‹คํ–‰์„ ๋Œ€๊ธฐํ•œ๋‹ค

  • test2์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ’์ธ Promise.reject()๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด ๊ณง๋ฐ”๋กœ catch๋ฌธ์„ ์‹คํ–‰ํ•œ๋‹ค.

  • catch๋ฌธ์— ์žˆ๋Š” console.error("catch from main")์™€ console.error(err)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  • catch๋ฌธ ์•ˆ์˜ return์œผ๋กœ ์ธํ•˜์—ฌ console.log("main end in catch") ์‹คํ–‰ ํ›„ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค.

await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ test2 ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Promise๋ฅผ ๋ฐ˜ํ™˜ํ• ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ดํ›„์˜ ์ฝ”๋“œ๋“ค์ด ์‹คํ–‰๋œ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ง์ ‘ catch๋ฌธ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

3. ์ง์ ‘ catch๋ฌธ ์—ฐ๊ฒฐ

async function test3() {
  console.log("test3 start");
  throw new Error("New Error in function test3");
}

function main() {
  console.log("main start");
  test3().catch((err) => {
    console.error("catch from main");
    console.error(err);
    return console.log("main end in catch");
  });
  return console.log("main end");
}

main();
>
main start
test3 start
main end
catch from main
Error: New Error in function test3

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

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ๋น„๋™๊ธฐํ•จ์ˆ˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ์— ์œ ์šฉํ•˜์ง€๋งŒ try catch๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์กฐ๊ธˆ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊น”๋”ํ•ด ๋ณด์ธ๋‹ค.

3๏ธโƒฃ ์ •๋ฆฌ

์˜ˆ์™ธ์ฒ˜๋ฆฌ 1๋ฒˆ๊ณผ 2๋ฒˆ์—์„œ ๋‚˜ํƒ€๋‚ฌ๋“ฏ์ด ๋‘ ๋ฐฉ๋ฒ•์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ์–ด๋А ๋ถ€๋ถ„์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์ข…๋ฃŒ๋˜๋ƒ๋Š” ๊ฒƒ์ด๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ try/catch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋˜ ๊ณผ๊ฑฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‚ด๊ฐ€ ์ง€๊ธˆ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ์–ด๋””์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๊ฒƒ์ธ์ง€ ๋ช…ํ™•ํžˆ ์ƒ๊ฐํ•ด๋ณธ์ ์ด ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ƒ๊ฐํ•ด๋ณด์•˜์„๋•Œ, ์—„์ฒญ ์ค‘์š”ํ•œ ์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ์ด์ƒ ์•ฑ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ง€์žฅ์ด ์—†์–ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ถ€๋ถ„์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ์„ ๋ชปํ•˜๊ฒŒ ๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋งค์šฐ ๋–จ์–ด์ง€๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ณ์„์ˆ˜ ์žˆ๊ธฐ์— ํ•ญ์ƒ ์—ผ๋‘์— ๋‘๊ณ  ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ์Šต๊ด€์ด ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค.

Last updated