
๋ก์ฐ ๋ ๋ฒจ๋ก ์ดํด๋ณด๋ Node.js ์ด๋ฒคํธ ๋ฃจํ
1๋ ์ , ํ์๋ setImmediate & process.nextTick์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ๋ฉด์ Node.js์ ์ด๋ฒคํธ ๋ฃจํ ๊ตฌ์กฐ์ ๋ํด ์ด์ง ์ธ๊ธํ ์ ์ด ์์๋ค. ๋๋๊ฒ๋ ๋ ์ ๋ถ๋ค์ ์๋ ์ค๋ช ํ๋ ค๊ณ ํ๋ ๋ถ๋ถ๋ณด๋ค ์ด๋ฒคํธ ๋ฃจํ ๋ถ๋ถ์ ๋ํด์ ๋ ๋ง์ด ๊ด์ฌ์ ์ฃผ์๊ณ , ํ์๋ ๊ทธ ๋ถ๋ถ์ ๋ํด์ ๋ง์ ์ง๋ฌธ์ ๋ฐ์์๋ค. ๊ทธ๋์ ์ด๋ฒ์๋ Node.js์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ตฌ์ฑํ๋ ๋ก์ฐ ๋ ๋ฒจ์ ๋์์ ์์ธํ๊ฒ ์ค๋ช ํด๋ณด๋ ค๊ณ ํ๋ค.
์ด ํฌ์คํ ์ 2018๋ 2์ 19์ผ์ Paul Shan์ด ์์ฑํ Node.js event loop workflow & lifecycle in low level๋ฅผ ๋ฒ์ญํ ๊ธ์ ๋๋ค. ์์ญ์ด ์์ ์ ์์ต๋๋ค.
์ ์ด ํฌ์คํ ์ ์์ฑํ๊ฒ ๋์๋?
๋ง์ฝ์ ์ฌ๋ฌ๋ถ์ด ๊ตฌ๊ธ์์ node.js event loop
๋ฅผ ๊ฒ์ํ๋ฉด ๋์ค๋ ๋๋ถ๋ถ์ ์ํฐํด๋ค์ ์์ธํ ๋ด์ฉ์ ์ค๋ช
ํด์ฃผ์ง ์๋๋ค. (๊ทธ๋ค์ ๋งค์ฐ ๊ฑฐ์์ ์ผ๋ก๋ง ์ด ๊ณผ์ ์ ๋ฌ์ฌํ๋ ค๊ณ ํ๋ค.)

์ ๊ทธ๋ฆผ์ ๊ตฌ๊ธ์์ nodejs event loop
๋ฅผ ๊ฒ์ํ์ ๋ ๋์ค๋ ์ด๋ฏธ์ง๋ค์ ์บก์ณํ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ค์์ ์ด๋ฏธ์ง ๊ฒฐ๊ณผ๋ค์ ์๋ชป ๋์๊ฑฐ๋ ์ค์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํด์ ๊ฑฐ์์ ์ผ๋ก๋ง ์ค๋ช
ํ๊ณ ์๋ค. ์ด๋ฐ ๋ฐฉ์์ ์ค๋ช
๋ค ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ์ข
์ข
์ด๋ฒคํธ ๋ฃจํ์ ๋ํ ์๋ชป๋ ์ดํด๋ฅผ ํ๊ฒ ๋๋ค. ์๋ ์ค๋ช
ํ ๋ช๊ฐ์ง ๊ฐ๋
์ ๊ฐ๋ฐ์๋ค์ด ์๋ชป ์๊ณ ์๋ ๋ช๊ฐ์ง ๊ฐ๋
๋ค์ด๋ค.
๋ํ์ ์ธ ์๋ชป๋ ๊ฐ๋ ๋ค
์ด๋ฒคํธ ๋ฃจํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๋ด๋ถ์ ์๋ค
๋ํ์ ์ธ ์๋ชป๋ ๊ฐ๋ ๋ค ์ค ํ๋๋ ๋ฐ๋ก ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(V8, Spider Monkey ๋ฑ)์ ์ผ๋ถ๋ผ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ฒคํธ ๋ฃจํ๋ ๋จ์ง ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๊ธฐ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด์ฉํ๊ธฐ๋ง ํ ๋ฟ์ด๋ค. (์ญ์ฃผ: ์ค์ ๋ก V8 ์์ง์๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ด๋ฆฌํ๋ ์ฝ๋๊ฐ ์๋ค. Node.js๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋ด๋นํ๋ ๊ฒ)
์ด๋ฒคํธ ๋ฃจํ๋ ํ๋์ ์คํ ๋๋ ํ๋์ ํ๋ก๋ง ์๋ํ๋ค
๋จผ์ , ์ด๋ฒคํธ ๋ฃจํ์ ์์ ์ ๋ด์๋๋ ์คํ ๊ฐ์ ๊ฒ์ ์กด์ฌํ์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์๋ํ๋ ๊ณผ์ ์ ์ฌ๋ฌ ๊ฐ์ ํ(์๋ฃ๊ตฌ์กฐ์์์ ๊ทธ ํ ๋ง๋ค.)๋ฅผ ์ฌ์ฉํ๋ ๋ณต์กํ ๊ณผ์ ์ด๋ค. ๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์ฝ๋ฐฑ์ด ๋จ ํ๋์ ํ๋ง ์ฌ์ฉํ์ฌ ์ํ๋๋ค๊ณ ์๊ณ ์๋๋ฐ, ์ด๊ฒ์ ์์ ํ ์๋ชป๋ ์๊ฐ์ด๋ค.
์ด๋ฒคํธ ๋ฃจํ๋ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋์์ ์คํ๋๋ค
Node.js ์ด๋ฒคํธ ๋ฃจํ์ ์๋ชป๋ ๋ค์ด์ด๊ทธ๋จ๋ค ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ํ ๊ฐ์ ์ค๋ ๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ์ ๋ด๋นํ๊ณ ๋ค๋ฅธ ํ ๊ฐ๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋ด๋นํ๋, ์ด ๋ ๊ฐ์ ์ค๋ ๋๊ฐ ์๋ค๊ณ ์๊ฐํ๊ฒ ๋์๋ค. (ํ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋น ์์ ์ ๊ทธ๋ ๊ฒ ์๊ฐํ๋ค.)
๊ทธ๋ฌ๋ ์ค์ ๋ก๋ ๋จ์ผ ์ค๋ ๋๋ก ์ด ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ค.
setTimeout์ ์ผ๋ถ ๋น๋๊ธฐ OS API์ ๊ด๋ จ์๋ค.
๋ ๋ค๋ฅธ ํฐ ์คํด๋ setTimeout
์ ๋๋ ์ด๊ฐ ๋๋ฌ์ ๋ ์ฝ๋ฐฑ์ด ์ธ๋ถ์ ์์ธ์ผ๋ก ์ธํด(OS๋ ์ปค๋ ๊ฐ์) ์ํด ์ด๋ค ์์
ํ์ ๋ค์ด๊ฐ๊ฒ ๋๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ฒคํธ ๋ฃจํ์ ์ด๋ฐ ์ธ๋ถ์ ์์ธ ๊ฐ์ ๊ฑด ์๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์์ ์ด ๋ฉ์ปค๋์ฆ์ ๋ํด์ ์ข ๋ ์์ธํ ์์๋ณผ ๊ฒ์ด๋ค.
setImmediate์ ์ฝ๋ฐฑ์ ์์ ํ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ์ ์์นํ๋ค
๋ณดํต ์ผ๋ฐ์ ์ธ ์ด๋ฒคํธ ๋ฃจํ์ ๋ํ ์ค๋ช
๋ค์ ํ๋์ ํ๋ง ๊ฐ์ง๊ณ ์ค๋ช
์ ์งํํ๊ธฐ ๋๋ฌธ์, ๋ช๋ช ๊ฐ๋ฐ์๋ค์ setImmediate()
๊ฐ ์ฝ๋ฐฑ์ ์์
ํ์ ๊ฐ์ฅ ์์ชฝ์ ๋ฐฐ์นํ๋ API๋ผ๊ณ ์๊ฐํ๊ฒ ๋๋ค. ํ์ง๋ง ์ด๊ฒ์ ์์ ํ ํ๋ฆฐ ์๊ฐ์ด๋ฉฐ, ๋ชจ๋ ์์
ํ๋ค์ FIFO(First In First Out)
๋ก๋ง ์๋ํ๋ค. (์ญ์ฃผ: ํ์ ๋ค์ด์๋ ์์
์ ํฌ์ง์
์ ์ ๋ ๋ณ๊ฒฝํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๋ฌด์กฐ๊ฑด ํ์ ๋จผ์ ๋ค์ด๊ฐ ์์
์ด ๋จผ์ ์คํ๋๋ค.)
์ด๋ฒคํธ ๋ฃจํ์ ๊ตฌ์กฐ
์ผ๋จ ์ด๋ฒคํธ ๋ฃจํ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ด๋ฒคํธ ๋ฃจํ์ ํ๋ฆ์ ๋ํด์ ์๊ณ ์์ด์ผ ํ๋ค. ์ด๋ฏธ ํ๋ฒ ์ธ๊ธํ๋ฏ์ด, ๊ฑฐ์์ ์ธ ํ๋์ ํ๋ง ๋ณด๋ ๊ฒ์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ดํดํ๋ ๋ฐ ๋ณ๋ก ๋์์ด ๋์ง ์๋๋ค. ์๋ ๊ทธ๋ฆผ์ด ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ ๋๋ก ์ค๋ช ํ ๊ทธ๋ฆผ์ด๋ค.

