๐Ÿ—‚๏ธ ๋™๊ธฐ / ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

๊น€์ˆ˜์ง„ยท2025๋…„ 5์›” 27์ผ

๋™๊ธฐ(Synchronous) ์ฒ˜๋ฆฌ

์š”์ฒญํ•œ ์ž‘์—…์ด ์ˆœ์„œ๋Œ€๋กœ ์ฐจ๋ก€์ฐจ๋ก€ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ”๋“œ ์‹คํ–‰ํ•œ๋‹ค.
๋А๋ฆฐ ์ž‘์—…์ด ์žˆ์œผ๋ฉด ์ „์ฒด ํ๋ฆ„์„ ๋ฉˆ์ถ˜๋‹ค.

console.log("1");
console.log("2");
console.log("3");

์ถœ๋ ฅ๊ฒฐ๊ณผ:

1  
2  
3

๋น„๋™๊ธฐ(Asynchronous) ์ฒ˜๋ฆฌ

์š”์ฒญํ•œ ์ž‘์—…์ด ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.
ํŠน์ • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ฌ๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ) ์›น์—์„œ์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ/์‘๋‹ต, ํƒ€์ด๋จธ, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

console.log("1");

setTimeout(() => {
  console.log("2");
}, 1000); // 1์ดˆ ํ›„ ์‹คํ–‰

console.log("3");

์ถœ๋ ฅ๊ฒฐ๊ณผ:

1  
3  
2  โ† 1์ดˆ ๋’ค์— ์‹คํ–‰๋จ

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ•„์š”ํ•œ ์ด์œ ?

๐Ÿ‘‰ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋งค์šฐ ์ค‘์š”ํ•œ ์›น์—์„œ๋Š” ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์›นํŽ˜์ด์ง€๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ฒŒ ํ•ด์•ผํ•œ๋‹ค!

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

๋ฐฉ๋ฒ•์„ค๋ช…์˜ˆ์‹œ
์ฝœ๋ฐฑ ํ•จ์ˆ˜์™„๋ฃŒ๋˜๋ฉด ํ˜ธ์ถœ๋  ํ•จ์ˆ˜ ์ „๋‹ฌsetTimeout(fn, 1000)
Promise๋น„๋™๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋กœ ๋‹ค๋ฃธfetch().then(...)
async/await๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์ฒ˜๋Ÿผ ์ž‘์„ฑawait axios.get(...)

๐Ÿ“Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

ํ•จ์ˆ˜์— "์ž‘์—…์ด ๋๋‚˜๋ฉด ์‹คํ–‰ํ•  ๋‹ค๋ฅธ ํ•จ์ˆ˜"๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

// 1์ดˆ ๋’ค์— ์‹คํ–‰๋  ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ
console.log("1");

setTimeout(() => {
  // ์ด ๋ถ€๋ถ„์€ 1์ดˆ๊ฐ€ ์ง€๋‚˜์•ผ ์‹คํ–‰๋จ
  console.log("2 (1์ดˆ ํ›„ ์‹คํ–‰๋จ)");
}, 1000);

console.log("3");
// 1 โ†’ 3 โ†’ (1์ดˆ ๋’ค) โ†’ 2 ์ˆœ์„œ๋กœ ์ถœ๋ ฅ๋จ

โœ… ์žฅ์ 
๊ฐ„๋‹จํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์— ์œ ์šฉ

โŒ ๋‹จ์ 
์ฝœ๋ฐฑ ์•ˆ์— ์ฝœ๋ฐฑ์ด ๋˜ ๋“ค์–ด๊ฐ€๋ฉด ์ฝœ๋ฐฑ ์ง€์˜ฅ์ด ๋ฐœ์ƒ

doSomething(() => {
  doNext(() => {
    doMore(() => {
      console.log("์ฝœ๋ฐฑ ์ง€์˜ฅ...");
    });
  });
});

๐Ÿ“Œ Promise

๋น„๋™๊ธฐ ์ž‘์—…์˜ ์„ฑ๊ณต(resolve) ๋˜๋Š” ์‹คํŒจ(reject)๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด .then()๊ณผ .catch()๋กœ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

// fetch๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•จ
fetch("https://jsonplaceholder.typicode.com/users")
  .then((res) => {
    // ์„œ๋ฒ„ ์‘๋‹ต(res)์„ JSON ๋ฐ์ดํ„ฐ๋กœ ํŒŒ์‹ฑ
    return res.json();
  })
  .then((data) => {
    // ํŒŒ์‹ฑ๋œ ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ
    console.log("์„ฑ๊ณต:", data);
  })
  .catch((err) => {
    // ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ:", err);
  });

โœ… ์žฅ์ 
์ฝœ๋ฐฑ๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ์ข‹์Œ
.then() ์ฒด์ธ์œผ๋กœ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ์ œ์–ด ๊ฐ€๋Šฅ

โŒ ๋‹จ์ 
.then().then().catch() ์ฒด์ธ์ด ๊ธธ์–ด์ง€๋ฉด ์—ฌ์ „ํžˆ ๋ณต์žก

๐Ÿ“Œ async / await

Promise๋ฅผ ๋™๊ธฐ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ์“ฐ๋Š” ๋ฌธ๋ฒ•
async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ await ์‚ฌ์šฉ ๊ฐ€๋Šฅ

// async ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๋ฉด ์ด ํ•จ์ˆ˜ ์•ˆ์—์„œ await ์‚ฌ์šฉ ๊ฐ€๋Šฅ
async function loadUser() {
  try {
    // fetch๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ (await)
    const res = await fetch("https://jsonplaceholder.typicode.com/users");

    // ์‘๋‹ต์„ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
    const data = await res.json();

    // ์ตœ์ข… ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ
    console.log("์œ ์ € ๋ฐ์ดํ„ฐ:", data);
  } catch (error) {
    // ์ค‘๊ฐ„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด ๋ธ”๋ก์ด ์‹คํ–‰๋จ
    console.error("์—๋Ÿฌ ๋ฐœ์ƒ:", error);
  }
}

// ์œ„์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜ ์‹คํ–‰
loadUser();

โœ… ์žฅ์ 
๊ฐ€๋…์„ฑ ์ตœ๊ณ  (๋™๊ธฐ์ฒ˜๋Ÿผ ์ž‘์„ฑ ๊ฐ€๋Šฅ)
try-catch๋กœ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ฐ„ํŽธ

โŒ ๋‹จ์ 
async ํ•จ์ˆ˜ ์•ˆ์—์„œ๋งŒ await ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(์—ฌ๋Ÿฌ ์ž‘์—… ๋™์‹œ์—)๋Š” ๋ณ„๋„ ์ฒ˜๋ฆฌ ํ•„์š”

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