๐Ÿ”…๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ: Promise์™€ async/await

์œ ์Šน์ธยท2024๋…„ 12์›” 17์ผ
0
post-thumbnail

์ด์ „ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ๋ฐฉ์‹์—์„œ ์ดˆ๊ธฐ์— ์‚ฌ์šฉ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ์ ๋“ค๊ณผ ๋Œ€์ฒด ๊ฐœ๋…์œผ๋กœ ์ธํ•ด ํ˜„๋Œ€์—๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ ๋ฐฉ์‹์—์„œ ์ฃผ๋กœ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•ด์ฃผ๊ณ , ์ข€ ๋” ๊ฐ€๋…์„ฑ ์ข‹๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋“ฑ์žฅํ•œ Promise์™€ async/await ๋ฐฉ์‹์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์˜ค๋Š˜๋‚ ์— ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ € ์—ญ์‹œ๋„ ์‹ค์ œ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•ด๋ณธ Promise์™€ async/await์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Promise๋ž€โ“

Promise๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์ด ์–ด๋–ค ๋ฐฉ์‹์ธ๊ฐ€ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณธ๋‹ค๋ฉด

const promise = new Promise((resolve, reject) => {
  const success = true;  // ํ˜„์žฌ ์ด ๋ถ€๋ถ„์ด true๋ผ์„œ ๋น„๋™๊ธฐ ์ž‘์—…์€ resolve๋กœ ์‹คํ–‰
  if (success) {
    resolve("์ž‘์—… ์„ฑ๊ณต");
  } else {
    reject("์ž‘์—… ์‹คํŒจ");
  }
});

promise
  .then((result) => {
    console.log(result); // "์ž‘์—… ์„ฑ๊ณต"
  })
  .catch((error) => {
    console.error(error); // "์ž‘์—… ์‹คํŒจ"
  });

์œ„ ์˜ˆ์‹œ์—์„œ ๋ณผ์ˆ˜์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ Promise๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋Š” ์•ž์— new๋ฅผ ๋ถ™ํžˆ๊ณ  ์ƒ์„ฑ์ž ํ•จ์ˆ˜ Promise()๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ new Promise()๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Promise ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋Ÿฌํ•œ Promise ๊ฐ์ฒด๋Š” resolve์™€ reject๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
์ด๋•Œ resolve๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜์—ฌ ์„ฑ๊ณตํ•œ ๊ฒฐ๊ณผ๋ฅผ resolve์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๊ณ , reject๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํŒจํ–ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜์—ฌ ์‹คํŒจ ์ด์œ ๋ฅผ reject์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ then๊ณผ catch์˜ ํ›„์† ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ์˜ ์˜ˆ์ œ์ฝ”๋“œ์—์„œ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์„ฑ๊ณตํ•œ๋‹ค๋ฉด ์ž‘์—… ์„ฑ๊ณต, ์‹คํŒจํ•œ๋‹ค๋ฉด ์ž‘์—… ์‹คํŒจ๋ผ๊ณ  ์‹คํ–‰์ด ๋˜์–ด ์ง๊ด€์ ์œผ๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํ–‰ ๋˜์—ˆ๋Š”์ง€ ์‹คํŒจํ–ˆ๋Š”์ง€ ์•Œ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ Promise๋Š” Promise.all()์˜ ๋ฐฉ์‹๊ณผ Promise.race()์˜ ๋ฉ”์†Œ๋“œ ๋ฐฉ์‹์œผ๋กœ๋„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š”๋ฐ

1. Promise.all: ์—ฌ๋Ÿฌ Promise๋ฅผ ๊ฐ์ฒด๋กœ ๋ฐ›์•„์„œ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๊ณ , ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์™„๋ฃŒ๊ฐ€ ๋œ๋‹ค๋ฉด ํ•ด๋‹น ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

const promise1 = Promise.resolve("์ž‘์—… 1");
const promise2 = Promise.resolve("์ž‘์—… 2");

Promise.all([promise1, promise2])
  .then((results) => {
    console.log(results); // ["์ž‘์—… 1", "์ž‘์—… 2"]
  })
  .catch((error) => {
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ:", error);
  });

ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” promise1๊ณผ promise2๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰์‹œํ‚จ ํ›„ ๋‘๊ฐœ์˜ ์ž‘์—…์ด ๋ชจ๋‘ ์™„๋ฃŒ๊ฐ€ ๋ ๋•Œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2. Promise.race: Promise.race๋Š” Promise.all()๊ณผ ๋‹ค๋ฅด๊ฒŒ ์—ฌ๋Ÿฌ Promise ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ์™„๋ฃŒ๋œ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

