![[JavaScript] μ΄λ²€νΈ 루ν(Event Loop)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBwEhE%2FbtsKgc1TKbh%2FD3CSjqXJj83kSgbBJ7gj01%2Fimg.png)
π μλ°μ€ν¬λ¦½νΈμ μ΄λ²€νΈ 루ν(Event Loop)λ 무μμΈκ°μ?
μλ°μ€ν¬λ¦½νΈλ μ±κΈ μ€λ λ μΈμ΄μμ. μ΄λ μλ°μ€ν¬λ¦½νΈκ° ν λ²μ νλμ μμ λ§μ μ²λ¦¬ν μ μλ€λ λ»μ΄μμ. νμ§λ§ μ€μ λ‘λ μλ°μ€ν¬λ¦½νΈκ° λΉλκΈ° μμ μ μμ£Ό ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μμ΄μ. μ΄λ μ΄λ²€νΈ 루ν(Event Loop)λΌλ λ©μ»€λμ¦ λλΆμ΄μμ.
μλ°μ€ν¬λ¦½νΈμ μ΄λ²€νΈ 루νλ μλ¦¬μ¬ ν λͺ μ΄ μλ λ μ€ν λκ³Ό κ°μμ. μ리μ¬λ ν λ²μ νλμ μλ¦¬λ§ λ§λ€ μ μμ§λ§, μ리λ₯Ό μ€λΉνλ λμ λ€λ₯Έ μΌλ μ²λ¦¬ν μ μμ΄μ. μλ₯Ό λ€μ΄, μ리μ¬κ° λ©΄μ λμ΄λ λμ κ·Έ μκ°μ μλ¬λλ₯Ό μ€λΉνκ±°λ, μ£Όλ¬Έμ λ°λ μμΌλ‘ μ¬λ¬ μμ μ λμμ μ²λ¦¬ν μ μμ£ .
μ리μ¬(μλ°μ€ν¬λ¦½νΈ)λ μ리λ₯Ό νλ λμ€(λκΈ° μμ ) λ€λ₯Έ μΌμ΄ μκΈ°λ©΄ μ£Όλ°© λ°μμ μλλ€μ΄ κΈ°λ€λ¦¬λ(λΉλκΈ° μμ ) λμ μ리λ₯Ό λ§μΉ ν, κ·Έ λ€μ μμ μ μ²λ¦¬ν΄μ. λͺ¨λ μλ¦¬κ° λλλ©΄, κΈ°λ€λ¦¬λ μλλ€μ μ£Όλ¬Έ(νμ€ν¬ νμ μλ λΉλκΈ° μμ )μ΄ μ²λ¦¬λλ λ°©μμ λλ€.
π₯οΈ μ΄λ²€νΈ 루νμ λμ λ°©μ
μλ°μ€ν¬λ¦½νΈμ μ΄λ²€νΈ 루νλ μ½ μ€ν(Call Stack)κ³Ό νμ€ν¬ ν(Task Queue)λ₯Ό ν΅ν΄ λμν΄μ.
1. μ½ μ€ν (Call Stack)
μ½ μ€νμ ν¨μ μ€νμ μΆμ νλ ꡬ쑰μμ. μλ°μ€ν¬λ¦½νΈλ μ€ν(stack) ꡬ쑰λ₯Ό μ¬μ©ν΄ ν¨μλ₯Ό μ€ννκ³ , μ€νμ μμΈ ν¨μκ° λλλ©΄ μ κ±°νλ©΄μ μ§νλΌμ. λκΈ° μμ μ λͺ¨λ μ½ μ€νμμ μμ°¨μ μΌλ‘ μ²λ¦¬λ©λλ€.
function foo() {
console.log("foo ν¨μ μ€ν");
}
function bar() {
console.log("bar ν¨μ μ€ν");
foo();
}
bar();
μ΄ μ½λμμ bar() ν¨μκ° νΈμΆλλ©΄, μ½ μ€νμ μμ΄κ³ console.logλ₯Ό μ€νν΄μ.
κ·Έλ° λ€μ foo() ν¨μκ° νΈμΆλμ΄ μ½ μ€νμ μΆκ°λκ³ μ€νλ ν μ€νμμ μ κ±°λΌμ.
λͺ¨λ ν¨μκ° μ²λ¦¬λ ν μ½ μ€νμ λΉμμ Έμ.
2. νμ€ν¬ ν (Task Queue)
νμ€ν¬ νλ λΉλκΈ° μμ
μ΄ μλ£λλ©΄ μ½ μ€νμ΄ λΉμ΄μμ λ μ€ν λκΈ° μ€μΈ μ½λ°± ν¨μλ₯Ό 보κ΄νλ νμμ. setTimeout
, fetch
, μ΄λ²€νΈ νΈλ€λ¬μ κ°μ λΉλκΈ° μμ
μ λ°λ‘ μ€νλμ§ μκ³ , λΉλκΈ°μ μΌλ‘ μ²λ¦¬λ ν νμ€ν¬ νμ μΆκ°λΌμ.
console.log("첫 λ²μ§Έ λ‘κ·Έ");
setTimeout(() => {
console.log("λΉλκΈ° μ²λ¦¬λ λ‘κ·Έ");
}, 0);
console.log("λ§μ§λ§ λ‘κ·Έ");
μ΄ μ½λμμ setTimeoutμ λΉλκΈ° ν¨μλ‘, 0μ΄ ν μ€νλλλΌλ μ¦μ μ€νλμ§ μμμ.
첫 λ²μ§Έ λ‘κ·Έμ λ§μ§λ§ λ‘κ·Έκ° λ¨Όμ μ€νλ ν, μ½ μ€νμ΄ λΉμμ§λ©΄ λΉλκΈ° μ²λ¦¬λ λ‘κ·Έκ° μ€νλ©λλ€.
3. μ΄λ²€νΈ 루ν(Event Loop)
μ΄λ²€νΈ 루νλ μ½ μ€νμ΄ λΉμ΄μλμ§ νμΈνκ³ , λΉμ΄μμΌλ©΄ νμ€ν¬ νμμ λκΈ° μ€μΈ μμ μ μ½ μ€νμ μΆκ°ν΄μ. μ΄λ₯Ό ν΅ν΄ μλ°μ€ν¬λ¦½νΈλ λκΈ° μμ κ³Ό λΉλκΈ° μμ μ μ μ ν μ²λ¦¬ν μ μμ΄μ.
- μ½ μ€νμ΄ λΉμ΄ μμ λλ§ νμ€ν¬ νμμ μμ μ κ°μ Έμ μ€νν΄μ.
- μ½ μ€νμ΄ κ°λ μ°¨ μμΌλ©΄, λΉλκΈ° μμ μ λκΈ° μνμ μλ€κ° λμ€μ μ²λ¦¬λΌμ.
console.log("μμ");
setTimeout(() => {
console.log("λΉλκΈ° μ€ν");
}, 1000);
console.log("λ");
μ΄ μμ μμ μμκ³Ό λμ΄ λ¨Όμ μΆλ ₯λ ν, 1μ΄ νμ λΉλκΈ° μ€νμ΄ μΆλ ₯λΌμ.
μ΄λ²€νΈ 루νλ μ½ μ€νμ΄ λΉμ΄μλ μκ°μ κΈ°λ€λ Έλ€κ° νμ€ν¬ νμ μλ λΉλκΈ° μμ μ μ€νν΄μ.
π€ μλ°μ€ν¬λ¦½νΈμ λΉλκΈ° μ²λ¦¬
μλ°μ€ν¬λ¦½νΈμμ λΉλκΈ° μμ
μ μΌλ°μ μΌλ‘ λΉλκΈ° ν¨μλ₯Ό ν΅ν΄ μ΄λ£¨μ΄μ Έμ. λνμ μΌλ‘ setTimeout
, fetch
, Promise
λ±μ΄ λΉλκΈ° μμ
μ μ²λ¦¬νλ λ°©μμ΄μμ. μ΄ λΉλκΈ° μμ
μ μ΄λ²€νΈ 루νλ₯Ό ν΅ν΄ μ²λ¦¬λλ©°, λΈλΌμ°μ λ Node.js νκ²½μμ λΉλκΈ° μμ
μ μνν μ μμ΄μ.
1. setTimeout
μ ν΅ν λΉλκΈ° μ²λ¦¬
setTimeout
ν¨μλ νΉμ μκ° νμ μ½λλ₯Ό μ€ννλ λΉλκΈ° ν¨μμμ. μκ°μ΄ μ§λλ©΄ μ½λ°± ν¨μκ° νμ€ν¬ νμ μΆκ°λκ³ , μ½ μ€νμ΄ λΉμ΄μμ λ μ€νλΌμ.
console.log("μμ
1");
setTimeout(() => {
console.log("μμ
2");
}, 2000);
console.log("μμ
3");
μ΄ μ½λλ μμ 1κ³Ό μμ 3μ΄ λ¨Όμ μΆλ ₯λκ³ , 2μ΄ νμ μμ 2κ° μ€νλΌμ.
setTimeoutμ μ΄λ²€νΈ 루νμ μν΄ μ²λ¦¬λλ λΉλκΈ° μμ μ΄μμ.
2. Promise
λ₯Ό ν΅ν λΉλκΈ° μ²λ¦¬
Promise
λ μλ°μ€ν¬λ¦½νΈμμ λΉλκΈ° μμ
μ μ²λ¦¬νλ κ°λ ₯ν λꡬμμ. Promise
λ μμ
μ΄ μλ£λλ©΄ then
μ΄λ catch
λΈλ‘μ ν΅ν΄ κ²°κ³Όλ₯Ό μ²λ¦¬ν΄μ. λΉλκΈ° μμ
μ κ²°κ³Όλ₯Ό κΈ°λ€λ Έλ€κ° μ½ μ€νμ΄ λΉλ©΄ μ€νλΌμ.
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Promise μλ£");
}, 1000);
});
promise.then((message) => {
console.log(message);
});
console.log("Promise μ΄μ μ½λ μ€ν");
μ΄ μ½λλ 1μ΄ νμ Promiseκ° μλ£λκ³ Promise μλ£κ° μΆλ ₯λΌμ. κ·Έ μ μ Promise μ΄μ μ½λ μ€νμ΄ λ¨Όμ μΆλ ₯λΌμ.
Promiseλ λΉλκΈ° μμ μ μ²λ¦¬νλ λ° λ§€μ° μ μ©νλ©°, κ²°κ³Όκ° μ€λΉλλ©΄ μ΄λ²€νΈ 루νμ μν΄ μ²λ¦¬λΌμ.
π¨ μ£Όμν μ
- λΉλκΈ° μμ
μ μ€ν μμ: λΉλκΈ° μμ
μ μ½ μ€νμ μμ
μ΄ λͺ¨λ μλ£λ ν μ€νλκΈ° λλ¬Έμ μ½λμ μ€ν μμλ₯Ό μ μ΄ν΄ν΄μΌ ν΄μ. νΉν,
setTimeout
κ³Ό κ°μ λΉλκΈ° μμ μ μΌμ μκ°μ΄ μ§λλλΌλ μ¦μ μ€νλμ§ μκ³ μ½ μ€νμ΄ λΉμμ§ ν μ€νλ©λλ€. - 무ν 루ν μ£Όμ: λΉλκΈ° μμ μ μ²λ¦¬ν λ, 무ν 루νκ° λ°μν μ μμ΄μ. μλͺ»λ λ‘μ§μΌλ‘ μΈν΄ νμ€ν¬ νμ κ³μν΄μ μμ μ΄ μΆκ°λκ³ μ½ μ€νμ΄ λΉμμ§μ§ μλλ€λ©΄ νλ‘κ·Έλ¨μ΄ λ©μΆ μ μμ΄μ.
Promise
μasync/await
μ κ²°ν©: μλ°μ€ν¬λ¦½νΈλ λΉλκΈ° μ²λ¦¬λ₯Ό λμ± μ½κ² νκΈ° μν΄async/await
λ¬Έλ²μ μ 곡ν΄μ.async/await
λPromise
μ κ²°ν©νμ¬ λΉλκΈ° μμ μ λκΈ° μμ μ²λΌ μ²λ¦¬ν μ μκ² ν΄μ. νμ§λ§await
μ μ½ μ€νμ μ°¨μ§νμ§ μκΈ° λλ¬Έμ, μ¬μ ν μ΄λ²€νΈ 루νμ μν΄ μ²λ¦¬λΌμ.
async function fetchData() {
const result = await fetch("https://api.example.com/data");
console.log("λ°μ΄ν° κ°μ Έμ€κΈ° μλ£:", result);
}
fetchData();
console.log("λ°μ΄ν°λ₯Ό κΈ°λ€λ¦¬λ μ€...");
awaitλ λΉλκΈ° μμ μ΄ μλ£λ λκΉμ§ κΈ°λ€λ¦¬κ² λ§λ€μ§λ§, λ΄λΆμ μΌλ‘λ μ¬μ ν μ΄λ²€νΈ 루νμ μν΄ λΉλκΈ° μμ μ΄ μ²λ¦¬λΌμ.
λκΈ°μ μ½λμ²λΌ 보μ΄μ§λ§, μλ°μ€ν¬λ¦½νΈμ λΉλκΈ° νΉμ±μ μ΄ν΄ν΄μΌ ν΄μ.
π κ²°λ‘
μ΄λ²€νΈ 루νλ μλ°μ€ν¬λ¦½νΈμ μ±κΈ μ€λ λ νΉμ±μ 극볡νκ³ , λΉλκΈ° μμ μ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μκ² ν΄μ£Όλ ν΅μ¬ λ©μ»€λμ¦μ΄μμ. μ½ μ€νμμ λκΈ° μμ μ΄ μ²λ¦¬λκ³ , λΉλκΈ° μμ μ νμ€ν¬ νμ μΆκ°λ ν μ΄λ²€νΈ 루νμ μν΄ μ²λ¦¬λΌμ. μ΄λ₯Ό ν΅ν΄ μλ°μ€ν¬λ¦½νΈλ μ¬λ¬ μμ μ λΉλκΈ°μ μΌλ‘ μ²λ¦¬ν μ μμ΄, λ λΉ λ₯΄κ³ ν¨μ¨μ μΈ μΉ μ ν리μΌμ΄μ μ κ°λ°ν μ μμ΅λλ€.
μ΄λ²€νΈ 루νμ λμ μ리λ₯Ό μ΄ν΄νλ©΄, μλ°μ€ν¬λ¦½νΈμμ λΉλκΈ° μμ
μ μ²λ¦¬νλ λ°©μμ λ μ μ΄ν΄ν μ μκ³ , 볡μ‘ν λΉλκΈ° λ‘μ§μ ꡬνν λ μ€μλ₯Ό μ€μΌ μ μμ΄μ. Promiseλ async/await
κ°μ λΉλκΈ° μ²λ¦¬ λ°©λ²λ μ΄λ²€νΈ 루νμ λ°μ ν κ΄λ ¨μ΄ μμΌλ, μ΄λ₯Ό μ μ΄ν΄νκ³ μ μ ν νμ©νλ κ²μ΄ μ€μν΄μ.
π μΆκ° μ 보
- μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루νμ λν λ κΉμ μ΄ν΄λ₯Ό μνμ λ€λ©΄, MDN Web Docsμμ μμΈν μ 보λ₯Ό μ°Ύμλ³Ό μ μμ΄μ.
'Language > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JavaScript] λ°°μ΄ λ©μλ(map, filter, reduce) (3) | 2024.10.13 |
---|---|
[JavaScript] νμ΄ν ν¨μμ μΌλ° ν¨μμ μ°¨μ΄ (0) | 2024.10.02 |
[JavaScript] ꡬ쑰 λΆν΄ ν λΉ(Destructuring) (0) | 2024.04.21 |
[JavaScript] ν΄λ‘μ (0) | 2024.03.23 |
[JavaScript] this (1) | 2024.03.18 |
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!