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 ํจ์๋ฅผ ์คํํฉ๋๋ค.
์ฐธ๊ณ ์์
์ฐธ๊ณ ๋งํฌ
โข