Event Loop

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” 단일 μŠ€λ ˆλ“œ (Single Thread) 기반이기 λ•Œλ¬Έμ— 이벀트 루프λ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ—…μ„ μŠ€μΌ€μ₯΄λ§ ν•œλ‹€.

이것은 μ‹œκ°„μ— 흐름에 따라 μ½”λ“œμ˜ μˆ˜ν–‰μ„ μ²˜λ¦¬ν•˜λ©° κ·Έλ•Œλ§ˆλ‹€ JS Engine 을 μ‹€ν–‰ν•˜λ©° μ•„λž˜ κ·Έλ¦Όκ³Ό 같은 ꡬ쑰적 νŠΉμ„±μ„ λˆλ‹€.

JS Engine

이에 λ”°λ₯Έ 이벀트 λ£¨ν”„λŠ” 단 ν•œκ°€μ§€μ˜ μž„λ¬΄λ§Œ 가지고 μžˆλŠ”λ° Call Stack 와 Callback Queue 을 κ°μ‹œν•˜λŠ” 것 이닀. λ§Œμ•½ μ½œμŠ€νƒμ΄ λΉ„μ–΄ 있으면 이벀트 λ£¨ν”„μ—μ„œλŠ” νμ—μ„œ 첫번째 이벀트λ₯Ό κ°€μ Έλ‹€κ°€ Call Stack 에 λ°€μ–΄λ„£λŠ”κ²ƒμ΄λ©° 결과적으둜 ν•΄λ‹Ή μ΄λ²€νŠΈκ°€ μ‹€ν–‰λ˜λŠ” 것이닀.

이벀트 루프

λŒ€ν‘œμ μΈ 예둜 setTimeout λ™μž‘μ΄ μžˆλ‹€.

setTimeout 이 μžλ™μœΌλ‘œ μ½œλ°±μ„ 이벀트 루프 큐 μ•ˆμ— λ„£μ–΄μ£Όμ§€λŠ” μ•ŠλŠ”λ‹€. setTimeout 은 타이머λ₯Ό μ„€μ •ν•˜λ©° 타이머가 만료되면 ν˜ΈμŠ€νŒ… ν™˜κ²½μ΄ μ½œλ°±μ„ 이벀트 루프에 μœ„μΉ˜μ‹œμΌœ 미래의 Tick 이 이λ₯Ό κ°€μ Έλ‹€ μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•œλ‹€.

setTimeout(() => {
  alert('Callback Func');
}, 1000);

즉 μœ„μ— μ½”λ“œλŠ” setTimeout 은 1,000ms 후에 싀행이 μ•„λ‹Œ 1,000ms 이후에 Callback Queue 에 μΆ”κ°€λ˜λŠ” 것이닀.

이벀트 루프

  1. μ½œμŠ€νƒ, 콜백큐 λ“±μ˜ λͺ¨λ“ κ²ƒμ΄ λΉ„μ›Œμ Έμžˆλ‹€.
  2. console.log('Hi') κ°€ μ½œμŠ€νƒμ— μΆ”κ°€λ˜μ—ˆλ‹€.
  3. console.log('Hi') κ°€ μ‹€ν–‰λœλ‹€.
  4. console.log('Hi') κ°€ 콜 μŠ€νƒμ—μ„œ μ œκ±°λ˜μ—ˆλ‹€.
  5. setTimeout(function cb1() {...}) κ°€ μ½œμŠ€νƒμ— μΆ”κ°€λ˜μ—ˆλ‹€.
  6. setTimeout(function cb1() {...}) 이 μ‹€ν–‰λ˜λ©΄μ„œ λΈŒλΌμš°μ €κ°€ μ›Ή API 의 μΌν™˜μΈ 타이머λ₯Ό μƒμ„±ν•œλ‹€.
    이 νƒ€μ΄λ¨ΈλŠ” 카운트 λ‹€μš΄μ„ μ²˜λ¦¬ν•œλ‹€.
  7. setTimeout(function cb1() {...}) κ°€ 싀행이 μ™„λ£Œλ˜κ³  μ½œμŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.
  8. console.log('Bye') κ°€ μ½œμŠ€νƒμ— μΆ”κ°€λ˜μ—ˆλ‹€.
  9. console.log('Bye') 이 μ‹€ν–‰λ˜μ—ˆλ‹€.
  10. console.log('Bye') κ°€ μ½œμŠ€νƒμ—μ„œ μ œκ±°λ˜μ—ˆλ‹€.
  11. 타이머가 μ™„λ£Œλ˜λ©΄ cb1 을 μ½œλ°±νμ— λ°€μ–΄ λ„£λŠ”λ‹€.
  12. 이벀트 루프가 cb1 을 μ½œλ°±νμ—μ„œ κ°€μ Έλ‹€ μ½œμŠ€νƒμ— λ°€μ–΄ λ„£λŠ”λ‹€.
  13. cb1 이 μ‹€ν–‰λ˜κ³  console.log('cb1') 이 μ½œμŠ€νƒμ— μΆ”κ°€λœλ‹€.
  14. console.log('cb1') 이 μ‹€ν–‰λœλ‹€.
  15. console.log('cb1') 이 콜 μŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.
  16. cb1 이 μ½œμŠ€νƒμ—μ„œ μ œκ±°λœλ‹€.