Understanding JS: The Event Loop - Lee-hyuna/33-js-concepts-kr GitHub Wiki

์ด๋ฒคํŠธ ๋ฃจํ”„์— ๋Œ€ํ•ด ์ดํ•ด ํ•˜๊ธฐ

๊ฐœ๋ฐœ์„ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๋“ค์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋„๊ตฌ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๋งŽ์ด ์ƒ๊ฒจ๋‚จ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ์ดํ•ด ํ•˜์ง€ ์•Š๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Javascript๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€ ์ž…๋‹ˆ๋‹ค. (JavaScript is the poster boy of this exact behavior.?์Œ?์ด๊ฒŒ ๋ชฌ๊ฐ€์—ฌ...) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐ€์žฅ ๋ณต์žกํ•œ ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๋„๋ฆฌ ํผ์ ธ ์žˆ๋Š” ๋ฐ˜๋ฉด, ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์€ ๋†’์€ ์ˆ˜์ค€์˜ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด ์–ธ์–ด์˜ "๋‚˜์œ ๋ถ€๋ถ„"์„ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐ ๋งค๋ฃŒ ๋ฉ๋‹ˆ๋‹ค.

๋†€๋ผ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณ„์† ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์ง€๋งŒ Javascript์— ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉด ์ƒ๋‹นํžˆ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. "๊ดด๊ดด ๋ง์ธก ํ•œ ๋ถ€๋ถ„"์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์ˆ˜์„ ๊ฐœ๋ฐœ์ž์™€ ํ‰๊ท  grunt ์ฝ”๋”๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. JS ์ƒํƒœ๊ณ„๋Š” ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ˜๋ฉด ๊ธฐ๋ณธ ์š”์†Œ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ๊ตฌ์ถ•๋˜๋Š” ๊ธฐ๋ณธ ์š”์†Œ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ์ดํ•ดํ•˜๋ฉด ๋” ๋„“์€ ์ธ์‹์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ  ๊ฐœ๋ฐœ ๊ณผ์ •์„ ๋ณด๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

JavaScript๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์–ธ์–ด๋ผ๊ณ  ๋“ค์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝœ์Šคํƒ ๋ฐ ์ด๋ฒคํŠธ ํ๋ผ๋Š” ์šฉ์–ด๋ฅผ ๋“ค์–ด ๋ณด์…จ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ JavaScript๊ฐ€ ์ฝœ๋ฐฑ๊ณผ Promise์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋” ๋งŽ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ์„ธ์„ธํ•œ ์‚ฌํ•ญ๊นŒ์ง€ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ JavaScript ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ์‹œ๊ฐ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฝœ์Šคํƒ

JavaScript์—๋Š” ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํ•จ์ˆ˜์™€ ๊ทธ ์ดํ›„์— ์‹คํ–‰๋  ํ•จ์ˆ˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๋‹จ์ผ ํ˜ธ์ถœ ์Šคํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋จผ์ € ์Šคํƒ์ด ๋ฌด์—‡์ผ๊นŒ์š”? ์Šคํƒ์€ ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ๋ชฉ์„ ๋’ค์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ๋งŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ํ”Œ๋ ˆ์ดํŠธ ๋”๋ฏธ ์ž…๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์„œ๋กœ ์œ„์— ์˜ฌ๋ ค ๋†“์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ์ƒ๋‹จ์˜ ํ”Œ๋ ˆ์ดํŠธ๋งŒ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ ํ•˜๋ฉด ํ˜ธ์ถœ ์Šคํƒ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์˜ ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜ ์œ„์— ์˜ต๋‹ˆ๋‹ค. ์ฝ˜์†”์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ธด ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๊ทธ ์ˆœ๊ฐ„์— ์Šคํƒ์ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฌด์–ธ๊ฐ€์— ํƒ€์ž„ ์•„์›ƒ์„ ๊ฑธ๋ฉด ์–ด๋–จ๊นŒ์š”? ์ด๋ก ์ ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์ด ๊ณ„์† ๋  ์ˆ˜ ์žˆ๋„๋ก ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ์ „์ฒด ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ณ ์ • ์‹œ์ผœ์•ผ ํ• ๊นŒ์š”? ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ” ๋ฐ ์ด๋ฒคํŠธํ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ํ…Œ์ด๋ธ” ๋ฐ ์ด๋ฒคํŠธ ํ

