๐Ÿš€ 06. async/await โ€” Promise๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋งˆ๋ฒ•์˜ ์‹ค์ฒด

2026๋…„ 3์›” 8์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

async/await์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์›๋ฆฌ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํŒจํ„ด, ๋ณ‘๋ ฌ ์ตœ์ ํ™”, ์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋น ์ง€๋Š” ํ•จ์ •๋“ค์„ ์™„์ „ ์ •๋ณตํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • async/await์ด Promise์˜ ๋ฌธ๋ฒ•์  ์„คํƒ•์ž„์„ ์ดํ•ดํ•˜๊ณ , ๋‚ด๋ถ€ ๋™์ž‘์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • try/catch๋กœ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ๋น ์ง์—†์ด ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • await์„ ๋‚จ๋ฐœํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ํ•จ์ • ์„ ์‹๋ณ„ํ•˜๊ณ  ์ตœ์ ํ™”ํ•œ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 20๋ถ„(์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 12๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
[async/await = Promise] โ†’ [์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ „๋žต] โ†’ [await ๋‚จ๋ฐœ ์„ฑ๋Šฅ ํ•จ์ •] โ†’ [์‹ค๋ฌด ํŒจํ„ด]

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

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

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

๐Ÿฃ ์˜์ฒ : "์˜ํ˜ธ ๋‹˜, async/await ์“ฐ๋‹ˆ๊นŒ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์ฝ๊ธฐ ํŽธํ•ด์กŒ์–ด์š”! ๊ทผ๋ฐ ์˜์ˆ˜ ๋‹˜์ด ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ๋А๋ฆฌ๋‹ค๊ณ  ํ•˜์…”์„œ API ํ˜ธ์ถœ ํƒ€์ด๋ฐ์„ ๋ณด๋‹ˆ๊นŒ... ๊ฒŒ์‹œ๊ธ€, ์ž‘์„ฑ์ž, ๋Œ“๊ธ€์„ ํ•˜๋‚˜์”ฉ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋”๋ผ๊ณ ์š”. ์ˆœ์„œ๋Œ€๋กœ await ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฑด๊ฐ€์š”? ๋ญ”๊ฐ€ ์ง๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ์š”."

๐Ÿฆ ์˜ํ˜ธ: "์˜์ฒ  ๋‹˜, ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•ด์กŒ๋„ค์š”! ๊ทธ๋Ÿฐ๋ฐ await์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ˆœ์„œ๋Œ€๋กœ ์“ฐ๋ฉด ์ฝ”๋“œ๊ฐ€ ์™„์ „ํžˆ ์ง๋ ฌ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์„ ์ฃผ์˜ํ•ด์•ผ ํ•ด์š”. 1์ดˆ์งœ๋ฆฌ ์š”์ฒญ 3๊ฐœ๋ฅผ ๊ฐ๊ฐ await ํ•˜๋ฉด 3์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ฑฐ๋“ ์š”. ๋งŒ์•ฝ ์„ธ API๊ฐ€ ์„œ๋กœ๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด Promise.all๋กœ ๋™์‹œ์— ๋‚ ๋ ค๋ณด์„ธ์š”. 1์ดˆ ๋งŒ์— ๋๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”."


๐Ÿค” 1. ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€?

์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด ์˜์ฒ ์ด PR์— ๋‹จ๊ณจ๋กœ ๋‚จ๊ธฐ๋Š” ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์žˆ๋‹ค: "async/await ์„ 'ํŽธํ•œ ๋ฌธ๋ฒ•'์œผ๋กœ๋งŒ ์“ฐ๋ฉด ๋ฐ˜๋“œ์‹œ ํ•จ์ •์— ๋น ์ง‘๋‹ˆ๋‹ค." async/await์€ ํ˜„๋Œ€ JS ๋น„๋™๊ธฐ ์ฝ”๋“œ์˜ ํ‘œ์ค€ ๋ฌธ๋ฒ• ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ "ํŽธํ•œ ๋ฌธ๋ฒ•"์œผ๋กœ๋งŒ ์•Œ๊ณ  ์“ฐ๋ฉด ๋ฐ˜๋“œ์‹œ ํ•จ์ •์— ๋น ์ง„๋‹ค. ๋‚ด๋ถ€๊ฐ€ Promise๋ผ๋Š” ๊ฑธ ์•Œ์•„์•ผ:

  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๋น ๋œจ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
  • ๋ถˆํ•„์š”ํ•œ ์ง๋ ฌ ์‹คํ–‰์œผ๋กœ ์„ฑ๋Šฅ์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฐ˜ํ™˜๊ฐ’์ด Promise์ž„์„ ์ดํ•ดํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์กฐํ•ฉํ•œ๋‹ค.

โš™๏ธ 2. async/await์˜ ๋ณธ์งˆ

async ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค

async๊ฐ€ ๋ถ™์€ ํ•จ์ˆ˜๋Š” ์ด๋ฏธ ์•ฝ์†(Promise)์ด ๋‚ดํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์—์„œ ํ‰๋ฒ”ํ•œ ๋ฌธ์ž์—ด์ด๋‚˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„, ์—”์ง„์ด ์ •์„ฑ์Šค๋Ÿฝ๊ฒŒ Promise๋กœ ๊ฐ์‹ธ์„œ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

// async ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ
async function getPostTitle() {
  return "ํด๋กœ์ € ์™„์ „์ •๋ณต"; // ๋‹จ์ˆœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด๋„...
}
 
const result = getPostTitle();
console.log(result); // Promise { 'ํด๋กœ์ € ์™„์ „์ •๋ณต' } โ€” Promise๋กœ ๋ž˜ํ•‘๋จ!
 
// .then์œผ๋กœ ๊ฐ’ ๊บผ๋‚ด๊ธฐ
result.then((title) => console.log(title)); // "ํด๋กœ์ € ์™„์ „์ •๋ณต"
 
// ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ async ํ•จ์ˆ˜์—์„œ await์œผ๋กœ
async function main() {
  const title = await getPostTitle(); // "ํด๋กœ์ € ์™„์ „์ •๋ณต"
  console.log(title);
}

await์˜ ๋™์ž‘ ์›๋ฆฌ

await์€ "์ž ์‹œ๋งŒ์š”, ์ด ์ž‘์—…์ด ๋๋‚  ๋•Œ๊นŒ์ง€๋งŒ ๋ฉˆ์ถฐ์ฃผ์„ธ์š”"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‰ฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋งŒ ์ž ์‹œ ๋ฉˆ์ท„์„ ๋ฟ, ๋‹ค๋ฅธ ๊ธ‰ํ•œ ์ผ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Ÿฌ ๊ฐ€์ฃ .

// async/await โ†” Promise ์™„๋ฒฝ ๋Œ€์‘
 
// Promise ์ฒด์ด๋‹ ๋ฒ„์ „
function loadPost(id) {
  return fetchPost(id)
    .then((post) => fetchUser(post.authorId))
    .then((author) => ({ post, author }));
}
 
// async/await ๋ฒ„์ „ (์™„์ „ํžˆ ๋™์ผํ•œ ๋™์ž‘)
async function loadPost(id) {
  const post = await fetchPost(id);
  const author = await fetchUser(post.authorId); // post.authorId ์˜์กด โ†’ ์ˆœ์ฐจ ํ•„์š”
  return { post, author };
}
 
// ๋‘˜ ๋‹ค Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘
loadPost(1).then(({ post, author }) => console.log(post, author));

๐Ÿ›ก๏ธ 3. ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํŒจํ„ด

try/catch/finally

์—๋Ÿฌ ์ฒ˜๋ฆฌ๋Š” ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด "์žกํžˆ์ง€ ์•Š์€ ์—๋Ÿฌ๋Š” ์–ด๋””์„œ ํ„ฐ์งˆ์ง€ ๋ชจ๋ฅด๋Š” ์‹œํ•œํญํƒ„๊ณผ ๊ฐ™๋‹ค"๊ณ  ๊ฐ•์กฐํ•œ ๊ธฐ๋ณธ ํŒจํ„ด์„ ์ตํ˜€๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

// โœ… ๊ธฐ๋ณธ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
async function loadPostDetail(postId) {
  try {
    const post = await fetchPost(postId);
    const comments = await fetchComments(postId);
    return { post, comments };
  } catch (err) {
    // ์–ด๋А await์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋„ ์—ฌ๊ธฐ์„œ ์žกํž˜
    console.error("๊ฒŒ์‹œ๊ธ€ ๋กœ๋“œ ์‹คํŒจ:", err.message);
    throw err; // ํ•„์š”ํ•˜๋ฉด ์œ„๋กœ ๋‹ค์‹œ throw
  } finally {
    // ์„ฑ๊ณต/์‹คํŒจ ๋ฌด๊ด€ํ•˜๊ฒŒ ํ•ญ์ƒ ์‹คํ–‰
    setLoading(false);
  }
}
 
// โŒ ํ”ํ•œ ์‹ค์ˆ˜ โ€” async ํ•จ์ˆ˜๋ฅผ .catch ์—†์ด ํ˜ธ์ถœ
loadPostDetail(1); // Promise๊ฐ€ reject๋ผ๋„ ์•„๋ฌด๋„ ์•ˆ ์žก์Œ โ†’ Unhandled Promise Rejection
 
// โœ… ํ˜ธ์ถœ ์ธก์—์„œ๋„ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ํ•„์š”
try {
  const data = await loadPostDetail(1);
  render(data);
} catch (err) {
  showError(err.message);
}

์—๋Ÿฌ ๋ž˜ํผ ํŒจํ„ด (Go ์Šคํƒ€์ผ)

์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์ด Go ์–ธ์–ด๋ฅผ ํ•˜๋‹ค JS ํŒ€์— ๊ฐ€์ ธ์˜จ ํŒจํ„ด์ด๋‹ค. ๋งค๋ฒˆ try/catch๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒŒ ๋ฒˆ๊ฑฐ๋กœ์šธ ๋•Œ, ์—๋Ÿฌ๋ฅผ ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์˜์ฒ ์ด๊ฐ€ ์ฒ˜์Œ ๋ณด๊ณ  "์ด๊ฑฐ ์ข€ ๋‚ฏ์„ ๋ฐ์š”?"๋ผ๊ณ  ํ–ˆ์ง€๋งŒ, ๋ง‰์ƒ ์จ๋ณด๋‹ˆ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๋น ๋œจ๋ฆฌ๊ธฐ๊ฐ€ ์˜คํžˆ๋ ค ๋” ์–ด๋ ค์›Œ์กŒ๋‹ค.

// ๋ž˜ํผ ์œ ํ‹ธ๋ฆฌํ‹ฐ
async function to(promise) {
  try {
    const data = await promise;
    return [null, data]; // [์—๋Ÿฌ, ๋ฐ์ดํ„ฐ]
  } catch (err) {
    return [err, null];
  }
}
 
// ์‚ฌ์šฉ โ€” try/catch ์—†์ด ๊น”๋”ํ•˜๊ฒŒ
async function loadPostDetail(postId) {
  const [postErr, post] = await to(fetchPost(postId));
  if (postErr) {
    console.error("๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ์‹คํŒจ:", postErr);
    return null;
  }
 
  const [commentsErr, comments] = await to(fetchComments(postId));
  if (commentsErr) {
    // ๋Œ“๊ธ€์€ ์‹คํŒจํ•ด๋„ ๊ฒŒ์‹œ๊ธ€์€ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Œ
    console.warn("๋Œ“๊ธ€ ์กฐํšŒ ์‹คํŒจ, ๋นˆ ๋ฐฐ์—ด๋กœ ๋Œ€์ฒด");
    return { post, comments: [] };
  }
 
  return { post, comments };
}

โšก 4. ์„ฑ๋Šฅ ์ตœ์ ํ™” โ€” await ๋‚จ๋ฐœ ๊ธˆ์ง€

await์„ ๊ธฐ๊ณ„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด, ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋“ค์„ ๊ดœํžˆ ์ค„ ์„ธ์›Œ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ๋งŒ๋“œ๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์˜์ฒ ์ด์˜ ์ฝ”๋“œ๊ฐ€ ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜์˜ ์†๊ธธ์„ ๊ฑฐ์ณ ์–ด๋–ป๊ฒŒ 3๋ฐฐ ๋นจ๋ผ์กŒ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

// โŒ ์ˆœ์ง„ํ•œ ์ฝ”๋“œ โ€” ์ง๋ ฌ ์‹คํ–‰ (์ด 3์ดˆ+)
// ๐Ÿฃ ์˜์ฒ ์˜ ์ฝ”๋“œ
async function loadDashboard(userId) {
  const posts = await fetchPosts(userId);    // 1์ดˆ ๋Œ€๊ธฐ
  const friends = await fetchFriends(userId); // 1์ดˆ ๋Œ€๊ธฐ (posts์™€ ๋ฌด๊ด€ํ•œ๋ฐ๋„ ๊ธฐ๋‹ค๋ฆผ!)
  const notifications = await fetchNotifications(userId); // 1์ดˆ ๋Œ€๊ธฐ
  return { posts, friends, notifications };
}
 
// โœ… ๋ณ‘๋ ฌ ์‹คํ–‰ โ€” Promise.all (์ด ~1์ดˆ)
// ๐Ÿฆ ์˜ํ˜ธ์˜ ๋ฆฌํŒฉํ† ๋ง
async function loadDashboard(userId) {
  const [posts, friends, notifications] = await Promise.all([
    fetchPosts(userId),
    fetchFriends(userId),
    fetchNotifications(userId),
  ]);
  // ์„ธ ์š”์ฒญ์ด ๋™์‹œ์— ์‹œ์ž‘๋˜์–ด ๊ฐ€์žฅ ๋А๋ฆฐ ์š”์ฒญ ์‹œ๊ฐ„๋งŒํผ๋งŒ ๋Œ€๊ธฐ
  return { posts, friends, notifications };
}
 
// โœ… ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ์„ ๋•Œ โ€” ๋ถ€๋ถ„์  ๋ณ‘๋ ฌ
async function loadPostWithRelated(postId) {
  const post = await fetchPost(postId); // post.authorId๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋จผ์ €
 
  // post ์–ป์€ ๋’ค, author์™€ comments๋Š” ์„œ๋กœ ๋…๋ฆฝ์  โ†’ ๋™์‹œ์—
  const [author, comments] = await Promise.all([
    fetchUser(post.authorId),
    fetchComments(postId),
  ]);
 
  return { post, author, comments };
}

ํŒ๋‹จ ๊ธฐ์ค€:

์ƒํ™ฉํŒจํ„ด์ด์œ 
A, B, C๊ฐ€ ์„œ๋กœ ๋…๋ฆฝ์ Promise.all([A, B, C])๋ณ‘๋ ฌ๋กœ ์ตœ๋Œ€ ์„ฑ๋Šฅ
B๊ฐ€ A์˜ ๊ฒฐ๊ณผ์— ์˜์กดawait A โ†’ await B์ˆœ์„œ๊ฐ€ ๊ฐ•์ œ๋จ
์ผ๋ถ€ ์‹คํŒจ ํ—ˆ์šฉPromise.allSettled([...])๋ถ€๋ถ„ ๊ฒฐ๊ณผ ํ™œ์šฉ
ํƒ€์ž„์•„์›ƒ ํ•„์š”Promise.race([request, timeout])์ œํ•œ ์‹œ๊ฐ„ ์„ค์ •

๐Ÿ”„ 5. ์‹ค๋ฌด ํŒจํ„ด ๋ชจ์Œ

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

// ํŒจํ„ด 1: ๋ฃจํ”„ ๋‚ด ๋น„๋™๊ธฐ โ€” for...of vs map
const postIds = [1, 2, 3, 4, 5];
 
// โŒ forEach + async โ€” ๋™์ž‘ ์•ˆ ํ•จ (forEach๋Š” Promise ๋ฌด์‹œ)
postIds.forEach(async (id) => {
  const post = await fetchPost(id); // await์ด ๋ฌด์˜๋ฏธ
  console.log(post);
});
 
// โœ… for...of โ€” ์ˆœ์ฐจ ์ฒ˜๋ฆฌ (์•ž ์™„๋ฃŒ ํ›„ ๋‹ค์Œ ์‹œ์ž‘)
for (const id of postIds) {
  const post = await fetchPost(id);
  console.log(post);
}
 
// โœ… map + Promise.all โ€” ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ (๋ชจ๋‘ ๋™์‹œ ์‹œ์ž‘)
const posts = await Promise.all(postIds.map((id) => fetchPost(id)));
 
// ํŒจํ„ด 2: ์žฌ์‹œ๋„ ๋กœ์ง (Retry)
async function fetchWithRetry(url, maxRetries = 3) {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      return await fetch(url).then((r) => r.json());
    } catch (err) {
      if (attempt === maxRetries) throw err;
      await new Promise((resolve) => setTimeout(resolve, attempt * 1000)); // ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„
    }
  }
}
 
