๋ค์ด๊ฐ๊ธฐ์ ์์
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ง์ ๋น๋๊ธฐ๋ค์ ์ด๋ ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ ์ฉํ์ฌ ๊ตฌํํ์๋๋ฐ,
์ ๋น๋๊ธฐ ์์คํ ์ ๊ตฌํํ๋ ค๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ ๊น?
๊ทธ๋ ๋ค๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋์๊ฐ๋ ๊ณผ์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์์๊น?
์ด์ ๊ณต๋ถํ ๋ด์ฉ์ ๋ค์ ์ดํด๋ณด๋ฉด, Node.js ๋ V8 ์์ง๊ณผ libuv๋ก ๊ตฌ์ฑ๋์ด ์๊ณ , libuv๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ , ๋น๋๊ธฐ ๋ ผ ๋ธ๋กํน I/O ๋ชจ๋ธ์ ๊ตฌํํ๋ค๊ณ ํ๋ค. ์ค๋์ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์ ๋ํด ๊ณต๋ถํด๋ณด๋ ค๊ณ ใดใดใ ํ๋ค.
์ด๋ฒคํธ?
์ด๋ฒคํธ๋ ์์คํ ํ๋์จ์ด๋ ์ํํธ์จ์ด ์ํ์ ๋ณํ๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. ์ด๋ฒคํธ๋ ์ฌ์ฉ์์ ํด๋ฆญ, ๋ง์ฐ์ค์ ์์ง์, ํค๋ณด๋ ์ ๋ ฅ์ด๋ ์น ํ์ด์ง์ ํน์ ์์ญ์ผ๋ก์ ์ด๋ ๋ฑ ์ธ๋ถ์ ํ๊ฒฝ์ ์ํด ์์ฑ๋๊ฑฐ๋ ํ๋ก๊ทธ๋จ ๋ก๋ฉ๊ณผ ๊ฐ์ ์์คํ ์ ์ํด ๋ฐ์ํ ์ ์๋ค.
์ด๋ฒคํธ ๊ธฐ๋ฐ?
๊ทธ๋ ๋ค๋ฉด Node.js ์์ ๋งํ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ด๋ ๋ฌด์์ผ๊น?
์ด๋ฒคํธ ๊ธฐ๋ฐ์ด๋ผ๋ ๊ฒ์ ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ๋ฏธ๋ฆฌ ์์ฝ ํน์ ์ง์ ํด๋์ ์์ ์ ์ํํ๋ ๋ฐฉ์์ ๋งํ๋ค.
์๋ฅผ ๋ค์ด ๊ฒ์๊ธ ์ทจ์ ๋ฒํผ์ ํด๋ฆญ(ํด๋ฆญ ์ด๋ฒคํธ ๋ฐ์)ํ๋ฉด ๊ฒ์๊ธ์ด ์ญ์ ๋๋ค๋ ๋ชจ๋ฌ์ด๋ alert ์ฐฝ์ ๋์ฐ๋ ๊ฒ ๋ง์ด๋ค.
์ด๋ฌํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์์๋ ์ง์ ํ ์์ ์ ์ํํ๊ธฐ ์ํด์ ์์ ์ด ์ผ์ด๋์ผ ํ ์์ ์ ์ด๋ฒคํธ๋ฅผ ๋ฏธ๋ฆฌ ๋ฑ๋กํด๋์ด์ผ ํ๋ค.
์ด๋ฌํ ํ์๋ฅผ "์ด๋ฒคํธ ๋ฆฌ์คํฐ(Event Listner) ์๊ฒ ์ฝ๋ฐฑ(callback) ํจ์๋ฅผ ๋ฑ๋กํ๋ค."๋ผ๊ณ ํ๋ค.
Node.js ๋ํ ์ด๋ฌํ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์ ์ํด ๋์ํ๊ธฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฑ๋กํด๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํ๋ค.
๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ์๊ฑฐ๋, ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ๋ฉด Node.js ๋ ๋ค์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๊น์ง ๋๊ธฐํ๋ค.
์ด๋ฒคํธ ๋ฃจํ(Event Loop) / ํ์คํฌ ํ(Task Queue) / ๋ฐฑ๊ทธ๋ผ์ด๋(Background)?
์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ฝ๋ฐฑ, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์ ๋ํด ๋ฐ๋ฐํ์ด ๊ทธ๋ ค์ก๋ค๋ฉด ๊ทธ๋ค์์ผ๋ก ์ด๋ฒคํธ ๋ฃจํ๋ผ๋ ๊ฐ๋ ์ด ๋์จ๋ค.
์ด๋ฒคํธ ๋ฃจํ๋ผ๋ ๊ฒ์ ๋ญ๊น?
Javascript๋ ๋จ์ผ ์ค๋ ๋(Single Thread) ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก์จ Call Stack ์ด ํ๋๋ผ๋ ๋ง์ด๋ค. ์ฆ, ์์ ์ ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค. Javascript ์ฝ๋ ๋ด์์ ํจ์ ํธ์ถ ๋ถ๋ถ์ด ์๋ค๋ฉด ํจ์๋ค์ Call Stack ์์ญ์ ๋ฃ๊ณ , ๊ทธ๋ค์ ์ฝ๋๋ค์ด ์์ธ๋ค. (๋งจ ์๋ถํฐ ํ ์ค์ฉ ์คํํ๋ค.)
function first(){
second();
console.log("์ฒซ ๋ฒ์งธ ํธ์ถ");
}
function second() {
third();
console.log("๋ ๋ฒ์งธ ํธ์ถ");
}
function third(){
console.log("์ธ ๋ฒ์งธ ํธ์ถ")
}
first();
์์ ์ฝ๋๋ฅผ ํตํด ํธ์ถ์ ๊ตฌ์กฐ๋ฅผ ํ์ธํด๋ณด์.
๊ฐ์ฅ ๋จผ์ first() ํจ์๊ฐ ํธ์ถ๋๊ณ , ๊ทธ ์์ ์๋ second() ํจ์๊ฐ ํธ์ถ๋๋ฉฐ second() ํจ์ ์์ ์๋ third() ํจ์๊ฐ ํธ์ถ๋๋ฉด์
์ธ ๋ฒ์งธ ํธ์ถ
๋ ๋ฒ์งธ ํธ์ถ
์ฒซ ๋ฒ์งธ ํธ์ถ
์์ผ๋ก console์ ์ถ๋ ฅ๋๋ค.
๋ํ ์์ ํจ์๋ค์ด ํธ์ถ ์คํ์ ์์ด๊ธฐ ์ ์ ๊ฐ์ฅ ๋จผ์ ์คํ ์ปจํ ์คํธ(์ ์ญ ์ปจํ ์คํธ) ๊ฐ ์์ด๊ณ ํด๋น ์ปจํ ์คํธ ์์ ๋ค์์ ์ฌ ํจ์๋ค์ด ์์ด๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ์คํ ์ปจํ ์คํธ(์ ์ญ ์ปจํ ์คํธ) ๋ ์ฝ๋๋ก ์์ฑ๋ ํจ์๊ฐ ํธ์ถ๋์์ ๋ ์์ฑ๋๋ ํ๊ฒฝ์ ์๋ฏธํ๋ค.
์ด ๋ง์ Javascript ์ฝ๋๋ ์คํ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ ์ปจํ ์คํธ ์์์ ๋์๊ฐ๋ค๊ณ ์๊ฐํ๋ ๊ฒ ์ข๋ค.(๊ณ ํ๋ค..)
๋ชจ๋ ํจ์๊ฐ ํธ์ถ๋์๋ค๋ฉด third(), second(), first(), ์คํ ์ปจํ ์คํธ ์์ผ๋ก ํธ์ถ ์คํ์์ ์ง์์ง๋ฉฐ, ๋ชจ๋ ์ง์์ง๊ฒ ๋๋ฉด ํธ์ถ ์คํ์ ๋น์์ง๊ฒ ๋๋ค.
์์ ์ฝ๋์์ setTimeout() ํจ์๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค๋ฉด setTimeout() ํจ์ ๋ด์ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถ ์คํ์ผ๋ก ์ค๋ช ํ ์ ์์๊น?
์ถ๋ ฅ๋๋ ์์์ ๋ํด์๋ ์ฝ๊ฒ ์ค๋ช ํ ์ ์๊ฒ ์ง๋ง ํธ์ถ ์คํ์ ์ธ์ ๋ค์ด๊ฐ๋์ง์ ๋ํด ์ค๋ช ํ๋ผ๊ณ ํ๋ฉด ๋ง์ด ํ๋ค ๊ฒ ๊ฐ๋ค!
์ด๋ ๊ฒ ํธ์ถ ์คํ์ ๋ค์ด๊ฐ๋ ์์๋ ๋์ค๋ ์์ ๋ฑ์ ๋ํด ๋ช ํํ ์ค๋ช ํ๋ ค๋ฉด
์ด๋ฒคํธ ๋ฃจํ, ํ์คํฌ ํ, ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ฐ๋ ์ ๋ํด ํ์ ํ๊ณ ์์ด์ผ ํ๋ค.(๋ผ๊ณ ํ๋ค..)
๊ทธ๋ ๋ค๋ฉด ์์ 3๊ฐ์ง ๊ฐ๋ ์ ๋๋์ฒด ๋ฌด์์ผ๊น?
์ด๋ฒคํธ ๋ฃจํ (Event Loop)?
์ด๋ฒคํธ ๋ฐ์ ์ ํธ์ถํ ์ฝ๋ฐฑ ํจ์๋ฅผ ๊ด๋ฆฌํ๊ณ , ํธ์ถ๋ ์ฝ๋ฐฑ ํจ์์ ์คํ ์์๋ฅผ ๊ฒฐ์ ํ๋ ์ญํ ์ ๋ด๋นํ๋ค. ๋ ธ๋๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํ ์์ ์ ๋ฐ๋ณตํ๊ธฐ์ ๋ฃจํ๋ผ๊ณ ๋ถ๋ฅธ๋ค.(์นด๋๋ผ..)
๋ฐฑ๊ทธ๋ผ์ด๋ (Background)?
setTimeout() ๊ฐ์ ํ์ด๋จธ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ค์ด ๋๊ธฐํ๋ ๊ณณ์ด๋ค. ์ฌ๋ฌ ์์
์ด ๋์์ ์คํ๋ ์ ์๋ค.
(์ค๋ ๋์ ์์ญ์ด๋ผ๊ณ ๋ณผ ์ ์๋ ๊ฑธ๊น? Javascript ๋ ์ฑ๊ธ ์ค๋ ๋๋ผ๊ณ ๊ณต๋ถํ๋ ๊ธฐ์ต์ด ์๋๋ฐ, ์ฑ๊ธ ์ค๋ ๋์ธ ์ํ์์ ์ด๋ป๊ฒ ๋์์ ์ฌ๋ฌ ์์
์ด ์คํ๋ ์ ์๋ ๊ฑธ๊น? -> ๊ฒ์ํด์ ์์๋ณธ ๊ฒฐ๊ณผ, ์ด๋ ๋ฉ์ธ ์ค๋ ๋์ธ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ฑ๊ธ ์ค๋ ๋์ด๋ฉฐ, ์ด๋ฒคํธ ๋ฃจํ๋ ์ด๋ฒคํธ์ ์์์ ๋ง๊ฒ ํจ์๋ฅผ ์คํํ๋ค! ๋ง์๊น..? )
ํ์คํฌ ํ (Task Queue)?
์ด๋ฒคํธ ๋ฐ์ ํ, ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ํ์คํฌ ํ๋ก ํ์ด๋จธ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ณด๋ธ๋ค. ์ ํด์ง ์์๋๋ก ์ฝ๋ฐฑ๋ค์ด ์ค ์ ์๊ธฐ ๋๋ฌธ์ Callback Queue๋ผ๊ณ ๋ถ๋ฅด๋ฆฌ๋ ํ๋ค. ์ฝ๋ฐฑ ํจ์๋ค์ ๋ณดํต ์๋ฃ๋ ์์๋๋ก ์ค์ ์ ์์ง๋ง ํน์ ํ ๊ฒฝ์ฐ์๋ ์์๊ฐ ๋ฐ๋๊ธฐ๋ ํ๋ค.(๋๋ผ..)
๋ด๊ฐ ์ดํดํ ๋๋ก๋ผ๋ฉด ํธ์ถ๋ ํจ์๋ ํธ์ถ ์คํ์ ๋ค์ด๊ฐ๊ณ ํด๋น ํจ์ ์์ ์๋ ์ฝ๋ฐฑ ํจ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ญ์ผ๋ก ์ด๋ํ๋ฉฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํด๋น ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ช ๋ น์ ๋ง๊ฒ ์์ ์ ์งํํ ํ ํด๋น ์ฝ๋ฐฑ ํจ์๋ฅผ ํ์คํฌ ํ(์ฝ๋ฐฑ ํ)๋ก ์ด๋์ํจ๋ค.
ํ๋์ ์ด๋ฒคํธ ๋ฃจํ ์์์ ํจ์๊ฐ ํธ์ถ ์คํ์ ์์ด๊ณ , ํจ์๊ฐ ์์ธ ์์๋๋ก ๊ฐ๊ฐ์ ํจ์์ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ด๋ํ ํ ํด๋น ํจ์์ ์์ ์ ์ํํ๊ณ ์๋ฃํ๋ฉด ํ์คํฌ ํ์ ๊ฐ๊ฐ์ ์ฝ๋ฐฑ ํจ์๊ฐ ์์ธ๋ค! (๋ผ๊ณ ์ดํดํ๋๋ฐ, ๋ง๋ ๊ฒ์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ค.)
์ด๋ฌํ ์ํ์์ ํธ์ถ ์คํ์ ์กด์ฌํ๋ ํจ์๊ฐ ๋ชจ๋ ์คํ๋๊ณ ๋ ๋ค ์ง์์ง๊ฒ ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ํ์คํฌ ํ์์ ํจ์๋ฅผ ํ๋์ฉ ๊ฐ์ง๊ณ ์์ ํธ์ถ ์คํ์ ๋ฃ๊ณ ์คํํ๋ค.
๊ทธ๋ฐ ํ, ํธ์ถ ์คํ์์ ์คํ๋ ํจ์๋ ์ง์์ง๊ฒ ๋๋ฉฐ ํธ์ถ ์คํ์ ๋น์์ง๊ฒ ๋๋ค. ์ด๋, ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์ ์ฝ๋ฐฑ ํจ์๊ฐ ํ์คํฌ ํ์ ์์ฌ ์คํ๋ ๋๊น์ง ๋๊ธฐํ๋ค.
์ ๋ก์ด ๋ ๋ธ๋ก๊ทธ ๊ธ์ ๋ณด๋ค ๊ฑฐ๊ธฐ์ ๋งํฌ๋์ด ์๋ ์ ํ๋ธ ์์์ ์์ฒญํ๊ฒ ๋์๋๋ฐ ๋ช ํํ ๋ด ๊ฒ์ด ๋ ๊ฒ์ ์๋์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋น๋๊ธฐ๋ก ์ด๋ป๊ฒ ๋์๊ฐ๋์ง ๋จธ๋ฆฟ์์์ ๋ฐ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ์ ์๊ฒ ๋์๋ค!
์ด ์์์ ๋ณด๊ณ ์ดํดํ ๋ถ๋ถ์ setTimeout() ํจ์๋ Ajax ๋ฑ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ ์ ๊ณต์ด ์๋ Web API ๋ก์จ C++ ์ธ์ด๋ก ๊ตฌ๋๋๋ค.(๋ง๋?) ๊ทธ๋ ๊ธฐ์ ์ฑ๊ธ ์ค๋ ๋์ธ Javascript ๊ฐ ๋ธ๋ผ์ฐ์ ์ ํ์ ๋น๋ ค ๋ฉํฐ ์ค๋ ๋์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ด๋ค!
์ฆ, Web API๋ค์ด Javascript ์์ ํธ์ถ์ด ๋๋ฉด ํด๋น ํจ์๋ค์ด ์ฝ ์คํ์ ์์ด๊ณ ํด๋น ์ฝ๋ฐฑ ํจ์๋ค์ด ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ด๋ํ ๋ค ๊ฐ ํจ์์ ๋ง๋ ์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ง๋ฌด๋ฆฌํ ํ ํ์คํฌ ํ๋ก ์ด๋ํ์ฌ ์์๋๋ก ์์ธ๋ค. ๊ทธ ์ดํ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฝ ์คํ์ ์์ธ ์์๋๋ก ์์ ์ด ์๋ฃ๋์ด ์ฝ ์คํ์ด ๋น์๋ค๋ฉด ํ์คํฌ ํ์ ์์ธ ์ฝ๋ฐฑ ํจ์๋ค์ด ์์๋๋ก ์ฝ ์คํ์ผ๋ก ์ด๋ํ์ฌ ๋ง๋ฌด๋ฆฌ ์์ ์ ์ํํ๋ค. ์ด ๊ฒ์ด ์ด๋ฒคํธ ๋ฃจํ์ธ ๊ฒ์ด๋ค! (๋ง๋..?)
๋ ๋ฒ์งธ ๊ณต๋ถ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ด ์์๊ณผ ์ ๋ก์ด๋์ ๋ธ๋ก๊ทธ ๊ฒ์๊ธ์ ํตํด ๋ช ํํ์ง ์์ง๋ง ๊ทธ๋๋ ๋จธ๋ฆฌ์นด๋ฝ ํ๋ ์ ๋๋ ์ดํด๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
์ด๋ฒ ๊ณต๋ถ๋ฅผ ํตํด ์๋ฃ๊ตฌ์กฐ์ ๋ํด ์ดํด๊ฐ ๋ง์ด ํ์ํ๋ค๋ ๊ฒ์ ๋๊ผ๋ค.
์ค๋ ์ ๋ ์๋ ์๋ฃ๊ตฌ์กฐ์ ๋ํด์๋ ๊ณต๋ถ๋ฅผ ์กฐ๊ธ ํ๊ณ , ๋ฎ์๋ ์ด ์์์ 3๋ถ์ 2 ์ ๋๋ฅผ ์์ฒญํ๋๋ฐ ์ค๋ ์ ๋ ์ ๋๋จธ์ง ๋ท๋ถ๋ถ๋ ๋ง์ ์์ฒญํด์ ๊ฐ๋ ์ดํด์ ๋ฐ์ฐจ๋ฅผ ๊ฐํด์ผ๊ฒ ๋ค!
'Programming > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Javascript ์ดํดํ๊ธฐ - Prototype / Class (0) | 2020.10.05 |
---|---|
Node.js ์ดํดํ๊ธฐ - ์ฑ๊ธ ์ค๋ ๋ (0) | 2020.09.27 |
Node.js ์ดํดํ๊ธฐ - ๋น๋๊ธฐ ๋ ผ ๋ธ๋กํน I/O ๋ชจ๋ธ์ ๋ํด (0) | 2020.09.26 |