๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Promise์™€ await/async

Promise

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Promise ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ตœ์ข… ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋…์ž์ ์ธ ๊ฐ์ฒด์ด๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ๋‹ค๋Š” '์•ฝ์†'์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ Promise๋ผ ๋ช…๋ช… ์ง€์–ด์กŒ๋‹ค๊ณ  ํ•œ๋‹ค.

 

Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด new ํ‚ค์›Œ๋“œ์™€ Promise ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ด๋•Œ Promise ์ƒ์„ฑ์ž ์•ˆ์— ๋‘๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„ฃ๊ฒŒ ๋˜๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ž‘์—…์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์„ฑ๊ณต(resolve)์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ์ฒด์ด๋ฉฐ, ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ž‘์—…์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ์‹คํŒจ(reject)์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์˜ค๋ฅ˜ ๊ฐ์ฒด์ด๋‹ค.

const myPromise = new Promise((resolve, reject) => {
	// ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰
    const data = fetch('์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์š”์ฒญํ•  URL');
    
    if(data)
    	resolve(data); // ๋งŒ์ผ ์š”์ฒญ์ด ์„ฑ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด
    else
    	reject("Error"); // ๋งŒ์ผ ์š”์ฒญ์ด ์‹คํŒจํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด
})

 

 

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ Promise ๊ฐ์ฒด๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ์ดํ›„์— ๋‹ค์Œ ์ž‘์—…์„ ์—ฐ๊ฒฐ์‹œ์ผœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž‘์—… ๊ฒฐ๊ณผ ๋”ฐ๋ผ .then() ๊ณผ .catch() ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ํ†ตํ•ด ์„ฑ๊ณต๊ณผ ์‹คํŒจ์— ๋Œ€ํ•œ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์ผ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ resolve(data)๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฐ”๋กœ  .then()์œผ๋กœ ์ด์–ด์ ธ then ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์„ฑ๊ณต์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ์ด๋•Œ ํ˜ธ์ถœํ•œ resolve() ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด then ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€ then ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฃฌ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ์‹คํŒจํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ reject("Error") ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฐ”๋กœ .catch()๋กœ ์ด์–ด์ ธ catch  ๋ฉ”์„œ๋“œ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์„ฑ๊ณต์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. 

myPromise
    .then((value) => { // ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ
    	console.log("Data: ", value); // ์œ„์—์„œ return resolve(data)์˜ data๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค
    })
    .catch((error) => { // ์‹คํŒจํ–ˆ์„ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ
     	console.error(error); // ์œ„์—์„œ return reject("Error")์˜ "Error"๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค
    })
    .finally(() => { // ์„ฑ๊ณตํ•˜๋“  ์‹คํŒจํ•˜๋“  ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋  ์ฝ”๋“œ
    	
    })

 

 

์œ„์™€ ๊ฐ™์ด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ณ€์ˆ˜์— ๋ฐ”๋กœ ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋ณดํ†ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

// ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์ƒ์„ฑ
function myPromise() {
  return new Promise((resolve, reject) => {
    if (/* ์„ฑ๊ณต ์กฐ๊ฑด */) {
      resolve(/* ๊ฒฐ๊ณผ ๊ฐ’ */);
    } else {
      reject(/* ์—๋Ÿฌ ๊ฐ’ */);
    }
  });
}

// ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ์‚ฌ์šฉ
myPromise()
    .then((result) => {
      // ์„ฑ๊ณต ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜
    })
    .catch((error) => {
      // ์‹คํŒจ ์‹œ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ ํ•จ์ˆ˜
    });

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ์ž๋ฅผ return ํ•จ์œผ๋กœ์„œ, ๊ณง๋ฐ”๋กœ ์ƒ์„ฑ๋œ ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์–ป์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ 'ํ”„๋กœ๋ฏธ์Šค ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜' ๋ผ๊ณ  ๋ถˆ๋ฆฌ์šฐ๊ธฐ๋„ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ฝœ๋ฐฑ ๋ชป์ง€์•Š๊ฒŒ ํ”„๋กœ๋ฏธ์Šค์˜ then() ๋ฉ”์„œ๋“œ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์ฒด์ธ๋˜์–ด ๋ฐ˜๋ณต๋˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๊ต‰์žฅํžˆ ๋–จ์–ด์งˆ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ๋˜๋‹ค์‹œ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹ ์„ธ๋Œ€ ๋ฌธ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๋ฐ”๋กœ async/await ํ‚ค์›Œ๋“œ์ด๋‹ค. 

 