// ํŒจํ„ด 3: ์ทจ์†Œ ๊ฐ€๋Šฅํ•œ ๋น„๋™๊ธฐ (AbortController)
async function fetchPostCancellable(postId, signal) {
  const response = await fetch(`/api/posts/${postId}`, { signal });
  if (!response.ok) throw new Error(`HTTP ${response.status}`);
  return response.json();
}
 
// ์‚ฌ์šฉ
const controller = new AbortController();
const postPromise = fetchPostCancellable(1, controller.signal);
 
// 3์ดˆ ํ›„ ์ทจ์†Œ
setTimeout(() => controller.abort(), 3000);
 
try {
  const post = await postPromise;
} catch (err) {
  if (err.name === "AbortError") console.log("์š”์ฒญ ์ทจ์†Œ๋จ");
}

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. ์•„๋ž˜ ์ฝ”๋“œ์—์„œ ์‹ค์ œ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์–ผ๋งˆ์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๋ผ.

async function loadProfile(userId) {
  const posts = await fetchPosts(userId);       // 2์ดˆ
  const followers = await fetchFollowers(userId); // 1์ดˆ
  const following = await fetchFollowing(userId); // 1์ดˆ
  return { posts, followers, following };
}

โœ… ์ •๋‹ต: ํ˜„์žฌ ์ด 4์ดˆ. Promise.all๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ตœ๋Œ€ 2์ดˆ๋กœ ๋‹จ์ถ•.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์„ธ API๊ฐ€ ์„œ๋กœ ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ˆœ์ฐจ ์‹คํ–‰ํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค.
  • ์ตœ์ ํ™”:
    async function loadProfile(userId) {
      const [posts, followers, following] = await Promise.all([
        fetchPosts(userId),       // ๋™์‹œ ์‹œ์ž‘
        fetchFollowers(userId),   // ๋™์‹œ ์‹œ์ž‘
        fetchFollowing(userId),   // ๋™์‹œ ์‹œ์ž‘
      ]);
      return { posts, followers, following };
    }
    // ์ด ๋Œ€๊ธฐ ์‹œ๊ฐ„ = ๊ฐ€์žฅ ๊ธด ์š”์ฒญ ์‹œ๊ฐ„ = 2์ดˆ
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "await์ด ์—ฌ๋Ÿฌ ๊ฐœ ๋‚˜๋ž€ํžˆ ์žˆ์œผ๋ฉด ์˜์‹ฌํ•˜๋ผ. ์˜์กด์„ฑ์ด ์—†์œผ๋ฉด Promise.all๋กœ ๋ฌถ์–ด๋ผ."