setTimeout ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ํ›„์— ํŠน์ • ํ•จ์ˆ˜๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด(ํƒ€์ž„์•„์›ƒ, ํด๋ฆญ, ๋งˆ์šฐ์Šค ์ด๋™) ์•Œ๋ฆผ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”์€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ž์ฒด์ ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋ฅผ ์ถ”์ ํ•˜์—ฌ ์ด๋ฒคํŠธ ํ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค.

์ด๋ฒคํŠธํ๋Š” ์Šคํƒ๊ณผ ๋น„์Šทํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•ญ๋ชฉ์„ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ์•ž์—์„œ๋งŒ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ˆ˜์‹ ์ง€๋งŒ ํ˜ธ์ถœ ์Šคํƒ์— ํ•จ์ˆ˜๋ฅผ ๋ณด๋‚ด์•ผ ํ• ๊นŒ์š”? ํ˜ธ์ถœ ์Šคํƒ์€ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„

๋งˆ์นจ๋‚ด ์•…๋ช… ๋†’์€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋Š์ž„์—†์ด ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๋กœ์„ธ์Šค ์ž…๋‹ˆ๋‹ค. ์ƒ์ƒํ•ด๋ณด์„ธ์š”. ์‹œ๊ณ„์ด ๊ฐ™์„ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ ์Šคํƒ์„ ํ™•์ธํ•˜๊ณ  ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด๋ฒคํŠธ ํ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธํ์— ๋Œ€๊ธฐ์ค‘์ธ ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ํฅ๋ฏธ๋กœ์šด ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ ์‹คํ–‰๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

setTimeout(() => console.log('first'), 0)
console.log('second')

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ set timeout์ด 0์œผ๋กœ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰์‹œ ์‹คํ–‰ ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ์˜ˆ์ œ์—์„œ๋Š” "first" ์•ž์— "second"๊ฐ€ ํ™”๋ฉด์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. Javascript๋Š” setTimeout์„ ๋ณด๊ณ  "๊ธ€์Ž„, ๋‚ด ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹คํ–‰์„ ๊ณ„์†ํ•ด์•ผํ•œ๋‹ค"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”, ์ด๋ฒคํŠธ ํ๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜๊ณ  ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

Exploits

์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์˜ˆ๋Š” ์žฌ๊ท€์ž…๋‹ˆ๋‹ค. ์Šคํƒ ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋•Œ๋•Œ๋กœ ๋ฌดํ•œ ์žฌ๊ท€๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐ€๋” ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋•Œ๋กœ๋Š” ์‹ค์ œ๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์„ ๋งŽ์ด ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์—ฌ์ „ํžˆ ๋ถˆํ•ฉ๋ฆฌํ•œ ์–‘์˜ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜์žˆ๋Š” ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ํ•ดํ‚น์ด ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์žฌ๊ท€ ํ˜ธ์ถœ์„ setTimeout์— ๋ž˜ํ•‘ํ•˜์„ธ์š”.

recursion()์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋Œ€์‹ ์— (์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”), setTimeout (() => recursion (), 0)์„ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ์— ์ง์ ‘ ์Œ“์ด๋Š” ๋Œ€์‹  ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”๊ณผ ๋Œ€๊ธฐ์—ด์„ ํ†ต๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ ์˜ค๋ฒ„ ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  JavaScript์˜ ๋™์ž‘์„ ๋ณด์—ฌ์ฃผ๋Š” ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๋” ๋งŽ์€ ๊ฒƒ๋“ค์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์€ ๋ฃจํ”„์˜ ๊ธฐ๋ณธ์ ์ธ ์„ค๋ช…๊ณผ ์ด์™€ ๊ด€๋ จ๋œ ๊ฒƒ๋“ค ์ž…๋‹ˆ๋‹ค. ๋˜๋„๋ก์ด๋ฉด ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ „์ฒด ํ”„๋กœ์„ธ์Šค์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๊ณ  ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์„ค๋ช… ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.๋‹ค๋ฅธ ์ ์€ ์ด ์„ค๋ช…์ด V8 JavaScript ์—”์ง„์˜ ๋งฅ๋ฝ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Chrome์˜ ์—”์ง„์ด๋ฉฐ ๋…ธ๋“œ์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