Async/Await

async/await ํ‚ค์›Œ๋“œ๋Š” ES8์—์„œ ๋„์ž…๋œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฌธ๋ฒ•์œผ๋กœ, ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ then๊ณผ catch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. async/await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ž‘์—…์„ ๋งˆ์น˜ ๋™๊ธฐ ์ž‘์—…์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๊ฒŒ ๋œ๋‹ค. 

 

์‚ฌ์šฉ๋ฒ•์€ function ํ‚ค์›Œ๋“œ ์•ž์— async๋ฅผ ๋ถ™์ด๊ณ , ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ถ€๋ถ„ ์•ž์— await๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋œ๋‹ค.

// ๊ธฐ์กด Promise.then() ํ˜•์‹
function main() {
  delay(1000)
      .then(() => {
        return delay(2000);
      })
      .then(() => {
        return Promise.resolve('๋');
      })
      .then(result => {
        console.log(result);
      });
}

// async/await ๋ฐฉ์‹
async function main() {
  await delay(1000);
  await delay(2000);
  const result = await Promise.resolve('๋');
  console.log(result);
}

 

async ํ‚ค์›Œ๋“œ๋Š” ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•  ํ•„์š”์—†์ด await๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ ์–ธ๋ฌธ ์ •๋„๋กœ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค. ์ฆ‰, function ์•ž์— async์„ ๋ถ™์—ฌ์คŒ์œผ๋กœ์จ, ํ•จ์ˆ˜๋‚ด์—์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋Š” await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ˜๋“œ์‹œ async function ์ •์˜๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ง๊ณผ ๊ฐ™๋‹ค. 

async function์€ ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋“  ๋ฌด์กฐ๊ฑด ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋กœ ๊ฐ์‹ธ์ ธ ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

๊ธฐ์กด์—๋Š” await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฌด์กฐ๊ฑด async function๋ฅผ ์ •์˜ํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ์ง€ ์•Š์•„๋„ ๋  ์ฝ”๋“œ๋ฅผ ์–ด๊ฑฐ์ง€๋กœ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ IIFE๋กœ ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•ด์™”๋‹ค. ์ด๋Ÿฌํ•œ ํ•œ๊ณ„์  ๋•Œ๋ฌธ์— Top-level await ๋ž€ async ํ•จ์ˆ˜๋‚˜ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ๋„ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ES2022์— ์ถ”๊ฐ€๋˜์—ˆ์œผ๋ฉฐ, ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์™€ Node.js์—์„œ ์ง€์›๋œ๋‹ค. 

// ๊ธฐ์กด์˜ async function
(async function func1() {
    const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
    const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
    console.log(data);
})();

// Top Level์—์„  async funciton ์ •์˜์—†์ด ๊ณง๋ฐ”๋กœ await ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค
const res = await fetch(url); // ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆผ
const data = await res.json(); // ์‘๋‹ต์„ JSON์œผ๋กœ ํŒŒ์‹ฑ
console.log(data);

 

 

 

 

 

 

์ถœ์ฒ˜: 

 

๐Ÿ“š ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Promise ๊ฐœ๋… & ๋ฌธ๋ฒ• ์ •๋ณตํ•˜๊ธฐ

์ฝœ๋ฐฑ ์ง€์˜ฅ์„ ํƒˆ์ถœํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ '๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ' ๋ž€ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ž‘์—…๊ณผ๋Š” ๋ณ„๋„๋กœ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ์ž‘์—…์€ ์‹œ๊ฐ„

inpa.tistory.com

 

 

๐Ÿ“š ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Async/Await ๊ฐœ๋… & ๋ฌธ๋ฒ• ์ •๋ณต

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ 3๊ฐ€์ง€ ๋ฐฉ์‹ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ์ž์ฃผ ์“ฐ์ธ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋™์ž‘๋˜๊ธฐ

inpa.tistory.com