const promise1 = new Promise((resolve) => setTimeout(resolve, 2000, "์ž‘์—… 1"));
const promise2 = new Promise((resolve) => setTimeout(resolve, 1000, "์ž‘์—… 2"));

Promise.race([slowPromise, fastPromise])
  .then((result) => {
    console.log(result); // "์ž‘์—… 2"
  });

ํ˜„์žฌ ์ฝ”๋“œ์—์„œ๋Š” timeout์ด ๋” ๋น ๋ฅธ promise2 ์ž‘์—…์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


ํ•˜์ง€๋งŒ ์ด๋Ÿฐ Promise์—์„œ๋„ ๋‹จ์ ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๋–จ์–ด์ง€๋Š” ๊ฐ€๋…์„ฑ์œผ๋กœ ์ธํ•œ ๋Œ€์ฒด์ž๋กœ Promise๊ฐ€ ๋‚˜์™”์ง€๋งŒ Promise ์—ญ์‹œ ์ฒด์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const fetchData1 = () => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("๋ฐ์ดํ„ฐ 1");
    }, 1000);
  });
};

const fetchData2 = (data) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(data + " + ๋ฐ์ดํ„ฐ 2");
    }, 1000);
  });
};

const fetchData3 = (data) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(data + " + ๋ฐ์ดํ„ฐ 3");
    }, 1000);
  });
};


fetchData1()
  .then((data1) => {
    console.log(data1);
    return fetchData2(data1); // ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
  })
  .then((data2) => {
    console.log(data2);
    return fetchData3(data2); // ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
  })
  .then((data3) => {
    console.log(data3); 
  })
  .catch((error) => {
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ:", error);
  });

ํ˜„์žฌ ์ด ์ฝ”๋“œ์—์„œ๋Š” fetchData1()์˜ ๊ฒฐ๊ณผ๋กœ fetchData2()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , fetchData2()์˜ ๊ฒฐ๊ณผ๋กœ fetchData3()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ด๋Ÿฐ fetchData๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ๋น„์Šทํ•œ ํ˜•ํƒœ๋กœ ์ฝ”๋“œ๊ฐ€ ๊นŠ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งŒ์•ฝ ์ค‘๊ฐ„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด .catch()์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๊ฐ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์„œ ๋น„๋™๊ธฐ ํ๋ฆ„ ์ถ”์ ์ด ์–ด๋ ค์›Œ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ์€ ์˜ˆ์‹œ๋ฅผ ๋“ค๊ธฐ์œ„ํ•ด fetchData 3๊ฐœ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์ด๋Ÿฐ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ๋กœ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก Promise์˜ ์—ฐ์†๋œ ์‚ฌ์šฉ์€ ๊ฐ€๋…์„ฑ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฐ ์ €ํ•˜๋œ ๊ฐ€๋…์„ฑ์„ ๋†’ํž์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ์š”์ฆ˜ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” async/await๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, async/await๋ž€โ“

async/await์€ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ฝœ๋ฐฑ์ง€์˜ฅ์„ ํ•ด๊ฒฐํ•˜๊ณ , Promise์˜ ์ฒด์ธ ๋ฐฉ์‹์œผ๋กœ ์ธํ•œ ๋–จ์–ด์ง„ ๊ฐ€๋…์„ฑ์„ ํ•ด๊ฒฐํ• ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ธ๋ฐ, async/await๋Š” Promise์˜ ์ฒด์ด๋‹ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. async/await ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…๋„ ์ข€ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Promise์™€ async/await์˜ ์ฐจ์ด์ ๐ŸŒ

ํŠน์ง•Promiseasync/await
๊ฐ€๋…์„ฑ์ฒด์ธ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ฝํ˜€ ๊ฐ€๋…์„ฑ์ด ๋†’์Œ
์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฐฉ์‹.catch( )๋ฅผ ์‚ฌ์šฉtry-catch๋กœ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌ
๊ตฌํ˜„๋ณต์žกํ•œ ๋น„๋™๊ธฐ ๋กœ์ง์—์„œ ์ฝ”๋“œ๊ฐ€ ์ค‘์ฒฉ๋˜๊ธฐ ์‰ฌ์›€๋ณต์žกํ•œ ๋กœ์ง๋„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ

