๐ŸŽจ Frontend/JavaScript

[JavaScript] ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

devCloud 2026. 3. 30. 16:53

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

1. ๋™๊ธฐ vs ๋น„๋™๊ธฐ

๋™๊ธฐ(Synchronous)

  • ์ฝ”๋“œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ์ž‘์—…์ด ๋Œ€๊ธฐ
  • ์ด์ „ ์ž‘์—…์ด ๋๋‚˜์•ผ ๋‹ค์Œ ์ž‘์—… ์‹œ์ž‘

๋น„๋™๊ธฐ(Asynchronous)

  • ํŠน์ • ์ฝ”๋“œ์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ฆ‰์‹œ ์‹คํ–‰
  • ๋ธ”๋กœํ‚น(Blocking) ์—†์Œ: ์‹คํ–‰ ํ๋ฆ„์ด ๋ฉˆ์ถ”์ง€ ์•Š์Œ
  • ์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ ์•ˆ ๋จ: ์ฝ”๋“œ ์ž‘์„ฑ ์ˆœ์„œ์™€ ์‹คํ–‰ ์™„๋ฃŒ ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ

๐Ÿ’ก ๋น„๋™๊ธฐ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ : ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ค‘์—๋„ UI๊ฐ€ ์‘๋‹ต ๊ฐ€๋Šฅ
  • ํšจ์œจ์„ฑ: ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ํŒŒ์ผ ์ฝ๊ธฐ ๋“ฑ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ์ค‘์—๋„ ๋‹ค๋ฅธ ์ž‘์—… ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

2. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์˜ ์ง„ํ™”

2.1 ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ฐฉ์‹

๋ฌธ์ œ์ :

  • ์ฝœ๋ฐฑ ํ—ฌ(Callback Hell): ์ค‘์ฒฉ๋œ ์ฝœ๋ฐฑ์œผ๋กœ ์ฝ”๋“œ ๋ณต์žก๋„ ์ฆ๊ฐ€
  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์–ด๋ ค์›€: try-catch๋กœ ๋น„๋™๊ธฐ ์—๋Ÿฌ๋ฅผ ์žก์„ ์ˆ˜ ์—†์Œ
  • ๊ฒฐ๊ณผ๊ฐ’ ๋ฐ˜ํ™˜ ๋ถˆ๊ฐ€: ๋น„๋™๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์™ธ๋ถ€ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ return์œผ๋กœ ๋ฐ˜ํ™˜ ๋ถˆ๊ฐ€
// ์ฝœ๋ฐฑ ํ—ฌ ์˜ˆ์‹œ
getData(function(a) {
  getMoreData(a, function(b) {
    getEvenMoreData(b, function(c) {
      // ๊ณ„์† ์ค‘์ฒฉ...
    });
  });
});

2.2 Promise (ES6)

Promise๋ž€?

  • ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ตœ์ข… ์™„๋ฃŒ ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด
  • "๋ฏธ๋ž˜์˜ ์–ด๋–ค ์‹œ์ ์— ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒ ๋‹ค"๋Š” ์•ฝ์†

Promise ์ƒ์„ฑ ์‹œ ๋™์ž‘: Promise๋ฅผ ์ƒ์„ฑํ•˜๋ฉด executor ํ•จ์ˆ˜(์ฝœ๋ฐฑ)๊ฐ€ ์ฆ‰์‹œ ์‹คํ–‰๋จ

Promise์˜ 3๊ฐ€์ง€ ์ƒํƒœ (State) โญ

  • Pending(๋Œ€๊ธฐ): ์ดˆ๊ธฐ ์ƒํƒœ, ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์Œ
  • Fulfilled(์ดํ–‰): ์ž‘์—…์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋จ โ†’ resolve() ํ˜ธ์ถœ
  • Rejected(์‹คํŒจ): ์ž‘์—…์ด ์‹คํŒจํ•จ โ†’ reject() ํ˜ธ์ถœ
const promise = new Promise((resolve, reject) => {
  if (success) {
    resolve(result); // Fulfilled
  } else {
    reject(error);   // Rejected
  }
});

promise
  .then(result => console.log(result))
  .catch(error => console.error(error))
  .finally(() => console.log('์™„๋ฃŒ'));

2.3 async/await (ES8)

  • Promise๋ฅผ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ž‘์„ฑ ๊ฐ€๋Šฅ (๊ฐ€๋…์„ฑ ํ–ฅ์ƒ)
  • try-catch๋กœ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
async function fetchData() {
  try {
    const response = await fetch('/api/data');
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('์—๋Ÿฌ ๋ฐœ์ƒ:', error);
  }
}

3. Promise ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฉ”์„œ๋“œ

Promise.all()

  • ์—ฌ๋Ÿฌ Promise๋ฅผ ๋ณ‘๋ ฌ ์‹คํ–‰ํ•˜๊ณ  ๋ชจ๋‘ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  • ๊ฒฐ๊ณผ ์ˆœ์„œ ๋ณด์žฅ (์‹คํ–‰ ์ˆœ์„œ์™€ ๋™์ผ)
  • ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ์ฆ‰์‹œ reject ๋ฐ˜ํ™˜

Promise.race()

  • ๊ฐ€์žฅ ๋จผ์ € ์™„๋ฃŒ๋˜๋Š” Promise์˜ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ (์„ฑ๊ณต/์‹คํŒจ ์ƒ๊ด€์—†์Œ)

โ€ป ๋ชจ๋“  Promise ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ๋™์‹œ์— ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค (์ˆœ์ฐจ ์‹คํ–‰ X).


4. ํ•ต์‹ฌ ์ •๋ฆฌ

๋ฐฉ์‹ ์žฅ์  ๋‹จ์ 
์ฝœ๋ฐฑ ๊ฐ„๋‹จํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ—ฌ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์–ด๋ ค์›€
Promise ๊ฐ€๋…์„ฑ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์šฉ์ด ์žฅํ™ฉํ•œ ์ฒด์ด๋‹(.then)
async/await ์ตœ๊ณ ์˜ ๊ฐ€๋…์„ฑ (๋™๊ธฐ์  ์ฝ”๋“œ) Promise ๊ธฐ๋ฐ˜ ์ง€์‹ ํ•„์ˆ˜

ํ•™์Šต ํฌ์ธํŠธ ๐Ÿ’ก

  • Promise์˜ 3๊ฐ€์ง€ ์ƒํƒœ(Pending, Fulfilled, Rejected) ์ˆ™์ง€
  • Promise.all๊ณผ Promise.race์˜ ์ฐจ์ด ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„
  • async/await์€ Promise์˜ syntactic sugar์ด๋ฏ€๋กœ ์›๋ฆฌ ์ดํ•ด ์„ ํ–‰ ํ•„์š”

'๐ŸŽจ Frontend > JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JavaScript] Event Loop  (0) 2026.03.30
[JavaScript] ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ  (0) 2026.03.30