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์ ๋ณด๊ณ "๊ธ์, ๋ด ์ด๋ฒคํธ ํ ์ด๋ธ์ ์ด๊ฒ์ ์ถ๊ฐํ๊ณ ์คํ์ ๊ณ์ํด์ผํ๋ค"๋ผ๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฒคํธ ํ ์ด๋ธ, ์ด๋ฒคํธ ํ๋ฅผ ํตํด ์ด๋ํ๊ณ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์คํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
์ด๋ฒคํธ ๋ฃจํ์ ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ์๋ ์ฌ๊ท์ ๋๋ค. ์คํ ์ค๋ฒ ํ๋ก์ฐ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณธ ์ ์ด ์์ต๋๊น? ๋๋๋ก ๋ฌดํ ์ฌ๊ท๋ฅผ ๋ง๋ค ๋ ๊ฐ๋ ์ป์ ์ ์์ง๋ง ๋๋ก๋ ์ค์ ๋ก ์ฌ๊ท ํธ์ถ์ ๋ง์ด ๋ง๋ญ๋๋ค. ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ ์ฌ์ ํ ๋ถํฉ๋ฆฌํ ์์ ํธ์ถ์ ํ ์์๋ ๊ฐ๋จํ๋ฉด์๋ ํดํน์ด ๊ฐ๋ฅํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฌ๊ท ํธ์ถ์ setTimeout์ ๋ํํ์ธ์.
recursion()์ ์ง์ ํธ์ถํ๋ ๋์ ์ (์ฌ๋ฌ๋ถ์ ๋ฉ์๋์ ์ด๋ฆ์ด๋ผ๊ณ ์์ํด๋ณด์ธ์), setTimeout (() => recursion (), 0)์ ํธ์ถ ํ ์ ์์ต๋๋ค. ์คํ์ ์ง์ ์์ด๋ ๋์ ์ด๋ฒคํธ ํ ์ด๋ธ๊ณผ ๋๊ธฐ์ด์ ํต๊ณผํ๊ธฐ ๋๋ฌธ์ ์คํ ์ค๋ฒ ํ๋ก์ฐ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ๋ง๊ณ JavaScript์ ๋์์ ๋ณด์ฌ์ฃผ๋ ์ข์ ์์ ๋๋ค.
๋ ๋ง์ ๊ฒ๋ค์ด ์งํ๋๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ ๋ฃจํ์ ๊ธฐ๋ณธ์ ์ธ ์ค๋ช ๊ณผ ์ด์ ๊ด๋ จ๋ ๊ฒ๋ค ์ ๋๋ค. ๋๋๋ก์ด๋ฉด ์ด๋ฅผ ๊ฐ๋จํ๊ฒ ์ ์งํ๊ธฐ ์ํด ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ ์ฒด ํ๋ก์ธ์ค์ ์ฐธ์ฌํ์ง ์๊ณ ์ํํ๋ ์์ ์ ์ค๋ช ํ ์์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.๋ค๋ฅธ ์ ์ ์ด ์ค๋ช ์ด V8 JavaScript ์์ง์ ๋งฅ๋ฝ์ ์๋ค๋ ๊ฒ์ ๋๋ค. Chrome์ ์์ง์ด๋ฉฐ ๋ ธ๋์์๋ ์ฌ์ฉ๋ฉ๋๋ค.