์•„๊นŒ ์œ„์—์„œ Promise ์ฒด์ธ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋ฅผ async/await ๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์‚ดํŽด๋ณด๋ฉด

async function fetchData() {  // ํ•จ์ˆ˜๊ฐ€ ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜
  try {
    // await๋Š” ํ•ญ์ƒ async ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    const data1 = await fetchData1(); // await: Promise๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ.
    console.log(data1);

    const data2 = await fetchData2(data1);
    console.log(data2);

    const data3 = await fetchData3(data2);
    console.log(data3);
  } catch (error) {
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ:", error);
  }
}

fetchData();

์ด๋ ‡๊ฒŒ ์•„๊นŒ์˜ Promise ์ฝ”๋“œ ํ˜•์‹๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์™„์„ฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณธ ๋‘ ๋ฐฉ์‹โญ๏ธ

์ €๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋น„๋™๊ธฐ ๋ฐฉ์‹์„ ์ฒ˜๋ฆฌํ• ๋•Œ Promise์™€ async/await๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์ง์ ‘ ์‹ค์ œ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€ ๋™์ž‘ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์‚ฌ์‹ค ์ด ๋‘ ๋ฐฉ์‹์€ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ API ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ์„ ํ• ๋•Œ ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, API ํ˜ธ์ถœ์€ ๋งค์šฐ ํ•„์ˆ˜์ ์ด๊ณ  ์ค‘์š”ํ•˜์—ฌ ๋ฌด์กฐ๊ฑด ํ˜ธ์ถœ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”๋ฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ด๋Ÿฐ API ํ˜ธ์ถœ์—์„œ ์ œ์ผ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Promise์™€ async/await๋Š” ์ค‘์š”ํ•˜๊ณ  ์•Œ์•„์•ผํ•˜๋Š” ๊ฐœ๋…์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ œ๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹์€ ์œ„๋„์™€ ๊ฒฝ๋„๋ฅผ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” API ํ˜ธ์ถœ์„ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ, ์ด๋•Œ ์‚ฌ์šฉํ•œ navigator.geolocation API๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Promise์™€ async/await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ์‹ค์ œ๋กœ ์œ„๋„,๊ฒฝ๋„๋ฅผ ๋ฐ›์•„์˜ฌ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

export const getCurrentPosition = () => {
  return new Promise((resolve, reject) => {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(
        (position) => {
          resolve({
            latitude: position.coords.latitude,
            longitude: position.coords.longitude,
          });
        },
        (error) => reject(error),
      );
    } else {
      reject(new Error("๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜„ ์œ„์น˜๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค."));
    }
  });
};

// ํ˜„์žฌ ์œ„์น˜๋ฅผ ๋ณด๋‚ด์„œ ์œ„๋„, ๊ฒฝ๋„๋กœ ๋ณ€ํ™˜
export const getCoordinates = async () => {
  try {
    const position = await getCurrentPosition();
    const { latitude, longitude } = position;

    return {
      latitude: parseFloat(latitude),
      longitude: parseFloat(longitude),
    };
  } catch (error) {
    console.error("Error fetching coordinates:", error);
    throw error;
  }
};

์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณธ ์ฝ”๋“œ ์—ญ์‹œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ Promise์™€ async/await์˜ ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์„ ์ง€ํ‚ค๋ฉด์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์˜€๋Š”๋ฐ, getCurrentPosition ํ•จ์ˆ˜์—์„œ ์œ„์น˜ ์ขŒํ‘œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  getCoordinates ํ•จ์ˆ˜์—์„œ getCurrentPosition์„ ํ˜ธ์ถœํ•ด ์œ„์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ์˜๋ฌธ์ ์ด ์ƒ๊ธธ์ˆ˜ ์žˆ๋Š”๋ฐ, ์•„๊นŒ๋Š” Promise๋Š” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์ด๋Ÿฌํ•œ ๋Œ€์ฒด๋กœ async/await์ด ๋‚˜์™”๋Š”๋ฐ ์™œ ๊ตณ์ด ๋‘๊ฐœ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์˜์•„ํ• ์ˆ˜ ์žˆ์ง€๋งŒ Promise ๋ฐฉ์‹๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ geolocation.getCurrentPosition์€ ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด์„œ ์„ฑ๊ณต๊ณผ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ์„ž์—ฌ ์žˆ์—ˆ๊ธฐ์— ์ด๋ฅผ Promise๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .then๊ณผ .catch๋ฅผ ์‚ฌ์šฉํ•ด Promise๋ฅผ ํ†ตํ•œ ์ฒด๊ณ„์ ์ธ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด์˜€๊ณ , ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ API ํ˜ธ์ถœ๊ณผ ๊ฒฐํ•ฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Promise ์ฒด์ธ์ด ๋ณต์žกํ•˜์ง€ ์•Š์€ ์ด๊ณณ์—์„œ๋Š” ๋‘ ๋ฐฉ์‹์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Promise์™€ async/await ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ƒ๊ฐ๐Ÿ”–