์ด ๊ทธ๋ฆผ์ ํ๊ธฐ๋ ๊ฐ๊ฐ์ ๋ฐ์ค๋ ํน์ ์์
์ ์ํํ๊ธฐ ์ํ ํ์ด์ฆ๋ค์ ์๋ฏธํ๋ค. ๊ฐ ํ์ด์ฆ๋ ๊ฐ์ ํ๋์ ํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ์ ์ด ํ์ด์ฆ๋ค ์ค Idle, prepare
ํ์ด์ฆ๋ฅผ ์ ์ธํ ์ด๋ ๋จ๊ณ์์๋ ํ ์ ์๋ค. (์ดํด๋ฅผ ๋๊ธฐ ์ํด ํ๋ผ๊ณ ์ค๋ช
ํ์ง๋ง ์ฌ์ค ์ค์ ์๋ฃ๊ตฌ์กฐ๋ ํ๊ฐ ์๋ ์๋ ์๋ค.)
๊ทธ๋ฆฌ๊ณ ์ด ๊ทธ๋ฆผ์์ nextTickQueue
์ microTaskQueue
๋ฅผ ๋ณผ ์ ์๋๋ฐ, ์ด ํ๋ค์ ์ด๋ฒคํธ ๋ฃจํ์ ์ผ๋ถ๊ฐ ์๋๋ฉฐ, ์ด ํ๋ค์ ๋ค์ด์๋ ์์
๋ํ ์ด๋ค ํ์ด์ฆ์์๋ ์คํ๋ ์ ์๋ค. ๋ํ ์ด ํ๋ค์ ๋ค์ด์๋ ์์
์ ๊ฐ์ฅ ๋์ ์คํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๊ฐ์ ๋ค๋ฅธ ์ฌ๋ฌ ๊ฐ์ ํ์ด์ฆ๋ค๊ณผ ํ๋ค์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ์ด์ ๊ฐ๊ฐ์ ํ์ด์ฆ๊ฐ ์ด๋ค ์์ ์ ์ํํ๋ ์ง ์์๋ณด์.
Timer phase
Timer phase
๋ ์ด๋ฒคํธ ๋ฃจํ์ ์์์ ์๋ฆฌ๋ ํ์ด์ฆ์ด๋ค. ์ด ํ์ด์ฆ๊ฐ ๊ฐ์ง๊ณ ์๋ ํ์๋ setTimeout
์ด๋ setInterval
๊ฐ์ ํ์ด๋จธ๋ค์ ์ฝ๋ฐฑ์ ์ ์ฅํ๊ฒ ๋๋ค. ์ด ํ์ด์ฆ์์ ๋ฐ๋ก ํ์ด๋จธ๋ค์ ์ฝ๋ฐฑ
์ด ํ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ์๋์ง๋ง ํ์ด๋จธ
๋ค์ min-heap
์ผ๋ก ์ ์งํ๊ณ ์๋ค๊ฐ ์คํํ ๋๊ฐ ๋ ํ์ด๋จธ๋ค์ ์ฝ๋ฐฑ์ ํ์ ๋ฃ๊ณ ์คํํ๋ ๊ฒ์ด๋ค.
์ญ์ฃผ: ํ(Heap)์ ์์ ์ด์งํธ๋ฆฌ์ ์ผ์ข ์ผ๋ก ์ด๋ ์ ๋์ ๋์จํ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ค์ ์งํฉ์์ ์ต๋ ๊ฐ์ด๋ ์ต์ ๊ฐ์ ์ฐพ์๋ด๋ ์์ ์ ํนํ๋์ด ์๋ค. min-heap์ ์์ ๋ ๋ฒจ์ ๋ ธ๋๊ฐ ํ์ ๋ ๋ฒจ์ ๋ ธ๋๋ค๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ตฌ์กฐ์ด๋ฏ๋ก ํ์ด๋จธ๊ฐ ์คํ๋์ด์ผํ๋ ์์๋๋ก ์ ์ฅํ๊ธฐ์ ์๋ง๋ ์๋ฃ ๊ตฌ์กฐ๋ผ๊ณ ํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ ์ฝ๋ฐฑ์ ๋ฃ๋๋ค๋ ๊ฒ์, ์ด ์ฝ๋ฐฑ๋ค์ ์คํํ๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ํ์ด๋จธ๊ฐ ์์ฑ๋์ง๋ง์ ํ์ ์ฝ๋ฐฑ์ ๋ฃ๋ ๊ฒ์ด ์๋๋ผ ๋ณ๋์ ํ์ ํ์ด๋จธ๋ฅผ ์ ์ฅํ๊ณ ๋์ ๋งค Timer phase ๋ ์ด๋ค ํ์ด๋จธ๊ฐ ์คํํ ๋๊ฐ ๋์๋์ง๋ฅผ ๊ฒ์ฌํ ํ, ์คํ๋์ด์ผ ํ๋ ์ฝ๋ฐฑ๋ง ํ์ ๋ฃ๋๋ค๋ ๊ฒ์ด๋ค. ์ด ๊ณผ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฐ์์ ๋ค์ ์ค๋ช ํ๊ฒ ๋ค.
Pending i/o callback phase
์ด ํ์ด์ฆ์์๋ ์ด๋ฒคํธ ๋ฃจํ์ pending_queue
์ ๋ค์ด์๋ ์ฝ๋ฐฑ๋ค์ ์คํํ๋ค. ์ด ํ์ ๋ค์ด์์๋ ์ฝ๋ฐฑ๋ค์ ํ์ฌ ๋๊ณ ์๋ ๋ฃจํ ์ด์ ์ ํ ์์
์์ ์ด๋ฏธ ํ์ ๋ค์ด์์๋ ์ฝ๋ฐฑ๋ค์ด๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ฌ๋ถ์ด TCP ํธ๋ค๋ฌ ์ฝ๋ฐฑ ํจ์์์ ํ์ผ์ ๋ญ๊ฐ๋ฅผ ์ผ๋ค๋ฉด TCP ํต์ ์ด ๋๋๊ณ ํ์ผ ์ฐ๊ธฐ๋ ๋๋๊ณ ๋์ ํ์ผ ์ฐ๊ธฐ์ ์ฝ๋ฐฑ์ด ์ด ํ์ ๋ค์ด์ค๋ ๊ฒ์ด๋ค.(ํ์ผ ์ฐ๊ธฐ๋ ๋ณดํต ๋น๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๋ค.) ๋ํ ์๋ฌ ํธ๋ค๋ฌ ์ฝ๋ฐฑ๋ pending_queue
๋ก ๋ค์ด์ค๊ฒ ๋๋ค.
Idle, Prepare phase
์ด๋ฆ์ Idle phase
์ด์ง๋ง ์ด ํ์ด์ฆ๋ ๋งค Tick๋ง๋ค ์คํ๋๋ค. Prepare phase
๋ํ ๋งค ํด๋ง(Polling)๋๋ง๋ค ์คํ๋๋ค. ์ด์จ๋ ์ด ๋๊ฐ์ ํ์ด์ฆ๋ ์ด๋ฒคํธ ๋ฃจํ์ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์๋ค๊ธฐ๋ณด๋ค๋ Node.js์ ๋ด๋ถ์ ์ธ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด ํฌ์คํ
์์๋ ์ค๋ช
ํ์ง ์๋๋ค.
Poll phase
ํ์๊ฐ ์๊ฐํ๊ธฐ์ ์ ์ฒด ์ด๋ฒคํธ ๋ฃจํ ์ค ๊ฐ์ฅ ์ค์ํ ํ์ด์ฆ๋ ๋ฐ๋ก ์ด Poll phase
๋ผ๊ณ ์๊ฐํ๋ค. ์ด ํ์ด์ฆ์์๋ ์๋ก์ด ์์ ์ปค๋ฅ์
(์๋ก์ด ์์ผ ์ค์ ๋ฑ)๊ณผ ๋ฐ์ดํฐ(ํ์ผ ์ฝ๊ธฐ ๋ฑ)๋ฅผ ํ์ฉํ๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ์ผ์ด๋๋ ์ผ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋ ๋ณผ ์ ์๋ค.
- ๋ง์ฝ
watch_queue
(Poll phase๊ฐ ๊ฐ์ง๊ณ ์๋ ํ)๊ฐ ๋น์ด์์ง ์๋ค๋ฉด, ํ๊ฐ ๋น๊ฑฐ๋ ์์คํ ์ต๋ ์คํ ํ๋์ ๋ค๋ค๋ฅผ ๋๊น์ง ๋๊ธฐ์ ์ผ๋ก ๋ชจ๋ ์ฝ๋ฐฑ์ ์คํํ๋ค. - ์ผ๋จ
watch_queue
๊ฐ ๋น์ด์๋ค๋ฉด, Node.js๋ ๊ณง๋ฐ๋ก ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ๋ ๊ฒ์ด ์๋๋ผ ์ฝ๊ฐ ๋๊ธฐ์๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค. Node.js๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ์ฌ๋ฌ ๊ฐ์ง ์์ธ์ ๋ฐ๋ผ ๊ณ์ฐ๋๋๋ฐ, ์ด ๋ถ๋ถ์ ๋ฐ์์ ๋ฐ๋ก ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค.
Check phase
Poll phase
์ ๋ค์ ํ์ด์ฆ๋ ๋ฐ๋ก setImmediate
์ ์ฝ๋ฐฑ๋ง์ ์ํ ํ์ด์ฆ์ธ Check phase
์ด๋ค. ์ด๋ ๊ฒ ์๊ธฐํ๋ฉด ๋ณดํต ํ์๋ ์ง๋ฌธ์, ์ setImmediate์ ์ฝ๋ฐฑ๋ง์ ์ํ ํ์ธ๊ฐ์?
์ด๋ค. ์, ๊ทธ๊ฑด ๋ฐ์์ ํ์๊ฐ ์ํฌ ํ๋ก์ฐ ์น์
์์ ๋ค์ ์๊ธฐํ Poll phase
์์ ์ํํ๋ ํ๋๋ค ๋๋ฌธ์ด๊ธฐ๋ ํ๋ค. ์ผ๋จ ์ง๊ธ์ Check phase
๊ฐ setImmediate
์ ์ฝ๋ฐฑ ์ ์ฉ ๋จ๊ณ๋ผ๋ ์ฌ์ค๋ง ๊ธฐ์ตํ๊ณ ์์.
Close callbacks
socket.on('close', () => {})
๊ณผ ๊ฐ์ close
์ด๋ฒคํธ ํ์
์ ํธ๋ค๋ฌ๋ค์ ์ฌ๊ธฐ์ ์ฒ๋ฆฌ๋๋ค.
nextTickQueue์ microTaskQueue
nextTickQueue
๋ process.nextTick()
API์ ์ฝ๋ฐฑ๋ค์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, microTaskQueue
๋ Resolve๋ ํ๋ก๋ฏธ์ค์ ์ฝ๋ฐฑ์ ๊ฐ์ง๊ณ ์๋ค.
์ด ๋๊ฐ์ ํ๋ ๊ธฐ์ ์ ์ผ๋ก ์ด๋ฒคํธ ๋ฃจํ์ ์ผ๋ถ๊ฐ ์๋๋ค. ์ฆ, libUV
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋ ๊ฒ์ด ์๋๋ผ Node.js
์ ํฌํจ๋ ๊ธฐ์ ์ด๋ผ๋ ๊ฒ์ด๋ค. ์ด ์น๊ตฌ๋ค์ด ๊ฐ์ง๊ณ ์๋ ์์
๋ค์ ํ์ฌ ์คํ๋๊ณ ์๋ ์์
์ด ๋๋์๋ง์ ํธ์ถ๋์ด์ผํ๋ค.
์ญ์ฃผ: libUV๋ Node.js์์ ์ฌ์ฉํ๋ ๋น๋๊ธฐ I/O ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ C๋ก ์์ฑ๋์๊ณ ์๋์ฐ๋ ๋ฆฌ๋ ์ค ์ปค๋์ ์ถ์ํํด์ Wrappingํ๊ณ ์๋ ๊ตฌ์กฐ์ด๋ค. ์ฆ, ์ปค๋์์ ์ด๋ค ๋น๋๊ธฐ ์์ ๋ค์ ์ง์ํด์ฃผ๋ ์ง ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ปค๋์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ์ ์๋ ๋น๋๊ธฐ ์์ ์ ๋ฐ๊ฒฌํ๋ฉด ๋ฐ๋ก ์ปค๋๋ก ์์ ์ ๋๊ฒจ๋ฒ๋ฆฐ๋ค.
์ดํ ์ด ์์ ๋ค์ด ์ข ๋ฃ๋์ด OS ์ปค๋๋ก๋ถํฐ ์์คํ ์ฝ์ ๋ฐ์ผ๋ฉด ์ด๋ฒคํธ ๋ฃจํ์ ์ฝ๋ฐฑ์ ๋ฑ๋กํ๋ ๊ฒ์ด๋ค. ๋ง์ฝ OS ์ปค๋์ด ์ง์ํ์ง ์๋ ์์ ์ผ ๊ฒฝ์ฐ ๋ณ๋์ ์ค๋ ๋์ ์์ ์ ๋์ ธ์ ์ฒ๋ฆฌํ๋ค. ์ด ์ค๋ ๋์ ๊ดํ ๋ด์ฉ์ ์์์๊ฐ ๋ฐ์์ ์ถ๊ฐ์ ์ผ๋ก ์ค๋ช ํ๊ณ ์๋ค.
์ด๋ฒคํธ ๋ฃจํ์ ์์ ํ๋ฆ
์ฐ๋ฆฌ๊ฐ node my-script.js
๋ฅผ ์ฝ์์์ ์คํ์์ผฐ์ ๋, Node.js๋ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์์ฑํ ๋ค์ ์ด๋ฒคํธ ๋ฃจํ ๋ฐ๊นฅ์์ ๋ฉ์ธ ๋ชจ๋์ธ my-script.js
๋ฅผ ์คํํ๋ค. ํ๋ฒ ๋ฉ์ธ ๋ชจ๋์ด ์คํ๋๊ณ ๋๋ฉด Node.js๋ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ํ์ฑ ์ํ์ธ์ง, ์ฆ ์ด๋ฒคํธ ๋ฃจํ ์์์ ํด์ผํ ์์
์ด ์๋์ง๋ฅผ ํ์ธํ๋ค. ๋ง์ฝ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋๋ฆด ํ์๊ฐ ์๋ค๋ฉด Node.js๋ process.on('exit, () => {})
๋ฅผ ์คํํ๊ณ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ข
๋ฃํ๋ ค๊ณ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๋๋ ค์ผํ ์ํฉ์ด๋ผ๋ฉด Node.js๋ ์ด๋ฒคํธ ๋ฃจํ์ ์ฒซ ๋ฒ์งธ ํ์ด์ฆ์ธ Timer phase
๋ฅผ ์คํํ๋ค.

Timer phase
์ด๋ฒคํธ ๋ฃจํ๊ฐ Timer phase
์ ๋ค์ด๊ฐ๊ฒ ๋๋ฉด ์คํํ ํ์ด๋จธ ์ฝ๋ฐฑ ํ์ ๋ญ๊ฐ ์๋ ์ง ํ์ธ๋ถํฐ ์์ํ๋ค. ๊ทธ๋ฅ ํ์ธ์ด๋ผ๊ณ ํ๋ฉด ๊ฐ๋จํด๋ณด์ด์ง๋ง ์ฌ์ค ์ด๋ฒคํธ ๋ฃจํ๋ ์ ์ ํ ์ฝ๋ฐฑ๋ค์ ์ฐพ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ์ํํ๊ฒ๋๋ค.
์์์ ์ค๋ช
ํ๋ฏ์ด ํ์ด๋จธ ์คํฌ๋ฆฝํธ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ํ์ ์ ์ฅ๋๋ค. ๊ทธ๋์ ์ ์ผ ๋จผ์ ์ ์ฅ๋ ํ์ด๋จธ๋ค์ ํ๋์ฉ ๊น์ now - registeredTime === delta
๊ฐ์ ์กฐ๊ฑด์ ํตํด ํ์ด๋จธ์ ์ฝ๋ฐฑ์ ์คํํ ์๊ฐ์ด ๋์๋ ์ง ๊ฒ์ฌํ๊ฒ ๋๋ค.(์ญ์ฃผ: delta
๋ setTimeout(() => {}, 10)
์์์ 10
)
๋ง์ฝ ์กฐ๊ฑด์ ํด๋น๋๋ค๋ฉด ์ด ํ์ด๋จธ์ ์ฝ๋ฐฑ์ ์คํํ๊ณ ๋ค์ ํ์ด๋จธ๋ฅผ ํ์ธํ๋ค. ๋ง์ฝ ์กฐ๊ฑด์ ํด๋นํ์ง ์๋ ํ์ด๋จธ๋ฅผ ๋ง๋๋ค๋ฉด, ํ์์ ๋ฐ๋ก ์ข ๋ฃํ๊ณ ๋ค์ ํ์ด์ฆ๋ก ์ด๋ํ๋ค. ํ์ด๋จธ๋ ํ ๋ด๋ถ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด์๊ธฐ ๋๋ฌธ์ ๊ทธ ์ดํ๋ก๋ ํ์์ ํด๋ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์, ์๋ฅผ ๋ค์ด ๋๋ ์ด ๊ฐ์ด 100
, 200
, 300
, 400
์ธ 4๊ฐ์ ํ์ด๋จธ(A, B, C, D)๋ฅผ ์ด๋ค ํน์ ์๊ฐ t
์ ํ์ ๋ฑ๋กํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.

์ด์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ t+250
์ Timer phase์ ์ง์
ํ๋ค๊ณ ์๊ฐํด๋ณด์.
๊ฐ์ฅ ๋จผ์ ํ์ด๋จธ A๋ฅผ ์ฐพ์๋ธ ํ ๋ง๋ฃ ๊ธฐ๊ฐ์ด t+100
์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ง๊ธ์ ์ด๋ฏธ t+250
์ด๊ธฐ ๋๋ฌธ์ ํ์ด๋จธ A์ ์ฝ๋ฐฑ์ ์คํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด๋จธ B๋ฅผ ์ฐพ์๋ด์ด ๋ง๋ฃ ๊ธฐ๊ฐ์ด t+200
์์ ์ฒดํฌํ๊ฒ๋๊ณ , ํ์ด๋จธ B์ ์ฝ๋ฐฑ ์ญ์ ์คํ๋๋ค.
์ด์ ํ์ด๋จธ C๋ฅผ ์ฒดํฌํ๊ฒ ๋๋๋ฐ ์ด ํ์ด๋จธ์ ๋๋ ์ด๋ t+300
์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ํ์ด์ฆ๊ฐ ์ข
๋ฃ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ํ์ด๋จธ D๋ ์ฒดํฌํ์ง ์๋๋ฐ, ์์์ ์ค๋ช
ํ๋ฏ์ด ํ์ด๋จธ๋ค์ ๋ง๋ฃ ๊ธฐ๊ฐ ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋์ด์๊ธฐ ๋๋ฌธ์ ํ์ด๋จธ C์ ๋ค์ชฝ์๋ ์ด์ฐจํผ ํ์ด๋จธ C๋ณด๋ค ๋ง๋ฃ ๊ธฐ๊ฐ์ด ๊ธด ํ์ด๋จธ๋ค๋ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฐธ๊ณ ๋ก ํ์ด์ฆ๋ ์์คํ ์ ์คํ ํ๋์๋ ์ํฅ์ ๋ฐ๊ณ ์์ผ๋ฏ๋ก, ์คํ ๋์ด์ผํ๋ ํ์ด๋จธ๊ฐ ์์ง ๋จ์ ์๋ค๊ณ ํ๋๋ผ๋ ์์คํ ์คํ ํ๋์ ๋๋ฌํ๋ค๋ฉด ๋ฐ๋ก ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ๊ฒ๋๋ค.
Pending i/o phase
ํ์ ํ์ด์ฆ๊ฐ ์ข
๋ฃ๋ ํ ์ด๋ฒคํธ ๋ฃจํ๋ Pending i/o ํ์ด์ฆ์ ์ง์
ํ๊ณ , ๊ฐ์ฅ ๋จผ์ ์ด์ ์์
๋ค์ ์ฝ๋ฐฑ์ด ์คํ ๋๊ธฐ ์ค์ธ์ง, ์ฆ pending_queue
์ ๋ค์ด์ ์๋์ง๋ฅผ ์ฒดํฌํ๊ฒ ๋๋ค. ๋ง์ฝ ์คํ ๋๊ธฐ ์ค์ด๋ผ๋ฉด pending_queue
๊ฐ ๋น๊ฑฐ๋ ์์คํ
์ ์คํ ํ๋ ์ด๊ณผ์ ๋๋ฌํ ๋๊น์ง ๋๊ธฐํ๊ณ ์๋ ์ฝ๋ฐฑ๋ค์ ์คํํ๋ค. ์ด ๊ณผ์ ์ด ์ข
๋ฃ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ Idle Handler Phase
๋ก ์ด๋ํ๊ฒ ๋ ํ ๋ด๋ถ ์ฒ๋ฆฌ๋ฅผ ์ํ Prepare phase
๋ฅผ ๊ฑฐ์ณ ์ต์ข
์ ์ผ๋ก ๊ฐ์ฅ ์ค์ํ ๋จ๊ณ์ธ Poll Phase
์ ๋๋ฌํ๊ฒ ๋๋ค.
Poll phase
์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ด ํ์ด์ฆ๋ ํด๋งํ๋ ๋จ๊ณ์ด๋ค. ์ด๋ฒคํธ ๋ฃจํ๊ฐ Poll phase
์ ๋ค์ด์์ ๋ watcher_queue
๋ด๋ถ์ ํ์ผ ์ฝ๊ธฐ์ ์๋ต ์ฝ๋ฐฑ, HTTP ์๋ต ์ฝ๋ฐฑ ๊ฐ์ด ์ํํด์ผ ํ ์์
๋ค์ด ์๋ค๋ฉด ์ด ์์
๋ค์ ์คํํ๊ฒ ๋๋ค. ์ด ๊ณผ์ ๋ํ watcher_queue
๊ฐ ๋น๊ฑฐ๋ ์์คํ
์ ์คํ ํ๋ ์ด๊ณผ์ ๋ค๋ค๋ฅผ ๋๊น์ง ๊ณ์ ๋๋ค.
๋ง์ฝ ๋ ์ด์ ์ฝ๋ฐฑ๋ค์ ์คํํ ์ ์๋ ์ํ๊ฐ ๋๋ค๋ฉด ๋ง์ฝ check_queue
, pending_queue
, closing_callbacks_queue
์ ํด์ผํ ์์
์ด ์๋์ง๋ฅผ ๊ฒ์ฌํ๊ณ , ๋ง์ฝ ํด์ผํ ์์
์ด ์๋ค๋ฉด ๋ฐ๋ก Poll phase
๊ฐ ์ข
๋ฃ๋๊ณ ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ๊ฒ ๋๋ค. ํ์ง๋ง ํน๋ณํ ํด์ผํ ์์
์ด ๋ ์ด์ ์๋ ๊ฒฝ์ฐ Poll phase
๋ ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ์ง ์๊ณ ๊ณ์ ๋๊ธฐํ๊ฒ ๋๋ค.
์ด๋๋ ๋ง๋ฅ ๋ฌดํ ๋๊ธฐ๋ฅผ ํ๋ ๊ฒ์ ์๋๊ณ , ํ์ด๋จธ ํ์์ ์ฒซ๋ฒ์งธ ํ์ด๋จธ๋ฅผ ๊บผ๋ด๋ณธ ๋ค์์ ๋ง์ฝ ํด๋น ํ์ด๋จธ๊ฐ ์คํ ๊ฐ๋ฅํ ์ํ๋ผ๋ฉด ๊ทธ ํ์ด๋จธ์ ๋๋ ์ด ์๊ฐ๋งํผ๋ง ๋๊ธฐ ์๊ฐ์ ๊ฒฐ์ ํ๋ค.
์ญ์ฃผ: ๊ฒฐ๊ตญ Poll phase์์ ๋ ์ด์ ์ํํ ์์ ์ด ์๋ ๊ฒฝ์ฐ ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ๋ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ๋ค.
Check phase
์ ์คํํ ์ฝ๋ฐฑ์ด ์๋? ๋ฐ๋ก ๋ค์ ํ์ด์ฆ๋ก ๊ณ ๊ณCheck phase
์๋ ์คํํ ์ฝ๋ฐฑ์ด ์์ด? ๊ทธ๋ผ ํ์ด๋จธ๋ ์์ด? ์๋ค๋ฉด ๊ทธ ํ์ด๋จธ๋ฅผ ์คํ ํ ์ ์๋ ์๊ฐ์ด ๋ ๋๊น์ง๋ง ๋๊ธฐํ๊ณ ๋ฐ๋ก Timer phase๋ก ๊ณ ๊ณ- ์์ด? ๊ทธ๋ผ ์ผ ์๊ธธ ๋๊น์ง ๋๊ธฐโฆ
2๋ฒ ์กฐ๊ฑด์์ ํ์ด๋จธ๊ฐ ์๋ค๊ณ ๋ฐ๋ก Timer phase๋ก ๋์ด๊ฐ์ง ์๊ณ ๋๊ธฐํ๋ ์ด์ ๋, ๋๊ธฐํ์ง์๊ณ ๋ฐ๋ก Timer phase๋ก ๋์ด๊ฐ ๊ฒฝ์ฐ ์ด์ฐจํผ ์ฒซ๋ฒ์งธ ํ์ด๋จธ๋ฅผ ์คํํ ์ ์๋ ์๊ฐ์ด ์๋์๊ธฐ ๋๋ฌธ์ Timer phase์์๋ ์๋ฌด๊ฒ๋ ์ํํ์ง ์๊ณ Timer phase๊ฐ ๋๋๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ๊ตณ์ด ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํ๋ฒ ๋ ๋์์ผ์ง ํด๋น ํ์ด๋จธ๋ฅผ ์คํํ ์ ์๊ฒ๋๋ฏ๋ก ๊ทธ๋ฅ Poll phase์์ ๋๊ธฐํ๋ ๊ฒ ๋ ์ด๋์ธ ๊ฒ์ด๋ค.
Check phase
Poll phase
๊ฐ ์ง๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ๋ฐ๋ก setImmediate()
API์ ์ฝ๋ฐฑ๊ณผ ๊ด๋ จ์ด ์๋ Check phase
์ ๋ค์ด์๊ฒ ๋๋ค. ์ด ํ์ด์ฆ์์๋ ๋ค๋ฅธ ํ์ด์ฆ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๊ฐ ๋น๊ฑฐ๋ ์์คํ
์คํ ํ๋ ์ด๊ณผ์ ๋๋ฌํ ๋๊น์ง ๊ณ์ ํด์ setImmediate
์ ์ฝ๋ฐฑ๋ค์ ์คํํ๋ค.
Close callback
Check Phase
๊ฐ ์ข
๋ฃ๋ ํ์, ์ด๋ฒคํธ ๋ฃจํ์ ๋ค์ ๋ชฉ์ ์ง๋ close
๋ destory
์ฝ๋ฐฑ ํ์
๋ค์ ๊ด๋ฆฌํ๋ Close callback
์ด๋ค.
์ด๋ฒคํธ ๋ฃจํ๊ฐ Close callback
๋ค๊ณผ ํจ๊ป ์ข
๋ฃ๋๊ณ ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์์ ๋์์ผํ ๋ฃจํ๊ฐ ์๋์ง ๋ค์ ์ฒดํฌ ํ๊ฒ ๋๋ค. ๋ง์ฝ ์๋๋ผ๋ฉด ๊ทธ๋๋ก ์ด๋ฒคํธ ๋ฃจํ๋ ์ข
๋ฃ๋๋ค. ํ์ง๋ง ๋ง์ฝ ๋ ์ํํด์ผํ ์์
๋ค์ด ๋จ์ ์๋ค๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์ ์ํ๋ฅผ ๋๊ธฐ ์์ํ๊ณ ๋ค์ Timer Phase
๋ถํฐ ์์ํ๊ฒ ๋๋ค.
์๊น ์์์ ์ค๋ช
ํ๋ Timer Phase
์์์ ์์๋ฅผ ๋ค์ ๊ฐ์ ธ์ค์๋ฉด, ์ด์ ๋ค์ ๋ฃจํ์ Timer Phase
์์๋ ํ์ด๋จธ C์ ๋ง๋ฃ ์๊ฐ์ด ๊ฒฝ๊ณผํ๋์ง๋ถํฐ ํ์ธ์ ์์ํ ๊ฒ์ด๋ค.
nextTickQueue & microTaskQueue
๊ทผ๋ฐ ์ด๋ฒคํธ ๋ฃจํ์ ์ผ๋ถ๊ฐ ์๋ ์ด ๋ ํ์ ๋ค์ด์๋ ์ฝ๋ฐฑ๋ค์ ์ธ์ ์คํ๋๋ ๊ฑธ๊น? ์ด ๋ ํ์ ์ฝ๋ฐฑ๋ค์ ์ด๋ค ํ์ด์ฆ์์ ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ์์ ์ด ๊ฐ์ง๊ณ ์๋ ์ฝ๋ฐฑ๋ค์ ์ต๋ํ ๋นจ๋ฆฌ ์คํํด์ผํ๋ ์ญํ ์ ๋งก๊ณ ์๋ค.(์ญ์ฃผ: ํ์ด์ฆ์์ ๋ค๋ฅธ ํ์ด์ฆ๋ก ๋์ด๊ฐ๋ ๊ณผ์ ์ Tick์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
๋ค๋ฅธ ํ์ด์ฆ๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ์ด ๋ ํ๋ ์์คํ
์คํ ํ๋ ์ด๊ณผ์ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ Node.js๋ ์ด ํ๊ฐ ์์ ํ ๋น์์ง ๋๊น์ง ์ฝ๋ฐฑ๋ค์ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ nextTickQueue
๋ microTaskQueue
๋ณด๋ค๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
Thread-pool
ํ์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ๋ง์ด ๋ค์ ๋จ์ด๋ ๋ฐ๋ก ์ค๋ ๋ํ(ThreadPoll)
์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ๊ด๋ จ๋ ๊ฐ์ฅ ํฐ ์คํด๋ ๋ฐ๋ก Node.js๊ฐ ๋ชจ๋ ๋น๋๊ธฐ ๋ช
๋ น์ ๊ด๋ฆฌํ๋ ๋ณ๋์ ์ค๋ ๋ํ์ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด ์ค๋ ๋ํ์ Node.js๊ฐ ์๋๋ผ Node.js๊ฐ ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ libUV
์ ํฌํจ๋ ๊ธฐ๋ฅ์ด๋ผ๋ ๊ฒ์ด๋ค.
ํ์๊ฐ ์ด๋ฒคํธ ๋ฃจํ์ ๋ค์ด์ด๊ทธ๋จ์ ์ค๋ ๋ํ์ ๋ณ๋๋ก ํ์ํ์ง ์์ ์ด์ ๋ ์ค๋ ๋ํ ์์ฒด๊ฐ ์ด๋ฒคํธ ๋ฃจํ ๋งค์ปค๋์ฆ์ ์ผ๋ถ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ด๋ค. libUV
๋ OS์ปค๋์ ๋น๋๊ธฐ API๋ง์ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๋๋ฆฌ๋ธ์ ์ ๋ํ ์ ์์ ๋งํผ ์ถฉ๋ถํ ํ๋ฅญํ๋ค. ๊ทธ๋ฌ๋ ํ์ผ ์ฝ๊ธฐ, DNS Lookup ๋ฑ OS ์ปค๋์ด ๋น๋๊ธฐ API๋ฅผ ์ง์ํ์ง์๋ ์์
๋ค์ ๊ฒฝ์ฐ์๋ ๋ณ๋์ ์ค๋ ๋ํ์ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, ์ด๋ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก 4๊ฐ์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ๋์ด์๋ค. uv_threadpool
ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ต๋ 128๊ฐ๊น์ง ์ค๋ ๋ ๊ฐ์๋ฅผ ๋๋ฆด ์๋ ์๋ค.
Workflow with examples
์ด์ ์ด ๋๊ธฐ์ ๋ฌดํ ๋ฃจํ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์์ผ๋ก ์๋ํ๊ฒ ํ๊ธฐ ์ํด ์ผ๋ง๋ ํฐ ์ญํ ์ ํ๊ณ ์๋ ์ง ์ดํดํ๊ธฐ ๋ฐ๋๋ค. ์ด ๊ตฌ์กฐ๋ ํ๋ฒ์ ๋จ ํ๊ฐ์ ์์ ๋ง ์คํํ๊ณ ์์ง๋ง ๊ทธ ์ด๋ค ๊ฒ๋ ๋ธ๋กํนํ์ง ์๋๋ค. ์ด์จ๋ ๋ฐฑ๋ฌธ์ด๋ถ์ฌ์ผ๊ฒฌ์ด๋, ์ฝ๋ ์ค๋ํซ์ผ๋ก ์ด ๊ตฌ์กฐ๋ฅผ ๋ค์ ์ดํดํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ์.
Snippet 1 โ ๊ธฐ์ด ์ดํด
setTimeout(() => {
console.log('setTimeout');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํ ์ ์๊ฒ ๋๊ฐ? ์๋ง๋ ์ฌ๋ฌ๋ถ์ setTimeout
์ด ๋จผ์ ์ถ๋ ฅ๋๋ค๊ณ ์๊ฐํ๊ฒ ์ง๋ง, ์ฌ์ค ์ฅ๋ดํ ์ ์๋ค.
์๋? ๋ฉ์ธ ๋ชจ๋์ด ์คํ๋๊ณ ๋์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ Timer phase
์ ์ง์
ํ ๋ ์ฌ๋ฌ๋ถ์ ํ์ด๋จธ๋ฅผ ์ฐพ์ ์๋ ์๊ณ ๋ชป ์ฐพ์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋๋ฉด ํ์ด๋จธ๋ ์์คํ
์ ์๊ฐ๊ณผ ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ์๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฑ๋ก๋๊ธฐ ๋๋ฌธ์ด๋ค. setTimeout
์ด ํธ์ถ๋ ์๊ฐ, ํ์ด๋จธ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ด ํ์ด๋จธ๋ฅผ ์ ์ฅํ๊ฒ๋๋๋ฐ, ๊ทธ ์๊ฐ ์ปดํจํฐ์ ์ฑ๋ฅ์ด๋ Node.js๊ฐ ์๋ ์ธ๋ถ ์์
๋๋ฌธ์ ์ฝ๊ฐ์ ๋๋ ์ด๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ๋ค๋ฅธ ํฌ์ธํธ๋ Node.js๊ฐ Timer phase
์ ์ง์
ํ๊ธฐ ์ ์ ๋ณ์ now
๋ฅผ ์ ์ธํ๊ณ ๊ทธ ๋ณ์ now
๋ฅผ ํ์ฌ ์๊ฐ์ผ๋ก ๊ฐ์ฃผํ๋ค๋ ์ ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ ํํ ๊ณ์ฐ์ด๋ผ๊ณ ํ๊ธฐ์๋ ์ฝ๊ฐ์ ๋
ธ์ด์ฆ๊ฐ ๊ปด์๋ค๋ ๊ฒ์ด๊ณ , ์ด๊ฒ ๋ฐ๋ก setTimeout
์ด ๋ฐ๋์ ๋จผ์ ์คํ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ ์ ์๋ ๋ถํ์ค์ฑ์ ์ด์ ๊ฐ ๋๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์ด ์ฝ๋๋ฅผ I/O ์ฌ์ดํด์ ๋ด๋ถ๋ก ์ฎ๊ธด๋ค๋ฉด, ๋ฐ๋์ setTimeout
๋ณด๋ค setImmediate
๊ฐ ๋จผ์ ์คํ๋๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๊ฒ๋๋ค.
fs.readFile('my-file-path.txt', () => {
setTimeout(() => {
console.log('setTimeout');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
});
์ญ์ฃผ: ์ ์ค๋ํซ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์คํ๋๋ค.
fs.readFile
์ ๋ง๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ libUV์๊ฒ ํด๋น ์์ ์ ๋์ง.- ํ์ผ ์ฝ๊ธฐ๋ OS ์ปค๋์์ ๋น๋๊ธฐ API๋ฅผ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ libUV๋ ๋ณ๋์ ์ค๋ ๋์ ํด๋น ์์ ์ ๋์ง
- ์์ ์ด ์๋ฃ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋
Pending i/o callback phase
์pending_queue
์ ์์ ์ ์ฝ๋ฐฑ์ ๋ฑ๋ก- ์ด๋ฒคํธ ๋ฃจํ๊ฐ
Pending i/o callback phase
๋ฅผ ์ง๋ ๋ ํด๋น ์ฝ๋ฐฑ์ ์คํsetTimeout
์ดTimer phase
์ ํ์ ๋ฑ๋ก๋จ. ํด๋น ์ฝ๋ฐฑ์ ๋ค์Timer phase
๋ ์คํ๋ ๊ฒ์ด๋ค.setImmediate
์ ์ฝ๋ฐฑ์ดCheck phase
์check_queue
์ ๋ฑ๋ก๋จ.Poll phase
์์๋ ๋ฑํ ํ ์ผ์ด ์์ง๋ง,Check phase
์ ํ์ ์์ ์ด ์์ผ๋ฏ๋ก ๋ฐ๋กCheck phase
๋ก ์ด๋- setImmediate ์ฝ์ ์ถ๋ ฅ.
Timer phase
์๋ ํ์ด๋จธ๊ฐ ๋ฑ๋ก๋์ด ์์ผ๋ฏ๋ก ๋ค์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์์๋๋ค.Timer phase
์์ ํ์ด๋จธ๋ฅผ ๊ฒ์ฌ, ๋๋ ์ด๊ฐ 0์ด๋ฏ๋กsetTimeout
์ ์ฝ๋ฐฑ์ ๋ฐ๋ก ์คํํ๋ค.- setTimeout ์ฝ์ ์ถ๋ ฅ
์ฆ, ์ด๋ฐ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ ๋๋ฌธ์
setImmediate
์ ์ฝ๋ฐฑ์ด ๋ฐ๋์setTimeout
๋ณด๋ค ๋จผ์ ์คํ๋๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ ๊ฒ์ด๋ค.
Snippet 2 โ ํ์ด๋จธ๋ค์ ๋ ์ ์ดํดํ๊ธฐ
var i = 0;
var start = new Date();
function foo () {
i++;
if (i < 1000) {
setImmediate(foo);
} else {
var end = new Date();
console.log("Execution time: ", (end - start));
}
}
foo();
์์ ์์๋ ๊ต์ฅํ ๊ฐ๋จํ๋ค. ํจ์ foo
๋ setImmediate()
์ ์ํด์ 1000๋ฒ ์ฌ๊ทํธ์ถ๋๊ณ ์๋ค. ์ด ์ฝ๋๋ฅผ ํ์์ ๋งฅ๋ถ ํ๋ก์์ Node.js 8.9.1์ ์ฌ์ฉํ์ฌ ์คํํ๋ฉด ํจ์๊ฐ ์ข
๋ฃ๋๊ธฐ๊น์ง 6~8ms
์ ๋๊ฐ ๊ฑธ๋ฆฐ๋ค. ์ด์ ์์ ์ค๋ํซ์ setImmediate(foo)
์์ setTimeout(foo, 0)
์ผ๋ก ๋ณ๊ฒฝํด๋ณด์.
var i = 0;
var start = new Date();
function foo () {
i++;
if (i < 1000) {
setTimeout(foo, 0);
} else {
var end = new Date();
console.log("Execution time: ", (end - start));
}
}
foo();
์ด์ ํ์์ ์ปดํจํฐ์์ ์ด ์ฝ๋๊ฐ ์คํ๋๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ต 1400+ ms
์ ๋์ด๋ค.
์ ์ด๋ ๊ฒ ๋๋๊ฑธ๊น? ์ด ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํด๋ง์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ 0
์ด๊ธฐ ๋๋ฌธ์ ๋์ผํ๊ฒ ์๋ํด์ผํ๋ค. ๊ทผ๋ฐ ์ ์ด๋ ๊ฒ ์คํ ์๊ฐ์ด ๋ง์ด ์ฐจ์ด๊ฐ ๋๊ฒ ๋ ๊ฑธ๊น?
๊ทธ ์ด์ ๋ ๋ฐ๋ก ์๊ฐ์ ๋น๊ตํ๊ณ ํธ์ฐจ๋ฅผ ์์๋ด๋ ์์
์ด CPU๋ฅผ ์ง์ค์ ์ผ๋ก ์ฌ์ฉํ๋ ์์
์ด๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ด๋จธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฑ๋กํ๋ ๊ฒ ์์ฒด๋ ์๊ฐ์ ์๋ชจํ๋ค. ์์์ ์ค๋ช
ํ๋ฏ์ด Timer phase์์๋ ํ์ด๋จธ๋ฅผ ์คํํ ์๊ฐ์ด ๋์๋์ง, ์ฝ๋ฐฑ์ ์คํํด์ผ ํ๋์ง๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด ๋ช๊ฐ์ง ์์
์ ๊ฑฐ์ณ์ผ ํ๋๋ฐ ์ด ๊ณผ์ ์ ๋งค ์ดํฐ๋ ์ด์
๋ง๋ค ํ๊ณ ์์ผ๋ ๋๋ ค์ง ์ ๋ฐ์ ์๋ค. ๊ทธ๋ฌ๋ setImmediate
์ ๊ฒฝ์ฐ ์ด๋ฐ ๊ณผ์ ์ด ํ์์๊ธฐ ๋๋ฌธ์ setTimeout
๋ณด๋ค ์คํ ์๋๊ฐ ๋น ๋ฅธ ๊ฒ์ด๋ค.
Snippet 3 โ nextTick()๊ณผ ํ์ด๋จธ ์คํ์ ๋ํด ์ดํดํ๊ธฐ
var i = 0;
function foo(){
i++;
if(i>20){
return;
}
console.log("foo");
setTimeout(()=>{
console.log("setTimeout");
},0);
process.nextTick(foo);
}
setTimeout(foo, 2);
์ ์ฝ๋์ ๋ก๊ทธ๋ ์ด๋ป๊ฒ ์ถ๋ ฅ๋ ๊น? ์ฒซ๋ฒ์งธ ์ถ๋ ฅ์ foo
๋ค์ด ๋ ๊ฒ์ด๊ณ ๊ธฐ ํ setTimeout
๋ค์ด ์ถ๋ ฅ๋๋ค. ์ ์ผ ์ฒ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด 2ms ํ์ ์ฒซ ๋ฒ์งธ foo
๊ฐ ์ถ๋ ฅ๋๊ณ ๋ค์ nextTickQueue
์ ๋ค์ foo()
๋ฅผ ๋ฃ๊ฒ๋๋ค.
๊ทธ๋ฆฌ๊ณ nextTickQueue
์ ๋ค์ด๊ฐ ์ฝ๋ฐฑ๋ค์ ํ ํ์ด์ฆ์์ ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ ๋๋ง๋ค ๋ฌด์กฐ๊ฑด ์ฝ๋ฐฑ๋ค์ ๋๊ธฐ์ ์ผ๋ก ์คํํด์ผํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฌ๊ทํธ์ถ๋ก nextTickQueue
์ ๋ค์ด๊ฐ ๋ชจ๋ ์ฝ๋ฐฑ๋ค์ ์คํํ๊ณ ๋์์ผ Timer Phase์์ setTimeout
์ฝ๋ฐฑ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ์ฝ๊ฐ ์์ ํ๊ณ ๋ค์ ์ดํด๋ณด์.
var i = 0;
function foo(){
i++;
if(i>20){
return;
}
console.log("foo", i);
setTimeout(()=>{
console.log("setTimeout", i);
},0);
process.nextTick(foo);
}
setTimeout(foo, 2);
setTimeout(()=>{
console.log("Other setTimeout");
}, 2);
ํ์๋ ๊ธฐ์กด์ setTimeout
๊ณผ ๊ฐ์ ๋๋ ์ด ์๊ฐ์ ๊ฐ์ง setTimeout
์ ์ถ๊ฐํ๊ณ , ์ด ํ์ด๋จธ์ ์ฝ๋ฐฑ์ ๋จ์ง Other setTimeout
์ ์ถ๋ ฅํ๊ธฐ๋ง ํ๋ค. ๋ญ, ํ์คํ๋ค๊ณ ๋งํ ์๋ ์์ง๋ง ํ ๊ฐ์ foo
๊ฐ ๋จผ์ ์ถ๋ ฅ๋ ํ Other setTimeout
์ด ์ถ๋ ฅ๋ ์ฐฌ์ค๊ฐ ์กด์ฌํ๊ธด ํ๋ค. ํ์ด๋จธ๋ค์ด ๋ค์ด์๋ ํ ๋ด๋ถ์ ๋์ผํ ๋๋ ์ด๋ฅผ ๊ฐ์ง ํ์ด๋จธ๋ค์ ์ด๋ป๊ฒ๋ ๊ทธ๋ฃนํ๋์ด์๊ณ , nextTickQueue
์ ์ฒดํฌ๋ ์งํ ์ค์ธ ์ฝ๋ฐฑ ๊ทธ๋ฃน์ ์คํ์ด ๋๋ ํ์์ผ ์งํ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ญ์ฃผ: ์ฒซ ๋ฒ์งธ setTimeout์ ์ฝ๋ฐฑ๊ณผ ๋ ๋ฒ์จฐ setTimeout์ ์ฝ๋ฐฑ์ด ์คํ๋ ์๊ฐ์ด ๋์ผํ๊ธฐ ๋๋ฌธ์ Timer phase์์ ๋ ํ์ด๋จธ์ ์ฝ๋ฐฑ์ด ๋ชจ๋ ํ์ ๋ค์ด๊ฐ๊ณ , ์ผ๋จ ํ์ ๋ค์ด๊ฐ์ผ๋ฉด ์์คํ ์คํ ํ๋์ ๊ฑธ๋ฆฌ์ง ์๋ ์ด์ ๋ฌด์กฐ๊ฑด ํด๋น ํ์ด์ฆ๊ฐ ๋๋๊ธฐ ์ ์ ์คํ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ,
foo()
๋ด๋ถ์process.nextTick
์ ์ฝ๋ฐฑ์ Timer phase์์ ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ ๋ ์คํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์foo
๊ฐ ๋จผ์ ํ ๊ฐ ์ถ๋ ฅ๋๊ณOther setTimeout
์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ง๋ฌธ๋ค
๊ทธ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ํํ ์ด๋์์ ์คํ๋๋๊ฑด๊ฐ์?
์ด ํฌ์คํธ๋ฅผ ์ฒ์ ์ฝ์ ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ ํํ ์ด๋์ ์คํ๋๋์ง ํท๊ฐ๋ฆด ์ ์๋ค.
์์ ๋งํ๋ฏ์ด ์ด๋ฒคํธ ๋ฃจํ ์์ฒด์์ V8 ๋๋ ๋ค๋ฅธ ์์ง์ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ฒ์ด๊ณ ์ด๋, ๋จ ํ๋์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค. ์คํ ์์ฒด๋ ๋๊ธฐ์ ์ด๊ณ , ํ์ฌ ์คํ์ํจ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ์ด ์๋ฃ๋์ง ์๋๋ค๋ฉด ์ด๋ฒคํธ ๋ฃจํ ๋ํ ์งํ๋์ง ์๋๋ค.
์ ์ฐ๋ฆฌ๋ setTimeout(fn, 0)๊ฐ ์๋๋ฐ๋ setImmediate๋ฅผ ์ฌ์ฉํด์ผ ํ๋์?
์ผ๋จ, setTimeout(fn, 0)
์ ์ค์ง์ ์ผ๋ก 0์ด ์๋๋ค. ์ด๊ฑด ์ฌ์ค 1์ด๋ค. ์ฌ๋ฌ๋ถ์ด ํ์ด๋จธ์ ๋๋ ์ด๋ฅผ 1ms
๋ณด๋ค ์๊ฑฐ๋ 2147483647ms
๋ณด๋ค ํฌ๊ฒ ์ค์ ํ๋ฉด ๋๋ ์ด๋ ์๋์ผ๋ก 1
๋ก ์ธํ
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ setTimeout
์ ๋๋ ์ด๋ฅผ 0
์ผ๋ก ์ค์ ํ๋ ค๊ณ ํ๋ค๋ฉด ์ด ๋๋ ์ด๋ ์๋์ผ๋ก 1
์ด ๋๋ ๊ฒ์ด๋ค.
์ด๋ฏธ ์ค๋ช
ํ๋ ๋๋ก setImmediate
์ ์ฌ์ฉํ๋ฉด ํ์ด๋จธ๋ฅผ ์ฌ์ฉํ ๋์ฒ๋ผ ๋๋ ์ด์ ์๊ฐ์ด ์ง๋ฌ์ง ๋ญ๋ ํ๋ ์ถ๊ฐ์ ์ธ ์ฒดํฌ ๋ก์ง์ด ํ์์์ด์ง๋ค. ๊ทธ๋์ setImmediate
์ ๋น ๋ฅธ ๊ฒ์ด๋ค. ๋ํ setImmediate
์ ์ฒดํฌ ์์
์ Poll phase ์งํ์ ์ํ๋๊ธฐ ๋๋ฌธ์ HTTP ์์ฒญ ์ฝ๋ฐฑ๊ณผ ๊ฐ์ ๊ณณ์์ ์ฌ์ฉ๋ setImmediate
์ ์ฝ๋ฐฑ ํจ์๋ ๋ฐ๋ก ์คํ๋๋ค๊ณ ํ ์ ์๋ค.
์ setImmediate๋ Immediate(์ฆ์)๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฑด๊ฐ์?
setImmediate
์ process.nextTick
๋ชจ๋ ์ด๋ฆ์ด ์๋ชป ๋์๋ค๊ณ ์๊ฐํ๋ค. ์ฌ์ค setImmediate
์ ํ๋ฒ์ Tick ๋๋ ๋ฃจํ๊ฐ ๋ ๋๋ง๋ค ๊ด๋ฆฌ๋๊ณ , nextTick
์ ํ ํ์ด์ฆ์์ ๋ค์ ํ์ด์ฆ๋ก ๋์ด๊ฐ๋ ๋งค Tick๋ง๋ค ์ต๋ํ ๋นจ๋ฆฌ ํธ์ถ๋๋๋ก ์๋ํ๊ณ ์๋ค. ๊ทธ๋์ ๊ธฐ๋ฅ์ ์ผ๋ก๋ setImmediate
์ด nextTick
์ด๋ผ๋ ์ด๋ฆ์ด ๋ ์ ์ด์ธ๋ฆฌ๊ณ nextTick
์ด ์ง์ง๋ก ์ฆ์(Immediately) ํธ์ถ๋๋ ์น๊ตฌ๋ค. ๐
์๋ฐ์คํฌ๋ฆฝํธ๋ Block ๋ ์ ์๋ ๊ฑด๊ฐ์?
์ด๋ฏธ ์์์ ์ค๋ช
ํ๋ฏ์ด nextTickQueue
๋ ์ฝ๋ฐฑ ์คํ์ ์์ด์ ์ด๋ค ์ ํ๋ ๊ฐ์ง๊ณ ์์ง ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ process.nextTick()
์ด ์ฌ๊ท ํธ์ถ๋๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ํ์ด์ฆ๋ค์ ํ๊ฐ ์ด๋ค ์ฝ๋ฐฑ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ ์ ๋ ๊ทธ ์์
์์ ๋น ์ ธ๋์ค์ง ๋ชปํ ๊ฒ์ด๋ค.
๋ง์ฝ Exit callback phase์์ setTimeout์ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋๋์?
๋ญ, ํ์ด๋จธ ์์ฒด๋ ์์๋ ์ ์๊ฒ ์ง๋ง setTimeout
์ ์ฝ๋ฐฑ์ ์ ๋ ํธ์ถ๋์ง ์์ ๊ฒ์ด๋ค. ์ด๋ฏธ Node.js๊ฐ Exit callbacks์ ๋ค์ด์ ์๋ค๋ ๊ฒ์ ์ด๋ฏธ ์ด๋ฒคํธ ๋ฃจํ์์ ๋น ์ ธ๋์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์งง์ ์ ๋ฆฌ๋ค
- ์ด๋ฒคํธ ๋ฃจํ๋ ์์ ์คํ์ ๊ฐ์ง๊ณ ์์ง ์๋ค.
- ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ณ๋์ ์ค๋ ๋์์ ์คํ๋๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ ์ด๋ค ํ์์ ํ๋์ฉ ๊บผ๋ด์์ ๋ค๋ฅธ ๊ณณ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ์คํ ์์ฒด๊ฐ ์ด๋ฒคํธ ๋ฃจํ ์์์ ์ํ๋๋ ๊ฒ์ด๋ค.
setImmediate
๋ ์ฝ๋ฐฑ์ ์์ ํ์ ์ ์ชฝ์ ๋ฐ์ด๋ฃ๋ ๊ฒ์ด ์๋๋ผsetImmediate
๋ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ ์ฉ ํ์ด์ฆ์ ํ๊ฐ ์กด์ฌํ๋ค.setImmediate
์ ์ค์ง์ ์ผ๋ก ๋ค์ ํ์ด์ฆ ํน์ ๋ค์ ์ด๋ฒคํธ ๋ฃจํ์ ์ํ์์ ์คํ๋๊ณ ,nextTick
์ด ์คํ๋ ค ์ค์ง์ ์ผ๋ก ๋ ๋น ๋ฅด๊ฒ ์คํ๋๋ค.nextTickQueue
์ ๋ด๊ธด ์์ ์ด ์ฌ๊ท ํธ์ถ์ ์ํํ๋ ๊ฒฝ์ฐ Node.js์ ์์ ํ๋ก์ธ์ค๋ฅผ ๋ธ๋กํนํ ์ ์๋ค. ์ฃผ์ํ๋๋ก ํ์.
๋ง์น๋ฉฐ
ํ์๋ Node.js ์ฝ์ด ๊ฐ๋ฐ ํ์ด ์๋๋ค. ์ด ํฌ์คํ ์ ๊ดํ ํ์์ ๋ชจ๋ ์ง์์ ์คํ๊ณผ ๋ค๋ฅธ ํฌ์คํ ๋ค์ ํตํด ์ป์ ๊ฒ์ด๋ค. ํ์๊ฐ ์ด ์ง์๋ค์ ์ป๊ธฐ ์ํด ๊ฐ์ฅ ํฐ ๋์์ ์ค Node.js ๊ณต์ ๋ฌธ์์ ๊ฐ์ฌํ๋ค. ๋ ๋ฒ์งธ๋ก ๋์์ด ๋ง์ด ๋ ํฌ์คํธ๋ Saรบl Ibarra Corretgรฉ์ talk on libUV ํฌ์คํ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ ๋ฒ์งธ๋ก VoidCanvas ๋ ์ ๋ถ๋ค ๋๋ถ์ ์ด๋ฐ ๊ฑด๊ฐํ ํ ๋ก ๊ณผ ์คํ, ๊ด์ฐฐ์ ํ ์ ์๋๋ก ๋ ๊ฒ์ ๊ฐ์ฌํ๋ค. ๐
๊ด๋ จ ํฌ์คํ ๋ณด๋ฌ๊ฐ๊ธฐ

V8 ์์ง์ ์ด๋ป๊ฒ ๋ด ์ฝ๋๋ฅผ ์คํํ๋ ๊ฑธ๊น?
ํ๋ก๊ทธ๋๋ฐ/์๋ฐ์คํฌ๋ฆฝํธ![[JS ํ๋กํ ํ์
] ํ๋กํ ํ์
์ ์ฌ์ฉํ์ฌ ์์ํ๊ธฐ [JS ํ๋กํ ํ์
] ํ๋กํ ํ์
์ ์ฌ์ฉํ์ฌ ์์ํ๊ธฐ](/static/ffc88c93a54f1c5d1783f61478e57588/4e277/thumbnail.png)
[JS ํ๋กํ ํ์ ] ํ๋กํ ํ์ ์ ์ฌ์ฉํ์ฌ ์์ํ๊ธฐ
ํ๋ก๊ทธ๋๋ฐ/์๋ฐ์คํฌ๋ฆฝํธ
Webpack Watch์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ณ ์น๊ธฐ
ํ๋ก๊ทธ๋๋ฐ/์น![[JS ํ๋กํ ํ์
] ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํ ํ์
ํ์ด๋ณด๊ธฐ [JS ํ๋กํ ํ์
] ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํ ํ์
ํ์ด๋ณด๊ธฐ](/static/c4c3f4bd82adfc1f6422180eedbd4fb0/4e277/thumbnail.png)
[JS ํ๋กํ ํ์ ] ์๋ฐ์คํฌ๋ฆฝํธ์ ํ๋กํ ํ์ ํ์ด๋ณด๊ธฐ
ํ๋ก๊ทธ๋๋ฐ/์๋ฐ์คํฌ๋ฆฝํธ
JavaScript์ let๊ณผ const, ๊ทธ๋ฆฌ๊ณ TDZ
ํ๋ก๊ทธ๋๋ฐ/์๋ฐ์คํฌ๋ฆฝํธ- ์ ์ด ํฌ์คํ ์ ์์ฑํ๊ฒ ๋์๋?
-
๋ํ์ ์ธ ์๋ชป๋ ๊ฐ๋ ๋ค
- ์ด๋ฒคํธ ๋ฃจํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๋ด๋ถ์ ์๋ค
- ์ด๋ฒคํธ ๋ฃจํ๋ ํ๋์ ์คํ ๋๋ ํ๋์ ํ๋ก๋ง ์๋ํ๋ค
- ์ด๋ฒคํธ ๋ฃจํ๋ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋์์ ์คํ๋๋ค
- setTimeout์ ์ผ๋ถ ๋น๋๊ธฐ OS API์ ๊ด๋ จ์๋ค.
- setImmediate์ ์ฝ๋ฐฑ์ ์์ ํ์ ๊ฐ์ฅ ์ฒซ๋ฒ์งธ์ ์์นํ๋ค
-
๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ง๋ฌธ๋ค
- ๊ทธ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ํํ ์ด๋์์ ์คํ๋๋๊ฑด๊ฐ์?
- ์ ์ฐ๋ฆฌ๋ setTimeout(fn, 0)๊ฐ ์๋๋ฐ๋ setImmediate๋ฅผ ์ฌ์ฉํด์ผ ํ๋์?
- ์ setImmediate๋ Immediate(์ฆ์)๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฑด๊ฐ์?
- ์๋ฐ์คํฌ๋ฆฝํธ๋ Block ๋ ์ ์๋ ๊ฑด๊ฐ์?
- ๋ง์ฝ Exit callback phase์์ setTimeout์ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋๋์?
- ์งง์ ์ ๋ฆฌ๋ค
- ๋ง์น๋ฉฐ