Q2. async ํ•จ์ˆ˜์—์„œ throwํ•œ ์—๋Ÿฌ๋Š” ์–ด๋–ป๊ฒŒ ์ „ํŒŒ๋˜๋Š”๊ฐ€?

โœ… ์ •๋‹ต: async ํ•จ์ˆ˜ ๋‚ด์—์„œ throw๋œ ์—๋Ÿฌ๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” Promise๋ฅผ reject ์‹œํ‚จ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

async function willFail() {
  throw new Error("์‹คํŒจ!");
}
 
// willFail()์ด ๋ฐ˜ํ™˜ํ•˜๋Š” Promise๋Š” reject๋จ
willFail()
  .then(() => console.log("์„ฑ๊ณต")) // ์‹คํ–‰ ์•ˆ ๋จ
  .catch((err) => console.error(err.message)); // "์‹คํŒจ!" โœ…
 
// async/await์œผ๋กœ ์žก๊ธฐ
try {
  await willFail();
} catch (err) {
  console.error(err.message); // "์‹คํŒจ!" โœ…
}
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "async ํ•จ์ˆ˜ ์•ˆ์˜ throw = Promise์˜ reject. async ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์—์„œ ๋ฐ˜๋“œ์‹œ .catch ๋˜๋Š” try/catch๋กœ ์žก์•„์•ผ ํ•œ๋‹ค."