์ €๋Š” Promise์™€ async/await๋ฅผ ์ง์ ‘ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐ์ž์˜ ์žฅ๋‹จ์ ์„ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  Promise์˜ ์žฅ์ ์€ ๋‹จ์ผ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๊ฐ„๋‹จํ•œ ์ฒด์ด๋‹์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Promise๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. ํŠนํžˆ, Promise.all() ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•  ๋•Œ ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค๊ธฐ์— ๋…๋ฆฝ์ ์œผ๋กœ API ํ˜ธ์ถœ์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด Promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์€ ๊ฐ„๋‹จํ•˜๋ฉด์„œ ์ข‹์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ Promise์˜ ๋ฐฉ์‹๊ณผ ๋น„๊ตํ•ด์„œ async/await์˜ ์žฅ์ ์„ ์‚ดํŽด๋ณธ๋‹ค๋ฉด ์—ญ์‹œ ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ํ๋ฆ„์—์„œ๋Š” async/await๊ฐ€ ํ›จ์”ฌ ์œ ๋ฆฌํ•˜๋‹ค๋Š”๊ฒƒ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ฐฉ์‹์—์„œ ๊ฐ๊ฐ์˜ ์ž‘์—… ๊ฐ„์ด ์„œ๋กœ์—๊ฒŒ ์˜์กด์„ฑ์ด ๊ฐ•ํ•˜๋‹ค๋ฉด, ์ด๊ฒƒ์„ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๊ณ  ์ด๋กœ์ธํ•˜์—ฌ ์–ด๋””์„œ๋ถ€ํ„ฐ ์ฝ”๋“œ๊ฐ€ ์ง„ํ–‰๋˜๋Š”์ง€ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๊ธฐ์— ๋” ์šฉ์ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—๋Ÿฌ์ฒ˜๋ฆฌ๋ฅผ try-catch๋ฅผ ํ†ตํ•ด ํ•œ๊ณณ์œผ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ›„์— ํ‹€๋ฆฐ๊ณณ์„ ์ฐพ์•„๋‚ด๊ฑฐ๋‚˜ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธด๋‹ค๋ฉด async/await์ด ๋” ์ข‹์€ ๋ฐฉ์‹์ด ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ async/await๋Š” Promise์˜ ์™„์ „ํ•œ ๋Œ€์ฒด ๊ด€๊ณ„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฒƒ๋ณด๋‹ค๋Š” ๋‘ ๋ฐฉ์‹์€ ์„œ๋กœ ๋ณด์™„ ๊ด€๊ณ„๋ผ๊ณ  ๋ณด๋Š” ๊ฒƒ์ด ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ฝœ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ API๋ฅผ Promise๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Promise.all๊ณผ async/await๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ๋‘ ๋ฐฉ์‹์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์œ ์ง€ํ•จ๊ณผ ๋™์‹œ์— ๋น„๋™๊ธฐ ์ž‘์—…์˜ ํšจ์œจ์„ฑ ๋˜ํ•œ ์ฆ๊ฐ€ ์‹œํ‚ฌ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ์‚ฌ์šฉ๋ฐฉ์‹๊ณผ ๊ฐœ๋…์„ ์ž˜ ์•Œ๊ณ  ๋น„๋™๊ธฐ ๋ฐฉ์‹์—์„œ๋Š” ๋‘ ๋ฐฉ์‹์„ ์ ์ ˆํ•˜๊ฒŒ ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!โญ•๏ธ





์ด๋ฏธ์ง€ ์ถœ์ฒ˜: https://sugandsingh5566.medium.com/demystifying-javascript-asynchronous-operations-promises-vs-async-await-e4dfdea043cc
์ฐธ๊ณ : https://umanking.github.io/2023/04/07/promise-all-vs-promise-race
https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EB%B9%84%EB%8F%99%EA%B8%B0%EC%B2%98%EB%A6%AC-async-await

profile
ํ•œ์ž… ๊ฐœ๋ฐœ์ž

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด