Search
โžฟ

Event Loop

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 ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์˜์ƒ

์ฐธ๊ณ  ๋งํฌ

โ€ข