Q3. ์˜์ฒ ์ด์˜ ํ…Œ์ŠคํŠธ ํƒ€์ž„ โ€” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ํŒ€ ํšŒ์˜

ํŒ€ ํšŒ์˜์—์„œ ์˜์ˆ˜ PM์ด ๋งํ•œ๋‹ค: "API ์š”์ฒญ ์ค‘์— ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚˜๋ฉด ์š”์ฒญ์ด ๊ณ„์† ๋‚ ์•„๊ฐ€๋Š” ๊ฑฐ ๋งž์ฃ ? ๊ทธ๊ฑฐ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋‚˜์š”?"

์˜์ฒ ์ด๊ฐ€ AbortController๋ฅผ ์ œ์•ˆํ–ˆ๋‹ค. ๊ฐ ํŒ€์›์˜ ๊ด€์ ์—์„œ ์ด ๊ธฐ์ˆ ์˜ ๋ช…๊ณผ ์•”์€?

โœ… ์ •๋‹ต: AbortController๋Š” ๋ธŒ๋ผ์šฐ์ € ๋‚ด์žฅ API๋กœ ์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์š”์ฒญ ์ทจ์†Œ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ง์ ‘ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  Node.js ๊ตฌ๋ฒ„์ „์—์„œ๋Š” ์ง€์›์ด ์ œํ•œ๋œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ๐Ÿฆ ์˜ํ˜ธ (์›๋ฆฌ): "AbortController๋Š” Fetch API์™€ ํ†ตํ•ฉ๋œ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์•ผ. signal์„ ๋„˜๊ธฐ๋ฉด abort() ํ˜ธ์ถœ ์‹œ fetch๊ฐ€ AbortError๋ฅผ throwํ•ด. ์›๋ฆฌ์ƒ ๊นจ๋—ํ•˜๊ณ  ํ‘œ์ค€์ด์•ผ."
  • ๐Ÿ‘” ์˜์ˆ˜ (์•ˆ์ •์„ฑ): "React Query๋‚˜ SWR ์“ฐ๋ฉด ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ์ž๋™์œผ๋กœ ์ทจ์†Œํ•ด์ฃผ๊ฑฐ๋“ . ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด ๋ˆ„๋ฝ ์œ„ํ—˜์ด ์žˆ์–ด. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉ์„ ๊ฒ€ํ† ํ•˜์ž."
  • ๐ŸŽจ ์˜์ˆ™ (UX): "์ทจ์†Œ ์•ˆ ๋˜๋ฉด ํŽ˜์ด์ง€ ์ „ํ™˜ ํ›„์—๋„ ๋„คํŠธ์›Œํฌ ํƒญ์— ์š”์ฒญ์ด ์Œ“์ด๊ณ , ๋Šฆ๊ฒŒ ์˜จ ์‘๋‹ต์ด ํ˜„์žฌ ํŽ˜์ด์ง€์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”. UX ๋ฒ„๊ทธ์˜ˆ์š”."
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "async ์š”์ฒญ์€ ๋ฐ˜๋“œ์‹œ ์ทจ์†Œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ณ ๋ คํ•˜๋ผ. ๋ฆฌ์•กํŠธ์—์„œ๋Š” useEffect cleanup์—์„œ controller.abort()๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž๋™ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•˜๋ผ."

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜์€ ์ง„์งœ "์•„, ์ด๋ž˜์„œ ๊ทธ๋žฌ๊ตฌ๋‚˜!"์˜ ์—ฐ์†์ด์—ˆ๋‹ค. await์„ ๋ฌด์ž‘์ • ์•ž์— ๋ถ™์ด๋ฉด ๋‹ค ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ง๋ ฌ๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋์„ ๋•Œ ์ข€ ๋œจ๋”ํ–ˆ๋‹ค. ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€๊ฐ€ ์™œ ๋А๋ ธ๋Š”์ง€ ์ด์ œ ์ดํ•ด๊ฐ€ ๋œ๋‹ค. ๋‹ค์Œ ์ฃผ์— Promise.all๋กœ ๋ฆฌํŒฉํ† ๋งํ•ด๋ด์•ผ์ง€.

