Event Loopλ₯Ό μμμΌ νλ μ΄μ
μλ°μ€ν¬λ¦½νΈ μμ§μμ μ΄λ²€νΈκ° μ΄λ€ μμλ‘ λμνλμ§ μ μ μλ€.
μ΄ λ¬Έμλ₯Ό λ³΄κ³ λλ©΄
μλ°μ€ν¬λ¦½νΈ μμ§μμ μ΄λ²€νΈκ° μ΄λ€ μμλ‘ λμνλμ§ μ μ μλ€.
λ€μμ μ΄λ»κ² consoleμ μ°νκΉμ?
function showLog() {
console.log("event1")
setTimeout(() => { console.log("event2") }, 0)
console.log("event3")
}
JavaScript
볡μ¬
λΆλͺ
ν setTimeoutμ΄ delayλ 0μ΄μ§λ§, event1 => event3 => event2 λ‘ logκ° μ°νλκ±Έ λ³Ό μ μμ΅λλ€. μ΄λ₯Ό μ΄ν΄νλ €λ©΄ Event Loopμ λν΄ μμμΌ ν©λλ€.
Event Loop
μλ°μ€ν¬λ¦½νΈμ νΉμ§ μ€ νλλ μ±κΈ μ€λ λλ‘ λμνλ κ²μ
λλ€. μ±κΈ μ€λ λ λ°©μμ ν λ²μ νλμ taskλ§ μ²λ¦¬ν μ μλ κ²μ μλ―Ένλλ°μ. νμ§λ§ λΈλΌμ°μ κ° λμνλ κ²μ 보면 λ§μ taskκ° λμμ μ²λ¦¬λλ κ²μ²λΌ λκ»΄μ§λλ€. μλ₯Ό λ€μ΄ html μμκ° μ λλ©μ΄μ
ν¨κ³Όλ₯Ό ν΅ν΄ μμ§μ΄λ©΄μ μ΄λ²€νΈλ₯Ό μ²λ¦¬νκΈ°λ νκ³ , HTTP μμ²μ ν΅ν΄ μλ²λ‘λΆν° λ°μ΄ν°λ₯Ό κ°μ§κ³ μ€λ©΄μ λ λλ§ νκΈ°λ ν©λλ€. μ΄μ²λΌ μλ°μ€ν¬λ¦½νΈμ λμμ±μ μ§μνλ κ²μ΄ λ°λ‘ μ΄λ²€νΈ 루νμ
λλ€.
μ΄λ²€νΈ 루νλ λΈλΌμ°μ μ λ΄μ₯λμ΄ μλ κΈ°λ₯ μ€ νλμ
λλ€.
ꡬκΈμ V8 μλ°μ€ν¬λ¦½νΈ μμ§μ λΉλ‘―ν λλΆλΆμ μλ°μ€ν¬λ¦½νΈ μμ§μ ν¬κ² 2κ°μ μμμΌλ‘ ꡬλΆν μ μμ΅λλ€.
μ½μ€ν
μμ€μ½λ νκ° κ³Όμ μμ μμ±λ μ€ν 컨ν
μ€νΈκ° μΆκ°λκ³ μ κ±°λλ μ€ν μλ£κ΅¬μ‘°μΈ μ€ν 컨ν
μ€νΈμ
λλ€. ν¨μλ₯Ό νΈμΆνλ©΄ ν¨μ μ€ν 컨ν
μ€νΈκ° μμ°¨μ μΌλ‘ μ½ μ€νμ νΈμλμ΄ μμ°¨μ μΌλ‘ μ€νλ©λλ€. μλ°μ€ν¬λ¦½νΈ μμ§μ λ¨ νλμ μ½ μ€νμ μ¬μ©νκΈ° λλ¬Έμ μ΅μμ μ€ν 컨ν
μ€νΈ(μ€νμ€μΈ μ€ν 컨ν
μ€νΈ)κ° μ’
λ£λμ΄ μ½ μ€νμμ μ κ±°λκΈ° μ κΉμ§λ λ€λ₯Έ μ΄λ€ νμ€ν¬λ μ€νλμ§ μμ΅λλ€.
ν
νμ κ°μ²΄κ° μ μ₯λλ λ©λͺ¨λ¦¬ 곡κ°μ
λλ€. λ©λͺ¨λ¦¬μ κ°μ μ μ₯νλ €λ©΄ λ¨Όμ κ°μ μ μ₯ν λ©λͺ¨λ¦¬ 곡κ°μ ν¬κΈ°λ₯Ό κ²°μ ν΄μΌ ν©λλ€. κ°μ²΄λ μμ κ°κ³Όλ λ¬λ¦¬ ν¬κΈ°κ° μ ν΄μ Έ μμ§ μμΌλ―λ‘ ν λΉν΄μΌ ν λ©λͺ¨λ¦¬ 곡κ°μ ν¬κΈ°λ₯Ό λ°νμμ κ²°μ (λμ ν λΉ)ν΄μΌ ν©λλ€. λ°λΌμ κ°μ²΄κ° μ μ₯λλ λ©λͺ¨λ¦¬ 곡κ°μΈ νμ ꡬ쑰ν λμ΄ μμ§ μμ΅λλ€.
μ΄μ²λΌ μ½ μ€νκ³Ό νμΌλ‘ ꡬμ±λ μλ°μ€ν¬λ¦½νΈ μμ§μ λ¨μν νμ€ν¬κ° μμ²λλ©΄ μ½ μ€νμ ν΅ν΄ μμ²λ μμ
μ μμ°¨μ μΌλ‘ μ€νν λΏμ
λλ€. λΉλκΈ° μ²λ¦¬μμ μμ€μ½λμ νκ°μ μ€νμ μ μΈν λͺ¨λ μ²λ¦¬λ μλ°μ€ν¬λ¦½νΈ μμ§μ ꡬλνλ νκ²½μΈ λΈλΌμ°μ λλ Node.jsκ° λ΄λΉν©λλ€. μλ₯Ό λ€μ΄, λΉλκΈ° λ°©μμΌλ‘ λμνλ setTimeoutμ μ½λ°± ν¨μμ νκ°μ μ€νμ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ λ΄λΉνμ§λ§, νΈμΆ μ€μΌμ€λ§μ μν νμ΄λ¨Έ μ€μ κ³Ό μ½λ°± ν¨μμ λ±λ‘μ λΈλΌμ°μ λλ Node.jsκ° λ΄λΉν©λλ€. μ΄λ₯Ό μν΄ λΈλΌμ°μ νκ²½μ νμ€ν¬ νμ μ΄λ²€νΈ 루νλ₯Ό μ 곡ν©λλ€.
νμ€ν¬ ν
setTimeoutμ΄λ setInervalκ³Ό κ°μ λΉλκΈ° ν¨μμ μ½λ°± ν¨μ λλ μ΄λ²€νΈ νΈλ€λ¬κ° μΌμμ μΌλ‘ 보κ΄λλ μμμ
λλ€.
μ΄λ²€νΈ 루ν
μ΄λ²€νΈ 루νλ μ½ μ€νμ νμ¬ μ€ν μ€μΈ μ€ν 컨ν
μ€νΈκ° μλμ§, κ·Έλ¦¬κ³ νμ€ν¬ νμ λκΈ° μ€μΈ ν¨μκ° μλμ§ λ°λ³΅ν΄μ νμΈν©λλ€. λ§μ½ μ½ μ€νμ΄ λΉμ΄ μκ³ , νμ€νΈ νμ λκΈ° μ€μΈ ν¨μκ° μλ€λ©΄ μ΄λ²€νΈ 루νλ μμ°¨μ μΌλ‘(μ μ
μ μΆ) νμ€ν¬ νμ λκΈ° μ€μΈ ν¨μλ₯Ό μ½ μ€νμΌλ‘ μ΄λμν΅λλ€. μ΄ λ μ½ μ€νμΌλ‘ μ΄λν ν¨μλ μ€νλ©λλ€.
μλ°μ€ν¬λ¦½νΈλ μ±κΈ μ€λ λ λ°©μμΌλ‘ λμν©λλ€. κ·Έλ°λ° μ΄ λ μ±κΈ μ€λ λ λ°©μμΌλ‘ λμνλ κ²μ λΈλΌμ°μ κ° μλλΌ λΈλΌμ°μ μμ λ΄μ₯λ μλ°μ€ν¬λ¦½νΈ μμ§μ
λλ€. λ§μ½ λͺ¨λ μλ°μ€ν¬λ¦½νΈ μ½λκ° μλ°μ€ν¬λ¦½νΈ μμ§μμ μ±κΈ μ€λ λ λ°©μμΌλ‘ λμνλ€λ©΄ μλ°μ€ν¬λ¦½νΈλ λΉλκΈ°λ‘ λμν μ μμ΅λλ€. μ¦ μλ°μ€ν¬λ¦½νΈ μμ§μ μ±κΈ μ€λ λλ‘ λμνμ§λ§ λΈλΌμ°μ λ λ©ν° μ€λ λλ‘ λμλ©λλ€.
μλ₯Ό λ€μ΄ setTimeout ν¨μμ λͺ¨λ μ²λ¦¬κ° μλ°μ€ν¬λ¦½νΈ μμ§μμ μ±κΈ μ€λ λλ‘ μνλλ€κ³ κ°μ ν΄ λ³Όκ²μ. μ΄λ setTimeout ν¨μμ νΈμΆ μ€μΌμ€λ§μ μν νμ΄λ¨Έ μ€μ λ μλ°μ€ν¬λ¦½νΈ μμ§μμ μνλ κ²μ΄λ―λ‘ λκΈ°μκ° λμ μ΄λ€ νμ€ν¬λ μ€νν μ μμ΅λλ€. μ¦ setTimeout ν¨μμ νμ΄λ¨Έ μ€μ κΉμ§ μλ°μ€ν¬λ¦½νΈ μμ§μμ μ±κΈ μ€λ λ λ°©μμΌλ‘ λμν΄μλ λΉλκΈ°λ‘ λμν μ μμ΅λλ€.
λΈλΌμ°μ λ μλ°μ€ν¬λ¦½νΈ μμ§ μΈμλ λ λλ§ μμ§κ³Ό WebAPIλ₯Ό μ 곡ν©λλ€. WebAPIλ ECMAScript μ¬μμ μ μλ ν¨μκ° μλλΌ λΈλΌμ°μ μμ μ 곡νλ APIμ΄λ©°, DOM APIμ νμ΄λ¨Έ ν¨μ, HTTP μμ²(Ajax)κ³Ό κ°μ λΉλκΈ° μ²λ¦¬λ₯Ό ν¬ν¨ν©λλ€. μ μμ μμ μ΄ν΄λ΄€λ―μ΄ λΈλΌμ°μ μ Web APIμΈ setTimeout ν¨μκ° νΈμΆλλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ½ μ€νμ νΈμλμ΄ μ€νλ©λλ€. νμ§λ§ setTimeout ν¨μμ λ κ°μ§ κΈ°λ₯μΈ νμ΄λ¨Έ μ€μ κ³Ό νμ΄λ¨Έκ° λ§λ£νλ©΄ μ½λ°± ν¨μλ₯Ό νμ€ν¬ νμ λ±λ‘νλ μ²λ¦¬λ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ μλλΌ λΈλΌμ°μ κ° μ€νν©λλ€. μ΄μ²λΌ λΈλΌμ°μ μ μλ°μ€ν¬λ¦½νΈ μμ§μ΄ νλ ₯νμ¬ λΉλκΈ° ν¨μμΈ setTimeout ν¨μλ₯Ό μ€νν©λλ€.
μ°Έκ³ μμ
μ°Έκ³ λ§ν¬
β’