Event Loop
JavaScript๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์๋ค. ํ์ง๋ง ๋๋ถ๋ถ์ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ๋คํธ์ํฌ ์์ฒญ์ด๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๊ฐ์ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ค์ ๋์์ ์ฒ๋ฆฌํ๋ค. ์ด ๋ฌธ์์์๋ JavaScript๊ฐ ์ด๋ฌํ ๋์์ฑ์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ด์ฉํด ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ค.
Call Stack
JavaScript์์ ๋ฌดํ ์ฌ๊ท ์ฝ๋๋ฅผ ์คํํ์ ๋, ์์ ๊ฐ์ ์๋ฌ๋ฅผ ๋ณธ ์ ์ด ์์ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ธ๊ธ๋ 'call stack'์, JavaScript ํจ์๋ฅผ ์คํํ ๋ ์ฌ์ฉ๋๋ ์คํ ๊ตฌ์กฐ์ด๋ค. 'stack' ์ด๋ผ๋ ๋ค์ด๋ฐ์ ๊ฑธ๋ง๊ฒ LIFO(Last In First Out) ๋ฐฉ์์ด๋ค.
JavaScript๋ ํ๋์ call stack๋ง์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํ์ฌ stack์ ์ถ๊ฐ๋ ๋ชจ๋ ํจ์๋ค์ด ์คํ๋ ๋๊น์ง ๋ค๋ฅธ ํจ์๋ฅผ ์คํํ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ฏธ์ง ํ๋ก์ธ์ฑ, ๋คํธ์ํฌ ์์ฒญ ๋ฑ์ ๋ฌด๊ฑฐ์ด ์์ ๋ค์ด call stack์ ์ถ๊ฐ๋์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ค๋ฅธ ํจ์๋ค์ '๋ธ๋กํน'๋ ์ํ๋ก ๋ฌด๊ฑฐ์ด ์์ ์ด ๋๋๊ธฐ ์ ๊น์ง ์คํ๋์ง ๋ชปํ ๊ฒ์ด๋ค.
Callback Queue
์ด๋ฌํ ๋ฌธ์ ๋ฅผ JavaScript์์๋ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ผ๋ก ํด๊ฒฐํ๋ค. ์ด ๋น๋๊ธฐ ์ฝ๋ฐฑ์ด ์์ด๋ ๊ณณ์ด callback queue๋ก, task queue, microtask queue, animation frame ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. callback queue๋ FIFO(First In First Out) ๋ฐฉ์์ผ๋ก, ๋จผ์ ์ถ๊ฐ๋ ์ฝ๋ฐฑ์ด ๋จผ์ ์ ๊ฑฐ๋๋ค.
์์๋ฅผ ์ดํด๋ณด์.
์ ์ฝ๋๋ฅผ ์คํํ๋ฉด console์ 'b'๊ฐ ๋จผ์ ์ถ๋ ฅ๋๊ณ 'setTimeout a'๊ฐ ๋์ค์ ์ถ๋ ฅ๋๋ ๊ฒ์ ์ ์ ์๋ค. ์๋์ ๋จ๊ณ๋ณ๋ก call stack๊ณผ callback queue์์ ์ด๋ค ์ผ๋ค์ด ๋ฐ์ํ๊ณ ์๋์ง ์ค๋ช ํ๋ค.
call stack์
a
๊ฐ ์ถ๊ฐ๋๋ค.call stack์
a
๋ด๋ถ์setTimeout
ํจ์๊ฐ ์ถ๊ฐ๋๋ค.setTimeout์ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API์ด๊ธฐ ๋๋ฌธ์, ๋ธ๋ผ์ฐ์ ์์ ํ์ด๋จธ๋ฅผ ์คํํ๋ค.
(ํ์ด๋จธ์ ์๋ฃ์๋ ๋ฌด๊ดํ๊ฒ) call stack์์
setTimeout
ํจ์๊ฐ ์ ๊ฑฐ๋๋ค.call stack์์
a
๊ฐ ์ ๊ฑฐ๋๋ค.call stack์
b
๊ฐ ์ถ๊ฐ๋๋ค.call stack์
b
๋ด๋ถ์console.log('b')
ํจ์๊ฐ ์ถ๊ฐ๋๋ค.
b
๋ด๋ถ์console.log('b')
๋ฅผ ์คํํ๋ค.call stack์์
console.log('b')
,b
๊ฐ ์ ๊ฑฐ๋๋ค.ํ์ด๋จธ๊ฐ ์๋ฃ๋๋ฉด ๋ธ๋ผ์ฐ์ ์์
setTimeout
์ ์ฝ๋ฐฑ ํจ์๋ฅผ callback queue์ ์ถ๊ฐํ๋ค.call stack์ด ๋น์ด์์ผ๋ฉด, callback queue์ ์ฝ๋ฐฑ ํจ์(
console.log('setTimeout a')
)๋ฅผ call stack์ ์ถ๊ฐํ๋ค. (callback queue์์๋ ์ ๊ฑฐํ๋ค.)
console.log('setTimeout a')
๋ฅผ ์คํํ๋ค.call stack์์
console.log('setTimeout a')
๋ฅผ ์ ๊ฑฐํ๋ค.
4๋ฒ์์ ๋งํ๋ฏ, callback queue๋ก ์ด๋๋ ๋น๋๊ธฐ ์ฝ๋ฐฑ์ ๋ค๋ฅธ JavaScript ํจ์์ ์คํ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์๋ฌธ์ ์ด ๋๋ ๋ถ๋ถ์ด ์๋ค. 11๋ฒ์์ call stack์ด ๋น์ด์์ผ๋ฉด, callback queue์ ์ฝ๋ฐฑ ํจ์๋ฅผ call stack์ ์ถ๊ฐํ๋ ๋์์ ๋๊ฐ ๋ด๋นํ๋ ๊ฒ์ผ๊น?
Event Loop
์ ๋ต์ ์ด ๊ธ์ ์ฃผ์ ์ธ ์ด๋ฒคํธ ๋ฃจํ์ด๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ "call stack์ด ๋น๋ฉด callback queue์์ ๊ฐ์ฅ ์ค๋๋ ์ฝ๋ฐฑ ํจ์๋ฅผ call stack์ ์ถ๊ฐํ๋ค." ๋ผ๋ ๋งค์ฐ ๋จ์ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋์ํ๋ค. (๋น์ฃผ์ผ ์์) ํ์ง๋ง ์์์ ์ธ๊ธํ๋ฏ, callback queue์๋ ๋ค์ํ queue๋ค์ด ์กด์ฌํ๊ณ ์ด๋ค์ ๊ฐ๊ฐ์ ์ฐ์ ์์๊ฐ ์กด์ฌํ๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ์ด ์ฐ์ ์์์ ๋ฐ๋ผ ์คํ ์์๋ฅผ ๊ฒฐ์ ํ๋๋ฐ, ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
microtask queue(ex. Promise)
animation frame(ex. requestAnimationFrame)
task queue(ex. setTimeout, fetch)
์ฝ๋๋ฅผ ์คํํ๋ฉด, console์ 'microtask queue' -> 'animation frame' -> 'task queue' ์์ผ๋ก ์ถ๋ ฅ๋๋ค.
๋ฒ์ธ: setTimeout์ ๋น๋ฐ
setTimeout(callback, 0)
์ 0์ด ๋ค ์ฝ๋ฐฑ ํจ์์ ์คํ์ ๋ณด์ฅํ์ง ์๋๋ค. ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
call stack์ด ๋น์ด ์์ด์ผ์ง๋ง call stack์ ๋ฑ๋ก๋ ์ ์๋ค: ์์์ ์ค๋ช ํ๋ฏ์ด, ์ฐ์ ์์๊ฐ ๋ ๋์ ์์ ๋ค์ด ๋จผ์ ์คํ๋๋ค.
(๋ธ๋ผ์ฐ์ ์ ๊ฒฝ์ฐ) 5๋ฒ์งธ ์ค์ฒฉ ํ์ด๋จธ ์คํ ์, ํ์ด๋จธ์ ๋๊ธฐ ์๊ฐ์ด 4ms ์ด์์ผ๋ก ๊ฐ์ ๋๋ค: HTML ํ์ค์ผ๋ก ๋ฑ๋ก๋์ด ์๋ค.
ํ์ฉํ๊ธฐ
๋๊ธฐ์ ์ธ ์์
๋๋ DOM ๋ ๋๋ง ์ดํ์ ํธ์ถ๋์ด์ผ ํ๋ ํจ์๋ฅผ setTimeout(callback, 0)
์ ์ด์ฉํด ์์ฑํ ์ ์๋ค.
์ฐธ๊ณ ๋ฌธ์
Last updated