์˜ํ˜ธ ๋‹˜์ด "async ํ•จ์ˆ˜ ์•ˆ์—์„œ throwํ•˜๋ฉด Promise reject์•ผ"๋ผ๋Š” ๋ง์ด ๊ณ„์† ๋จธ๋ฆฟ์†์— ๋งด๋ˆ๋‹ค. ๋‹จ์ˆœํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ์ด๊ฒŒ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ํ•ต์‹ฌ์ด๋”๋ผ.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "await์€ ์ฝ๊ธฐ ํŽธํ•œ ์ฝ”๋“œ๋ฅผ ์„ ์‚ฌํ•˜์ง€๋งŒ, ์ƒ๊ฐ ์—†์ด ์“ฐ๋ฉด ์„ฑ๋Šฅ์„ ๊ฐ‰์•„๋จน์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—… ์‚ฌ์ด์— ์˜์กด์„ฑ์ด ์—†๋‹ค๋ฉด, Promise.all๋กœ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์„ธ์š”."

์ด๋ฒˆ ์ฃผ JS ๊ธฐ์ดˆ ์Šคํ„ฐ๋”” ์ง„์งœ ์•Œ์ฐจ๋‹ค. ํ‡ด๊ทผ๊ธธ์— ์Œ์•… ๋“ค์œผ๋ฉด์„œ ์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ๋“ค ๋จธ๋ฆฟ์†์œผ๋กœ ํ•œ ๋ฒˆ ๋” ์ •๋ฆฌํ–ˆ๋‹ค. ๋‚ด์ผ ์ด๋ฒคํŠธ ๋ฃจํ”„ ์ฑ•ํ„ฐ๋ผ๋Š”๋ฐ โ€” ๋“ค์–ด๋Š” ๋ดค๋Š”๋ฐ ์ œ๋Œ€๋กœ ์ดํ•ดํ•œ ์ ์€ ์—†๋Š” ์ฃผ์ œ๋ผ ๊ธฐ๋Œ€ ๋ฐ˜ ๊ฑฑ์ • ๋ฐ˜์ด๋‹ค.


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