๐Ÿช async / await์€ ๋ฌด์—‡์ธ๊ฐ€?

async/await์€ ECMAScript 2017(ES8)์— ์ถ”๊ฐ€๋œ ์‚ฌํ•ญ์œผ๋กœ ๊ธฐ์กด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋“ค์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์ดˆ์ ์ธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ function ์ž์ฒด๋ฅผย asyncย ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ์„ ์–ธํ•ด์ฃผ๊ณ , ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„ ์•ž์— await ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ๋์ด๋‹ค. ํ•œ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ async/await์€ await์„ ๋ถ™์ธ ๋ถ€๋ถ„์ด promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ด ์—ญ์‹œ promise ๋ฐฉ์‹์„ ์ด์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

keyword description
async function์— ์„ ์–ธํ•ด์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜๋กœ, Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜
await async function์œผ๋กœ ์„ ์–ธ๋œ ์ฝ”๋“œ ์•ˆ์—์„œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

await ํ‚ค์›Œ๋“œ๋Š” async ํ•จ์ˆ˜์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผํ•œ๋‹ค. async ํ•จ์ˆ˜์˜ ๋ณธ๋ฌธ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋ฉด SyntaxError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿช ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?

Promise๋ฅผ then()๊ณผ catch()๋ฅผ ๋‹ค๋ค˜๋˜ ๊ตฌ๋ฌธ๊ณผ ๋น„๊ตํ•˜๋ฉด์„œ ์•Œ์•„๋ณด์ž.

function test1() {
    fetch('...url...')
      .then(response => {
        //do something
      })
      .catch(error => {
        //handle error
      });
  }

async function test2() {
    try{
      const response = await fetch('...url...');
        // do something
    } catch (error) {
        // handle error
    }
}

ํ•จ์ˆ˜ ์•ž์— async๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ตฌ๋ฌธ์— await๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด, then()์ฒ˜๋ฆฌ ๋Œ€์‹ ์—ย awaitย ๊ตฌ๋ฌธ์œผ๋กœ ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , catch()์ฒ˜๋ฆฌ๋Š”ย try...catchย ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ๋Œ€์ฒด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿงช async await ์˜ˆ์ œ

Promise Part์—์„œ ๋‹ค๋ค˜๋˜ ์˜ˆ์ œ๋ฅผ async await์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž.

const movieAPI = "<https://movieapi.com/data>";
const tvAPI =  "<https://tvapi.com/data>";
const getData = async () => {
   const movieData = await fetch.then(res => resp.json());
   const tvData =  await fetch.then(res => resp.json());
   return {
      movies: movieData,
      tvs: tvData
   }
}

๐Ÿช async await์ด ์™œ ๋” ์ข‹๋‹ค๊ณ  ํ•˜๋Š”๊ฐ€?

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฐ๊ฐ ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹๊ณผ async await์œผ๋กœ ๋‹ค๋ฃฌ ์˜ˆ์ œ์ด๋‹ค.

function test1() {
    return doSomethingAsync()
      .then(foo => doAsync1(foo))
      .then(bar => doAsync2(bar))
      .then(baz => doAsyncLast(baz))
}

async function test2() {
    const foo = await doSomethingAsync();
    const bar = await doAsync1(foo);
    const baz = await doAsync2(bar);
    await doAsyncLast(baz);
}

์ผ๋‹จ ํ”ํžˆ๋“ค async await์ด ์ข‹๋‹ค๊ณ  ํ•˜๋Š” ์ด์œ ๋Š” ๋™๊ธฐํ™” ํ•จ์ˆ˜ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์นœ์ˆ™ํ•œ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ์ฝ”๋“œ์—์„œ foo๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณด์ž. then๊ณผ catch๋ฅผ ํ†ตํ•ด ๋‹ค๋ฃฌ ์œ„์˜ˆ์ œ์—์„œ๋Š” ํ•ด๋‹น ๊ตฌ๋ฌธ์ด ๋๋‚˜๋Š” ์ˆœ๊ฐ„ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋์ด๋‚˜์ง€๋งŒ, async await๋ฅผ ๋‹ค๋ฃฌ ์˜ˆ์ œ์—์„œ๋Š” ์ฝ”๋“œ ์–ด๋Š ๊ตฌ๋ฌธ์—์„œ๋„ ๋‹ค์‹œ ์‚ฌ์šฉ(์‹ค์ œ๋กœ ์“ฐ์ผ ๊ฒฝ์šฐ๊ฐ€ ์ „ํ˜€ ์—†์„๋•Œ์—๋„)๋˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

async await์„ ์“ฐ๋ฉด์„œ ์ด๋ฏธ ์‚ฌ์šฉ์ด ๋๋‚œ ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์“ธ ์ˆ˜๋„์žˆ๋Š” ์œ„ํ—˜๋ถ€๋‹ด์„ ๊ฐ€์ง€๊ฒŒ ๋œ ๊ด€์ ์—์„œ๋Š”ย ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹๋ฐฉ์‹์ด ๋” ์ข‹์€ ์ฝ”๋“œ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค” ๊ทธ๋ ‡๋‹ค๋ฉด ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹ ๋ฐฉ์‹์ด ๋” ์ข‹์€ ๊ฒƒ ์•„๋‹Œ๊ฐ€??

ํ”„๋กœ๋ฏธ์Šค ์ฒด์ด๋‹๋ฐฉ์‹๊ณผ async await๋ฐฉ์‹์˜ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑํ•˜๋Š” ๊ตฌ์กฐ๋Š” ์œ„์—์„œ๋„ ์‚ดํŽด๋ณด์•˜๋“ฏ์ด ์™„์ „ ๋‹ค๋ฅด๋‹ค. fetch API๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด์ž.

await fecth(url);