[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

2025. 9. 4. 23:04ยท๐Ÿ“š ํ”„๋ก ํŠธ์—”๋“œ/Javascript

โฑ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ (setTimeout)

// 1๋ฒˆ
let num = 1;

// 2๋ฒˆ
setTimeout(() => {
  num = 2;
}, 0);

// 3๋ฒˆ
num = 3;

console.log(num);

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด console.log(num)์€ ๋ฌด์—‡์„ ์ถœ๋ ฅํ• ๊นŒ?

console.log(num) // 3

๊ฒฐ๊ณผ๋Š” 3์ด ์ถœ๋ ฅ๋œ๋‹ค.

๊ทธ ์ด์œ ๋Š” setTimeout์ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

โ›“๏ธ setTimeout ์‹คํ–‰ ํ๋ฆ„

1. ๋™๊ธฐ์ฝ”๋“œ

  • ์ฝœ ์Šคํƒ(Call Stack)์— ๋“ค์–ด๊ฐ„ ์ฆ‰์‹œ ์‹คํ–‰๋œ๋‹ค.
  • 1๋ฒˆ (let num = 1), 3๋ฒˆ (num = 3), console.log(num)์ด ์ˆœ์„œ๋Œ€๋กœ ์ฝœ ์Šคํƒ์— ๋“ค์–ด๊ฐ€์„œ ์‹คํ–‰๋œ๋‹ค.

2. ๋น„๋™๊ธฐ ์ฝ”๋“œ

  • setTimeout ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋˜๋ฉด ์ž ๊น ์Šคํƒ์— ์˜ฌ๋ผ์™”๋‹ค๊ฐ€, ๋ฐ”๋กœ Web APIs ์˜์—ญ์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • Web APIs๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ›์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด, setTimeout์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ Callback Queue(Task Queue)๋กœ ๋ณด๋‚ธ๋‹ค.

3. ์ด๋ฒคํŠธ ๋ฃจํ”„

  • ์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋Š” ์ฝœ ์Šคํƒ์ด ๋น„์–ด ์žˆ๋Š”์ง€ ๊ณ„์† ํ™•์ธํ•œ๋‹ค.
  • ์ฝœ ์Šคํƒ์ด ๋น„๋ฉด, ํƒœ์Šคํฌ ํ์— ์Œ“์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ฝœ ์Šคํƒ์œผ๋กœ ์˜ฎ๊ฒจ์„œ ์‹คํ–‰ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ setTimeout์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” console.log(num)์ด ์‹คํ–‰๋œ ์ดํ›„์— ์ฝœ ์Šคํƒ์— ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ถœ๋ ฅ๋˜๋Š” ๊ฐ’์€ 2๊ฐ€ ์•„๋‹ˆ๋ผ 3์ด๋‹ค.

 

๐ŸŒ async/await

console.log("1");

async function getData() {
    // await #1
  const res = await fetch("https://jsonplaceholder.typicode.com/todos/1");
  // await #2
  const data = await res.json();
  console.log("2", data.title);
}

getData();

console.log("3");

์œ„ ์ฝ”๋“œ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ์ธ async ํ•จ์ˆ˜ ์˜ˆ์ œ์ด๋‹ค.

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

1
3
2 delectus aut autem

 

โ›“๏ธ async/await ์‹คํ–‰ ํ๋ฆ„

1. ๋™๊ธฐ ์ฝ”๋“œ

  • console.log("1") ์‹คํ–‰ → 1 ์ถœ๋ ฅ
  • ๋™๊ธฐ ์ฝ”๋“œ์ด๋ฏ€๋กœ ๋ฐ”๋กœ ์ฝœ ์Šคํƒ์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

2. async ํ•จ์ˆ˜ ์ง„์ž…

  • getData()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋‚ด๋ถ€์—์„œ fetch(...) ์‹คํ–‰ → ๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ Web APIs๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  • ๋™์‹œ์— fetch๋Š” Promise { <pending> }์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • await๋ฅผ ๋งŒ๋‚˜๋ฉด getData ํ•จ์ˆ˜๋Š” ์ผ์‹œ ์ค‘๋‹จ๋˜๊ณ , fetch Promise๊ฐ€ fulfilled๋  ๋•Œ await์˜ ๋‹ค์Œ ์ค„์ธ const data = await res.json();์ด ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ๋กœ ์˜ˆ์•ฝ๋œ๋‹ค.

3. ๋™๊ธฐ ์ฝ”๋“œ ๊ณ„์† ์‹คํ–‰

  • ์ฝœ ์Šคํƒ์ด ๋น„์—ˆ์œผ๋ฏ€๋กœ, ๋ฐ”๊นฅ์— ์žˆ๋Š” console.log("3") ์‹คํ–‰ → 3 ์ถœ๋ ฅ

4. ๋„คํŠธ์›Œํฌ ์‘๋‹ต (fetch ์™„๋ฃŒ ~ ๊ทธ ์ดํ›„)

  • ๋„คํŠธ์›Œํฌ ์‘๋‹ต์ด ์™„๋ฃŒ๋˜๋ฉด Promise๊ฐ€ fulfilled ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
  • ์ด๋•Œ ์˜ˆ์•ฝํ•ด ๋‘์—ˆ๋˜ ์ฝ”๋“œ๊ฐ€ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์— ์ „๋‹ฌ๋œ๋‹ค.
  • ํ์— ์ „๋‹ฌ๋œ ์ฝ”๋“œ๋ฅผ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ฝœ ์Šคํƒ์œผ๋กœ ์˜ฎ๊ฒจ์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • res.json()๋„ Promise { <pending> }์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋‹ค์‹œ await๋ฅผ ๋งŒ๋‚˜์„œ ๊ทธ ์•„๋ž˜ ์ฝ”๋“œ(console.log("2", data.title))๋Š” ๋‘ ๋ฒˆ์งธ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ๋กœ ์˜ˆ์•ฝ๋œ๋‹ค.
  • res.json()์ด fulfilled ๋˜๋ฉด console.log(”2”, data.title)๋Š” ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์— ์ „๋‹ฌ๋˜๊ณ  ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ฝœ์Šคํƒ์— ์ „๋‹ฌํ•ด์„œ ์‹คํ–‰ํ•œ๋‹ค.

 

โš–๏ธ setTimeout๊ณผ Promise์˜ ์ฐจ์ด์ 

  • setTimeout์˜ ์ฝœ๋ฐฑ → Task Queue(๋งคํฌ๋กœํƒœ์Šคํฌ ํ)์— ๋“ค์–ด๊ฐ„๋‹ค.
  • Promise์˜ then๊ณผ await, async → Microtask Queue(์žกํ)์— ๋“ค์–ด๊ฐ„๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํ•ญ์ƒ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๋ฅผ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

๊ฐ™์€ ์กฐ๊ฑด์ด๋ผ๋ฉด Promise์˜ ์ฝœ๋ฐฑ์ด setTimeout๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.

console.log("start");

setTimeout(() => {
  console.log("setTimeout");
}, 0);

Promise.resolve().then(() => {
  console.log("promise");
});

console.log("end");

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค.

start
end
promise
setTimeout

 

๐Ÿ’ก ํƒœ์Šคํฌ ํ์™€ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ ๋น„๊ต

๊ตฌ๋ถ„ ํƒœ์Šคํฌ ํ (๋งคํฌ๋กœํƒœ์Šคํฌ ํ) ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ (์žก ํ)
์ฃผ์š” ํ•ญ๋ชฉ setTimeout, setInterval, addEventListener, XMLHttpRequest ์ด๋ฒคํŠธ ๋“ฑ Promise์˜ .then, .catch, .finally ์ฝœ๋ฐฑ ํ•จ์ˆ˜, async/await
์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์Œ ๋†’์Œ
์‹คํ–‰ ์‹œ์  ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ๊ฐ€ ๋ชจ๋‘ ๋น„์›Œ์ง„ ํ›„, ํ์—์„œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์–ด ์‹คํ–‰ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ์งํ›„, ํ๊ฐ€ ๋ชจ๋‘ ๋นŒ ๋•Œ๊นŒ์ง€ ์ „๋ถ€ ์‹คํ–‰

 

๐Ÿ“š ์ฐธ๊ณ 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

 

http://latentflip.com/loupe/?code=JC5vbignYnV0dG9uJywgJ2NsaWNrJywgZnVuY3Rpb24gb25DbGljaygpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gdGltZXIoKSB7CiAgICAgICAgY29uc29sZS5sb2coJ1lvdSBjbGlja2VkIHRoZSBidXR0b24hJyk7ICAgIAogICAgfSwgMjAwMCk7Cn0pOwoKY29uc29sZS5sb2coIkhpISIpOwoKc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0KCkgewogICAgY29uc29sZS5sb2coIkNsaWNrIHRoZSBidXR0b24hIik7Cn0sIDUwMDApOwoKY29uc29sZS5sb2coIldlbGNvbWUgdG8gbG91cGUuIik7%21%21%21

 

latentflip.com

 

728x90
'๐Ÿ“š ํ”„๋ก ํŠธ์—”๋“œ/Javascript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Javascript] AJAX ์•Œ์•„๋ณด๊ธฐ
  • [JavaScript] ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„(Lexical scope) ์•Œ์•„๋ณด๊ธฐ
  • [JavaScript] this ํ‚ค์›Œ๋“œ ์ •๋ฆฌ
  • [JavaScript] var, let, const ์ฐจ์ด ์ •๋ฆฌ (์ค‘๋ณต ์„ ์–ธ, ํ˜ธ์ด์ŠคํŒ…)
_์ด์•Ž
_์ด์•Ž
๊ณต๋ถ€ ๊ธฐ๋ก ๋ธ”๋กœ๊ทธ
  • _์ด์•Ž
    ๊ณต๋ถ€
    _์ด์•Ž
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • โœ๏ธ ๋ชจ๋“  ๊ธ€ (50) N
      • ๐Ÿ“š ํ”„๋ก ํŠธ์—”๋“œ (36) N
        • React (9) N
        • HTML_CSS (9)
        • Javascript (13)
        • git_github (4)
        • Web (1)
      • ๐Ÿ‘€ ํ”„๋กœ์ ํŠธ ๋ฐ ํ™œ๋™ (10)
        • ์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ 19๊ธฐ (10)
      • โš™๏ธ etc. (4)
  • ๋งํฌ

    • ๐Ÿ‘‹ GitHub
    • ๐Ÿง ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ธฐ๋ก
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.4
_์ด์•Ž
[JavaScript] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”