event loop in javascript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
μλ¬Έ: Event loop in javascript
μλ°μ€ν¬λ¦½νΈλ₯Ό μ’μνλ€λ©΄ μ΄κ±Έ λ°°μμΌ νλ€. μλ°μ€ν¬λ¦½νΈμ κΉμ μΈ‘λ©΄ μ€ νλμΈ μ΄λ²€νΈ 루νμ΄λ€. λ§μ κ°λ°μλ€μ΄ μλ κ° μΌνλ©΄μλ μ¬μ ν μ΄λ²€νΈ 루νλ₯Ό μ΄ν΄νμ§ λͺ»νλ€. κ·Έλ¬λ μ΄ κ²μλ¬Όμ ν΅ν΄ μ΄λ²€νΈ 루νκ° λ¬΄μμΈμ§, κ·Έλ¦¬κ³ μ€μ λ‘ κ·Έλ κ² λ³΅μ‘νμ§λ μλ€λ κ²μ μλ €μ£Όκ³ μΆλ€.
μ ν리μΌμ΄μ μ μλ°μ€ν¬λ¦½νΈ μ½λλ νλ²μ νμ€ μ© μ²λ¦¬λλ€. μ΄λ μλ°μ€ν¬λ¦½νΈκ° λ¨μΈ μ€λ λμμ μλ―Ένλ€.
λ°ννλλ° μ λ§λ‘ μ€λ μκ°μ΄ 걸리λ μλ°μ€ν¬λ¦½νΈ μ€μ κ·Έ νμ μμ±λ μ½λκ° μ€νλλ κ²μ λ§λλ€.
μΉ μ¬μ΄νΈμμ λ²νΌμ ν΄λ¦νλλ°, κ·Έλ₯ λ©μΆλ κ²½μ°λ₯Ό μμν΄λ³΄λΌ. λ€λ₯Έ λ²νΌμ ν΄λ¦ν΄λ³΄μ§λ§ μ무μΌλ μΌμ΄λμ§ μλλ€. λ²κ·Έκ° μλ κ²μΌλ‘ κ°μ νμ λ, μ΄ νμμ κ°μ₯ ν° μμΈμ λ²νΌ ν΄λ¦μΌλ‘ μ€νλλ μΌλΆ μλ°μ€ν¬λ¦½νΈ μ½λκ° νΈλ¦¬κ±°λμ§λ§ μ€νλμ§ μλ κ²μ΄λ€.
μ½ μ€νμ μΌνλ°±κ³Ό κ°λ€. μΌνλ°±μ λ£μ 첫λ²μ§Έ 물건μ λκ°λλ 맨 λ§μ§λ§μ λκ°κ² λλ€. μλ°μ€ν¬λ¦½νΈ μμ§μ λͺ¨λ λΌμΈμ μ½ μ€νμ μΆκ°νμ¬ LIFO(Last in First Out) λ°©μμΌλ‘ μ€ννλ€. μ컨λ μ½μ€νμ μ°λ¦¬κ° νλ‘κ·Έλ¨μ μλ μμΉλ₯Ό κΈ°λ‘νκ³ μλ³νλ λ°μ΄ν° ꡬ쑰μ΄λ€.
κ·Έλ λ€λ©΄ μμ§μ΄ μ΄λ»κ² μλ°μ€ν¬λ¦½νΈ μ½λ λΌμΈμ νλ²μ νλμ© μ²λ¦¬ν κΉ?
κ·Έ λ΅μ μ½ μ€νμ μ¬μ©νκΈ° λλ¬Έμ΄λ€.
μ½ μ€νμ μλ λ² μ΄ν°μ νλ κ²μ΄λΌκ³ μκ°νμ. μλ¦¬λ² μ΄ν°μ 첫λ²μ§Έλ‘ ν μ¬λμ μλ¦¬λ² μ΄ν°μμ λ΄λ¦°λ λ§μ§λ§μΌλ‘ λ΄λ¦¬μ§λ§ λ§μ§λ§μΌλ‘ ν μ¬λμ 첫λ²μ§Έλ‘ λ΄λ¦°λ€.
μμ λ₯Ό 보μ.
var firstEventLoop = function () {
console.log("Yo people i am first one!!");
};
var secondEventLoop = function () {
firstEventLoop();
console.log("Yo people i am second one!!");
};
secondEventLoop();
μμ μμ κ° μ½ μ€νμμ μ΄λ»κ² λμνλμ§ λ³΄μ. λ¨Όμ λ©μΈ ν¨μ(μ΅λͺ ν¨μ)μ μ½ μ€νμ pushλμ΄ μ§λ€. (μλμ κ·Έλ¦Όμ²λΌ)
κ·Έ λ€μ secondEventLoop
ν¨μκ° μ€ν λ κ²μ΄λ€.
secondEventLoop
κ° νΈμΆλλ©΄, μ½μ€νμ μλμ²λΌ ꡬμ±λμ΄μ§λ€.
secondEventLoop
μ€νμ firstEventLoop
ν¨μμ μ€νμ λ°μμν€κ³ ,
firstEventLoop
ν¨μκ° μ€νλλ©΄ μ½μ€νμ μλμ²λΌ ꡬμ±λλ€.
firstEventLoop ν¨μκ° μ€νλλ©΄ μ½μ λ‘κ·Έκ° μ°νλ€.(console.log("Yo people i am first one!!");
)
κ·ΈλΌ μ΄μ firstEventLoop μμ λ μ΄μ μ€νν μ½λκ° μμΌλ―λ‘ firstEventLoop ν¨μλ μ½μ€νμμ μ κ±°λλ€.
secondEventLoop ν¨μκ° κ³μν΄μ μ€νλκ³ , secondEventLoop ν¨μμ μ½μ λ‘κ·Έκ° μ°νλ€.(console.log("Yo people i am second one!!");
)
λ§μ°¬κ°μ§λ‘ μ΄μ λ μ΄μ μ€νν μ½λκ° μμΌλ―λ‘ secondEventLoop ν¨μλ μ½μ€νμμ μ κ±°λλ€.
λ§μ§λ§μΌλ‘ λ μ΄μ μ€νν μ½λκ° μμΌλ―λ‘ μ΄ μμ μ μ΅λͺ ν¨μλ μ½μ€νμμ μ¬λΌμ§ κ²μ΄λ€.
μ κ³μν΄μ μμκ°λ³΄μ.
μ°λ¦¬λ setTimeout ν¨μμ μ΅μνλ€. setTimeout ν¨μμμ ν¨μλ₯Ό νΈμΆν μ μλ€. νΈμΆλλ ν¨μλ λΉλκΈ° μ½λ°± ν¨μμ΄λ€.
μλμ μλ₯Ό 보μ.
function printMe1 () {
console.log("Hello Javascript");
};
function printMe2(){
setTimeout(
printMe1(),
2000
);
console.log("Hey I am the first to be printed");
}
printMe2();
μμ μμ λ₯Ό μ€ννλ©΄ μ½μμ "Hey I am the first to be printed
" λ¬Έμμ΄μ΄ λ¨Όμ μ°ν κ²μ΄κ³ , κ·Έ λ€μμ " Hello Javascript
"κ° μ°ν κ²μ΄λ€.
μ΄μ μμ μ½λμμ μ½ μ€νμμ μ§νμ€μΈ μμ μ νμΈν΄λ³΄κ² λ€.
printMe1μ μ½λ°± ν¨μλ‘ κ°μ§λ setTimeout ν λ°μν μΌλ€μ μ½μ€ν μμ μλ€. printMe1 ν¨μκ° μ¦μ μ€νλμ§ μκ³ 2 μ΄ νμ μ€νλλ―λ‘, printMe1 ν¨μλ νΈμΆ μ€νμ νΈμ ν μ μλ€. λ°λΌμ νΈμΆ μ€νμμ μ¬λΌμ§λ€.
μ½μ€νμ μλμ κ°μμ§ κ²μ΄λ€.:
printMe2()κ° κ³μν΄μ μ€ν λ κ²μ΄λ©° μ½μμ λ¬Έμμ΄μ΄ μΆλ ₯λκ³ μ½μ€νμμ μ κ±° λ κ²μ΄λ€. μ΄μ λ μ΄μ μ½μ€ν μμ μ€νν νλͺ©μ΄ γ μκΈ° λλ¬Έμ μ΅λͺ ν¨μλ μ½μ€νμμ μ¬λΌμ§ κ²μ΄λ€.
λ°λΌμ μ½μ€νμ μλμ μ²λΌ λΉ μνκ° λλ€.:
2μ΄ λ€ λ§λ²μ²λΌ printMe2 ν¨μκ° μ½μ€νμ λνλ κ²μ΄λ€.
printMe2 ν¨μλ "Hello javascript
" λ₯Ό μ½μμ μΆλ ₯νλ€. μλ§λ μ΄λ»κ² μ΄λ κ² λμλλμ§ λλμ§λ λͺ¨λ₯Έλ€.
μ¬κΈ°μ μ΄λ²€νΈ 루νμ λμμ±(concurrency)μ΄ λλ¬λλ€.
μ°λ¦¬λ μ΄μ μ μλ°μ€ν¬λ¦½νΈ λ°νμμ΄ ν λ²μ ν κ°μ§ μΌμ ν μ μλ€κ³ λ Όμνμ§λ§, μ§κΈμ λμμ±μ λν΄ μ΄μΌκΈ°νκ³ μλ€. μλ°μ€ν¬λ¦½νΈ λ°νμμ ν λ²μ ν κ°μ§λ§ ν μ μκ³ , λ€λ₯Έ μ½λλ₯Ό μ€ννλ λμμλ Ajax νΈμΆμ ν μ μμΌλ©°, λ€λ₯Έ μ½λλ₯Ό μ€ννλ λμμλ setTimeout ν μ μμ§λ§ λΈλΌμ°μ λ₯Ό ν΅ν΄ μ΄ λͺ¨λ κ²μ ν μ μλ€. λΈλΌμ°μ λ₯Ό μ¬μ©νλ©΄ λ€λ₯Έ μ½λλ₯Ό μ€ννλ λμ Ajax νΈμΆμ ν μ μμΌλ©° λ€λ₯Έ μ½λλ₯Ό μ€ννλ λμ setTimeoutμ ν μλ μλ€.
setTimeoutμ νκ³ Ajax μμ²μ νλ κ²μ Javascript λ°νμμ μλ κ²μ΄ μλλΌ λΈλΌμ°μ κ° μΉ APIλ‘ μ²λ¦¬νλ€. λΈλΌμ°μ λ μ΄λ¬ν κ²λ€μ μ²λ¦¬κ³Όμ μ λν΄ μκ³ μμΌλ©° κ·Έκ²μ μ½λ°± ν¨μλ₯Ό ν΅ν΄ κ²°κ³Όλ₯Ό μ»μ μ μλ€.
μ΄λ²€νΈ 루νλ λͺ¨λ μμ²λ§λ€ μ μ€λ λκ° μμ±λλ μ€λ λ λͺ¨λΈκ³Ό λ¬λ¦¬ λ¨μΌ μ€λ λμμ μ€νλλ―λ‘ μ€λ²ν€λκ° λ°μνμ§ μλλ€.
μλ‘λ€λ₯Έ μΌλ€μ΄ κ°μ μ°λ λμμ μΌμ΄λκ³ μκΈ° λλ¬Έμ μ°¨λ¨ν μ μλ€. μ΄κ²μ λͺ¨λ μ°λ λλ₯Ό μ°¨λ¨ν μ μκΈ° λλ¬Έμ μ΄λ€ μΌμ΄ μΌμ΄λκΈ°λ₯Ό κΈ°λ€λ¦΄ μ μλ€λ κ²μ μλ―Έν©λλ€. λμ μμ μ΄ μλ£λλ©΄ νΈμΆλλ μ½λ°±μ μ μνλ©΄ λλ€. μ΄λ₯Ό λ³΄ν΅ non-blocking I/OλΌκ³ νλ€.
blocking I/Oμ λν μ:
row = db_query(βSELECT * FROM usersβ);
print(row);
print(βIt will print after user result printβ);
μμ μ½λμμ μ€νμ db 쿼리μ κ²°κ³Όλ₯Ό λ°νν λ λκΉμ§(row) μΌμ μ€μ§λκ³ κ·Έ λ€μ κ²°κ³Όκ° λ°νλλ©΄ λλ¨Έμ§ μ½λκ° μ€ν΄λλ€. λ°λΌμ λ¨Όμ rowμ μΆλ ₯ν λ€μ(μ¬μ©μ μ§μ κ²°κ³Ό) βIt will print after user result print' λ¬Έμμ΄μ μΆλ ₯νλ€.
μ΄μ κ°μ μμμ§λ§ μ½κ°μ λ³νλ₯Ό λ³Ό μ μλ€. non-blocking I/Oμ λν μ:
db_query(βSELECT * FROM usersβ, function (row) {
print(row);
});
print(βIt will print after user result printβ);
μμ μμμλ νμ Javascriptμμ μ¬μ©νλ κ²κ³Ό κ°μ μ΅λͺ ν¨μλ₯Ό μ¬μ©νλ€. JSλ μ΄λ²€νΈλ₯Ό λ§μ΄ νμ©νλλ°, κ·Έκ²μ΄ λ°λ‘ μ½λ°±μ κ΄ν κ²μ΄λ€. μμ μ΄ μλ£λλ©΄ μ½λ°±μ νΈλ¦¬κ±°νλ μ΄λ²€νΈκ° μ€νλλ€. μ΄κ²μ΄ μ’ μ’ μ΄λ²€νΈ λͺ¨λΈ λλ λΉλκΈ° λͺ¨λΈμ΄λΌκ³ λνλ μ΄μ μ΄λ€. λ°λΌμ μ μμ μ€νκ²°κ³Όλ 쿼리 κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬μ§ μκ³ μΏΌλ¦¬λ₯Ό μ€ννκ³ λ€λ₯Έ μ½λ λΌμΈμ κ³μν©λλ€. μΌλ¨ κ²°κ³Όκ° μΏΌλ¦¬μμ μμ±λλ©΄ μ½λ°± λ° μΆλ ₯λλ€. λ¨Όμ βIt will print after user result printβ λ¬Έμμ΄μ΄ μΆλ ₯λ λ€μ νμ μΆλ ₯νλ€(μ¬μ©μ μ§μ κ²°κ³Ό).
μ΄ λͺ¨λΈμ ꡬνμ μ΄λ¬ν μ΄λ²€νΈλ₯Ό μ²λ¦¬νκ³ μ€ννλ 루νλ₯Ό μ¬μ©νλ€. κ·Έλμ μ΄λ²€νΈ νλ μ΄λ²€νΈ 루νλΌκ³ λΆλ¦°λ€.
μλ°μ€ν¬λ¦½νΈ μ΄λ²€νΈ 루ν(Javascript Event Loop)μ λν΄ λ μμΈν μμ보μ.
μ΄μ μμ λ‘ μ΄λ»κ² μμ©νλμ§ μ΄ν΄λ³΄μ.
μ΄μ μ μ°λ¦¬λ setTimeout ν¨μκ° μ½λ°± ν¨μμΈ printMe1μ μ¬μ©νμ¬ μ½ μ€νμ λ°μ΄λ£μΌλ©΄ μ½ μ€νμμ μ¬λΌμ§μ 보μλ€. setTimeoutμ΄ μ€νλλ©΄ λΈλΌμ°μ κ° setTimeoutμ μ½λ°± κΈ°λ₯μ μ΄λ²€νΈ ν μ΄λΈμ λ°°μΉνλ€. κ·Έκ²μ μΉ APIμ΄κΈ° λλ¬Έμ νμ¬μ javascript λ°νμκ³Όλ μ무 μκ΄μ΄ μλ€. μ΄λ²€νΈ ν μ΄λΈλ‘ μ λ¬νμ¬ μ΄ ν¨μλ₯Ό λ±λ‘νκ³ νΉμ μ΄λ²€νΈκ° λ°μν λ μ€ννλ€. (μ΄ κ²½μ° 2μ΄ ν)
μ΄λ²€νΈκ° λ°μνλ©΄ μ΄λ²€νΈ ν μ΄λΈμ΄ λ©μμ§ λκΈ°μ΄ ν μ΄λΈ(μ½λ°± λκΈ°μ΄ ν μ΄λΈ)λ‘ ν¨μλ₯Ό μ΄λμν¨λ€. setTimeout κΈ°λ₯μ΄ μ€νλ ν μ΄λ€ μΌμ΄ λ°μνλμ§ λ΄ μλ€.
setTimeout ν¨μκ° μ€νλ νμ μ΄λ€ μΌμ΄ μΌμ΄λλμ§ μ΄ν΄λ³΄μ.
μ½λ°± ν¨μ(printMe1())λ₯Ό μ΄λ²€νΈ ν μ΄λΈλ‘ μ΄λνλ©΄ μ½ μ€νμμ μ°¨λ¨λλ κ²μ΄ μμμ μ μ μλ€. λΈλΌμ°μ λ 2μ΄ λμ κΈ°λ€λ¦¬μ§ μκ³ μ½ μ€νμμ μ€νμ κ³μνλ€. λ€μ μ€ν μ½λλ myFunctionμ΄κ³ myFunctionμ΄ νΈμΆλμ΄ μ½μμμ "It's my function"μ μΆλ ₯νκ³ μ½ μ€νμμ μ κ±°λλ€. λ°λΌμ μ½ μ€νμλ λ μ΄μ μ€νν νμ΄ μμΌλ―λ‘ μ΅λͺ ν¨μλ μ½ μ€νμμ μ κ±°λκ³ μ½ μ€νμ λΉκ²λλ€.
μ΄λ²€νΈ ν μ΄λΈμ μ΄λ²€νΈκ° νΈλ¦¬κ±°λλμ§ μ¬λΆλ₯Ό μ§μμ μΌλ‘ λͺ¨λν°λ§νλ€. λ§μ½ νΈλ¦¬κ±° λ κ²½μ° ν΄λΉ ν¨μλ λ©μμ§ λκΈ°μ΄ λλ νΈμΆ λκΈ°μ΄λ‘ μ΄λνλ€. μ°λ¦¬μ μμ μΈ κ²½μ°, 2μ΄ νμ, printMe1 ν¨μκ° νΈλ¦¬κ±°λμ΄ λ©μμ§ λκΈ°μ΄λ‘ μ΄λνλ€.
2μ΄ ν:
printMe1() ν¨μκ° μ΄λ²€νΈ ν μ΄λΈμμ λ©μμ§ νλ‘ μ΄λλλ€.
μ½ μ€νμ΄ λΉμ΄ μλμ§ μ§μμ μΌλ‘ νμΈνλ νλ‘μΈμ€ μ€ νλμ΄λ€. μ½ μ€νμ΄ λΉμ΄ μμΌλ©΄ νΈμΆ λκΈ° μ€μΈ ν¨μκ° μλμ§ νμΈνλ€. μ°λ¦¬μ μμ μΈ κ²½μ° λ©μμ§ λκΈ°μ΄ ν μ΄λΈμ 첫 λ²μ§Έ ν¨μκ° νΈμΆ μ€νμΌλ‘ μ΄λνκ³ νΈμΆ μ€νμμ μ€νλλ€.
μ΄ λͺ¨λ κ³Όμ μ EVENT LOOPμΌλ‘ λΆλ¦°λ€.
μμ μμμ μ°λ¦¬λ printMe1 ν¨μκ° νΈμΆ μ€νμΌλ‘ μ΄λνμ¬ μ€νλλ κ²μ λ³Ό μ μλ€. μ½μμ Hello javascriptβλΌλ κΈμκ° μΆλ ₯λ κ²μ λ³Ό μ μλ€.
- 첫λ²μ§Έ μ±ν°μ λμΌν μ΄λ²€νΈ 루νμ κ΄ν μ€λͺ μ λ€λ€λ€.
- μλ°μ€ν¬λ¦½νΈ μ½μ€ν, μ΄λ²€νΈλ£¨νμ μ΄ν΄ μ°Έμ‘°νλ©΄ μ’μ λ― νλ€.