์๋ฐ์คํฌ๋ฆฝํธ ๋ฟ๋ง ์๋๋ผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ์ฒ์์๋ ๊ทธ์ ์ฝ๋ ์ง๊ธฐ์๋ง ๊ธ๊ธํ์ต๋๋ค. ๊ทธ ์ธ์ด์ ์๋์๋ฆฌ ๊ฐ์ ๊ฑด ๋ด๋ ๋๋ฌด์ง ์ดํด๊ฐ ์๊ฐ๊ธฐ์ ๊ด์ฌ์ด ์์์ต๋๋ค.
์๊ฐ์ด ์ ์ฐจ ํ๋ฌ ์ฐ์ฐํ ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋์๋ฆฌ ๊ด๋ จ ๊ธ์ ๋ค์ ๋ณด๊ฒ๋์๋๋ฐ ๊ธ์ด ์ด๋ ต์ง ์๊ณ ์ดํด๊ฐ ๋๊ธฐ ์์ํ์ต๋๋ค. "๊ทธ๋ ์์ฑํ๋ ์ฝ๋๊ฐ ์ด๋์ ์ด๋ฐ์์ผ๋ก ์๋ํ๊ตฌ๋" ๋ฅผ ๊นจ๋ฌ์ผ๋ฉด์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํด ๋ ์์ธํ ์๊ฒ ๋๊ณ ๋๋ ํ์ธต ๋ ์ฝ๋ฉ์ด ์ฌ๋ฏธ์์ด์ก์ต๋๋ค.
๊ทธ๋์ ์ด๋ฒ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์๋์๋ฆฌ์ ์์ด ํต์ฌ ์๋ฆฌ์ธ JavasScript Engine(V8), Web API, Callback Queue, ์ด๋ฒคํธ ๋ฃจํ ๊ทธ ์ค ํนํ ์ด๋ฒคํธ ๋ฃจํ ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
ํ๋ฆฐ ๋ถ๋ถ์ด๋ ์ง๋ฌธ ์ฌํญ์ด ์์ผ์๋ฉด ์ธ์ ๋ ์ง ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์ :)
์๋ฐ์คํฌ๋ฆฝํธ๋?
์๋ฐ์คํฌ๋ฆฝํธ ๋ Git์์ ์ฌ์ ํ ์์ ๋ญํฌ์ ์์น ๋์ด์๊ณ ์ธ๊ธฐ๊ฐ ์ ์ ๋ง์์ง๊ณ ์๋ ์ธ์ด ์ค์ ํ๋์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ๋ ผ๋ธ๋กํน ๊ธฐ๋ฐ ์ธ๋ฐ, ์ฑ๊ธ ์ค๋ ๋๋ผ๋ ์ ์ด ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋์ ๋๋ค. ์ฑ๊ธ ์ค๋ ๋๋ ์ด๋ฆ์ฒ๋ผ ๋จ ํ๋์ ์ค๋ ๋๋ง ์ฌ์ฉํ ์ ์์ด์ ๋์์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
('์ฑ๊ธ ์ค๋ ๋' ๊ด๋ จ ๊ธ)
* ๋ ผ๋ธ๋กํน(๋น๋๊ธฐ)๊ณผ ๋ธ๋กํน(๋๊ธฐ)์ด๋?
์๋์ด ์๋น์ ๊ฐ์ ์๋ฆฌ๋ฅผ ์ฃผ๋ฌธํ๋ค๊ณ ํ๋ฉด, ์๋์ด ์๋ฆฌ๊ฐ ๋์ฌ ๋๊น์ง ์๋ฌด๊ฒ๋ ์ํ๊ณ ๋จ์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํ๋ค๋ฉด ๋ธ๋ก ์ํ(๋๊ธฐ) ์ด๊ณ , ์๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ํธ๋ํฐ์ ํ๊ฑฐ๋, ํ์ฅ์ค์ ๊ฐ๋ค์ค๊ฑฐ๋ ๋ฑ ๋ค๋ฅธ ํ์๋ฅผ ํ ์ ์์ผ๋ฉด ๋
ผ๋ธ๋ก ์ํ(๋น๋๊ธฐ) ์
๋๋ค.
('๋ ผ๋ธ๋กํน๊ณผ ๋ธ๋กํน' ๊ด๋ จ ๊ธ)
์ ๊ทธ๋ฆผ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์ฃผ ์๋ณด์ฌ์ฃผ๋ ๊ทธ๋ฆผ์ ๋๋ค. ์์๋ก๋ V8 ์์ง(runtime Engine), Web API, ์ด๋ฒคํธ ๋ฃจํ, Callback Queue๊ฐ ์๋ ๋ฐ ๋จผ์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ ์ธํ๊ณ ๊ฐ๋ตํ ํด๋น ์์๊ฐ ๋ฌด์์ธ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
Javascript Engine(V8)
V8์ ํฌ๋กฌ๊ณผ Node.js์์ ์ฌ์ฉ๋๋ ๊ตฌ๊ธ์ด ๋ง๋ ์์ง์ ๋๋ค. ํฌ๊ฒ Memory Heap ๊ณผ Call Stack ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ฝ๊ณ ํด์ํด์ ์คํํ๋ ๊ฒ์ ๋ด๋นํ๊ณ ์๋ค ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ์ Node.js์ ํ์ฌ๋์ด ์์ต๋๋ค.
- Memory Heap : ์ฐ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์งค๋ ์ ์ธํ๋ ๋ณ์๋ ํจ์ ๋ฑ์ด ๋ด๊ฒจ์ ธ ์์ต๋๋ค.
- Call Stack : ์ฝ๋๊ฐ ์คํ๋ ๋ ์์ด๋ ๊ณณ์ ๋๋ค.
(์ฌ์ค Javascript Engine๋ง ๋ดค์ ๋ Call Stack์ด ํ๋๋ผ ๋น๋๊ธฐ๋ฅผ ์ฒ๋ฆฌํด์ค ์ ์๋ ๋ถ๋ถ์ด ์๋ค๊ณ ์๊ฐํด ์์ํด ํ์ค ์๋ ์๋๋ฐ ์ด ํ์๋ฅผ ํด์ฃผ๋ ๊ณณ์ด ๋ฐ๋ก ๋ฐ์์ ์ธ๊ธํ Web API์ ๋๋ค.)
* Stack์ด๋?
์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก ๊ฐ์ฅ ์ฒ์์ผ๋ก ๋ค์ด์จ ๊ฒ์ด ๊ฐ์ฅ ๋ง์ง๋ง์ ๋๊ฐ๋ ์ ์ ํ์ถ(LIFO, Last In First Out)์ ๋๋ค. ์ฌ๊ทํจ์๋ฅผ ์๊ฐํ๋ฉด ์ฝ์ต๋๋ค.
Web API
DOM, Ajax, setTimeout(), Event Handler ๋ฑ๊ณผ ๊ฐ์ด ์น ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ๋งํฉ๋๋ค. Call Stack์์ ์คํ๋ ๋น๋๊ธฐ ํจ์๋ Web API๋ฅผ ํธ์ถํ๊ณ , Web API๋ ์ฝ๋ฐฑํจ์๋ฅผ Callback Queue์ ์ง์ด ๋ฃ์ต๋๋ค.
Javascript Engine์ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ ์ค๋ ๋๋ฅผ ์ง์ํด์ค๋๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ๋ฅผ ํ ์ ์๊ฒ ํด์ค๋๋ค.
Callback Queue
๋น๋๊ธฐ๋ก ์คํ๋์ผํ๋ ์ฝ๋ฐฑํจ์๊ฐ ๋ณด๊ด๋๋ ์์ญ์ ๋๋ค. setTimeout์์ ํ์ด๋จธ ์๋ฃ ํ ์คํ๋๋ ํจ์๊ฐ Stack์ ์์ฌ ์คํ๋๊ธฐ ์ ๋ณด๊ด๋์ด ์๋ ๊ณณ์ด ๋ฐ๋ก Callback Queue์ ๋๋ค. ์ดํด๊ฐ ์๊ฐ์๋๋ผ๋ ๋ฐ์์ ์์ธํ ๋ค๋ฃจ๋ ์ฌ๊ธฐ๋ ์ฝ๊ณ ๋์ด๊ฐ์ ๋ ๋ฉ๋๋ค.
* Queue๋?
Stack๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก ๊ฐ์ฅ ์ฒ์์ผ๋ก ๋ค์ด์ค๋ ๊ฒ์ด ๊ฐ์ฅ ์ฒ์์ผ๋ก ๋๊ฐ๋ ์ ์ ์ ์ถ(FIFO, First In First Out)์ ๋๋ค.
(์ ๋ Stack์ด๋ ์์ฒญ ํท๊ฐ๋ ธ์๋๋ฐ ๋น๊ตฌ์ ํ(Queue)๋๋ฅผ ์๊ฐํ๋ฉด ์ํท๊ฐ๋ฆฌ๋๋ผ๊ณ ์. ํ๋ ๋ชจ์ ์๊ฐํ๋ฉด์ 'ํ๋ ๋ท๋ถ๋ถ์ผ๋ก ๋ค์ด์์ ํ๋ ์๋ถ๋ถ์ผ๋ก ๋๊ฐ๋ค' ์ด๋ฐ์์ผ๋ก ๊ตฌ๋ถํ์์ต๋๋ค ใ )
Call Stack, Event loop, Callback Queue
๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ด์ฉํด Call Stack์ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
function multiply(a, b){
return a*b;
}
function square(n){
return multiply(n, n);
}
function printSquare(n){
var squared = square(n);
console.log(squared);
}
printSquare(4);
(์ฌ๊ธฐ๋ฅผ ๊ฐ์ ์ ์คํ์ํค๋ฉด ํด๋น ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ธฐ ํจ์ฌ ์ฝ์ต๋๋ค.)
๊ฐ๊ฐ์ ํจ์๋ค์ Stack์ ์์ ๊ฐ์ด ์ฐจ๋ก๋๋ก ์์ด๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Stack์ LIFO์ ํน์ง์ ๊ฐ์ง๋ฏ๋ก ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด ๊ฐ์ฅ ์์ ์๋ ํจ์๋ถํฐ Stack์์ ์ ๊ฑฐ๋ฉ๋๋ค.
multiply๊ฐ ์ ๊ฑฐ๋๊ณ , square๊ฐ ์ ๊ฑฐ๋๊ณ printSquare ํจ์ ์์ ์๋ console.log๊ฐ ๋ค์ Stack์ ์์ ๋๋ค. ์ด๋ฐ์์ผ๋ก Stack์ ์์ด๊ณ ์ ๊ฑฐ๋๋ฉด์ ๋ง์ง๋ง์๋ ๊ฒฐ๊ตญ Stack ์๋ฌด๊ฒ๋ ๋จ์์์ง ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋์ํ๋ Call Stack์ ์ญํ ์ ๋๋ค.
๋ง์ฝ ํจ์๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
function foo(){
throw new Error('Oops!');
}
function bar(){
foo();
}
function baz(){
bar();
}
baz();
๊ฐ๋ฐ์๋๊ตฌ์์๋ ์ด๋ฐ์์ผ๋ก Stack์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๋ฉด์ Oops!๋ฅผ ํ์ํ๊ฒ ๋ฉ๋๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ Stack์ ์ํ๋ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ๋๋ค. ์๋ฌ๋ foo์์ ์๊ฒผ๋๋ฐ ๊ทธ๊ฒ์ bar๊ฐ ํธ์ถํ๊ณ bar๋ ๋ baz์๊ฒ์ ํธ์ถ๋์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ์ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฑ๊ธ ์ค๋ ๋๋ผ๊ณ ํ๋ ๊ฒ์ ๋ฃจ๋น ๊ฐ์ ์ธ์ด์๋ ๋ฌ๋ฆฌ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ ์๋ฏธ์ ๋๋ค. ๋ฐ๋ผ์ ๋คํธ์ํฌ ์์ฒญ ๊ฐ์ ๋ค์ ๋๋ฆฐ ์์ ์ ์์ ์ด ์๋ฃ๋๊ธฐ๊น์ง ๋ง๋ฅ ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์ปดํจํฐ์ ์์ ์ฒ๋ฆฌ ์๋๋ฅผ ํ์ ํ ๋ค์ด์ํต๋๋ค. (์ฌ๋ํํ ๋ ์ฌ์ ํ ๋น ๋ฅด์ง๋ง ์ปดํจํฐ ๊ธฐ์ค์์๋ ๋๋ฆฝ๋๋ค)
์ด๋ ํ์ํ ๊ฒ์ด ๋ฐ๋ก ๋น๋๊ธฐ ์ฝ๋ฐฑ์ ๋๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์๊ฒ ์ต๋๋ค.
console.log("hi");
setTimeout(function cb(){
console.log("there");
}, 5000);
console.log("JSConf");
(์ฌ๊ธฐ๋ฅผ ๊ฐ์ ์ ์คํ์ํค๋ฉด ํด๋น ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ธฐ ํจ์ฌ ์ฝ์ต๋๋ค.)
setTimeout ํจ์ ๊ฐ์ ๊ฒฝ์ฐ ๋ํ์ ์ธ ๋น๋๊ธฐ ํจ์์ธ๋ฐ ์์ ๊ทธ๋ฆผ์์ ๋ณด๋ฉด ์ญ์ ํ๋ฒ ์คํ ๋ํ Stack์์ ์ฌ๋ผ์ง๋๋ค.
๊ทธ ํ Stack์ด ์์ ๋น ์ํ์ธ ํ์ Stack์ ๋ค์ setTimeout์ ์ฝ๋ฐฑ์ด ์์ด๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.(5000์ด์์ผ๋ 5์ด ํ Stack์ ์์ ๋๋ค.)
์ ์ด๋ ๊ฒ ๋๋๊ฑธ๊น์? ์ ๋ต์ ๋ฐ๋ก ์ด๋ฒคํธ ๋ฃจํ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์คํ์ํค๋ ๋์ setTimeout ํจ์๋ฅผ ์คํ์ํฌ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋์์ ์ฌ๋ฌ ์์ ์ ํ ์ ์๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋จ์ ๋ฐํ์ ์ด์์ ๊ฒ์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์์์ ์ธ๊ธํ ๋ฐ์ ๊ฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ ํฌ๊ฒ Javascript Engine๊ณผ Web API๋ก ๊ตฌ์ฑ๋๋ค ํ๋๋ฐ ์ฌ๊ธฐ์ ๋ฐ๋ก Web API์ ์ญํ ์ด ๋น์ ๋ฐํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์ ์ ๊ณต๋๋ Web API๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํธ์ถํ ์ ์๋ ์ค๋ ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ง์ํด์ค๋๋ค. ์ฆ, ์ฑ๊ธ ์ค๋ ๋๋ก ์๋ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ฉํฐ ์ค๋ ๋๋ก ์๋ํ ์ ์๊ฒ๋ ๋์์ค๋๋ค.
console.log("hi");
setTimeout(function cb(){
console.log("there");
}, 5000);
console.log("JSConf");
๊ทธ๋ผ ๋ค์ ์ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ์๋ Stack๋ฟ๋ง ์๋๋ผ Web API์ Callback Queue๋ ๊ณ ๋ คํด๋ณด๊ฒ ์ต๋๋ค. ์์ ์ setTimeout์ด ๋ง Stack์์ ์ญ์ ๋๊ณ Web API์ ์์ผ ๋ ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ์ ์กด์ฌํ๋ ๋ณ๋์ API(Web API)์ setTimeout ํจ์๋ฅผ ๋ฃ๊ณ ํ์ด๋จธ๋ฅผ ์คํํค์๊ณ ์นด์ดํธ ๋ค์ด์ ์์ํฉ๋๋ค. setTimeout ํจ์์ ํธ์ถ ์์ฒด๋ ์๋ฃ๋์๊ธฐ ๋๋ฌธ์ Stack์์ ์ญ์ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ 'JSconf'๊ฐ Stack์ ์์ด๊ณ ํธ์ถ๋ ํ ์ญ์ ๋ฉ๋๋ค. ์ด์ Web API์์ ์คํํ๊ณ ์๋ ํ์ด๋จธ๋ง์ด ๋จ์์ต๋๋ค. 5์ด ๋ค์ ํ์ด๋จธ๊ฐ ์ข ๋ฃ๋๋๋ฐ Web API๋ ๊ฐ์๊ธฐ ํด๋น setTimeout์ Stack์ ๋ฃ์ ์ ์์ต๋๋ค.
๊ทธ๋ผ Stack์ ์ด๋ป๊ฒ ๋ฃ์ ์ ์์๊น์?
์ด์ ๋ Callback Queue๊ฐ ํ์ฝํ ์ฐจ๋ก์ ๋๋ค. ๋ชจ๋ Web API๋ ์๋์ด ์๋ฃ๋๋ฉด setTimeout ๋ด ์ฝ๋ฐฑ์ Callback Queue์ ์ง์ด ๋ฃ์ต๋๋ค.
์ด๋ฒคํธ ๋ฃจํ๋ ์ด ์ ์ฒด ์์คํ ์์ ์์ฃผ ๋จ์ํ ์ผ์ ํ๋ ์์ ์์์ ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ์ ์ญํ ์ Call Stack๊ณผ Callback Queue๋ฅผ ์ฃผ์ํ๋ ๊ฒ์ ๋๋ค. Stack์ด ๋น์ด์์ผ๋ฉด, Callback Queue์ ์ฒซ๋ฒ์งธ ์ฝ๋ฐฑ์ Stack์ ์์ ํจ๊ณผ์ ์ผ๋ก ์คํํ ์ ์๊ฒ ํด์ค๋๋ค.
Stack์ console.log๊ฐ ์์ด๊ธฐ ์ ์ Stack์ ์์ง ๋น์ด์๋ ์ํ์ธ๋ฐ ์ด๋ฌํ ๋น ์ํ๋ฅผ ๋ณด๊ณ ์ด๋ฒคํธ ๋ฃจํ๋ '์ด, ๋ญ์ผ Stack์ด ๋น์์์? ๋๋์ด ๋ด๊ฐ ํ ์ผ์ด ์๋ค. ์ ์ด ์ด๊ฑฐ ๋ฐ์!' ํ๋ฉฐ ์ฝ๋ฐฑ์ Stack์ ๋ฃ์ด์ค๋๋ค. ์ดํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๋ค์ console.log๋ฅผ Stack์ ์์์ค๋๋ค. ๋ฐ๋ผ์ ์ ๊ทธ๋ฆผ์ฒ๋ผ console.log๊ฐ Stack์ ์์ธ ๊ฑธ ๋ณด์ค ์ ์์ต๋๋ค.
setTimeOut์ ์ธ์๋ฅผ 0์ผ๋ก ํ๋, 1000์ผ๋ก ํ๋, 10000์ผ๋ก ํ๋ ์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ ํญ์ ๊ฐ์ต๋๋ค. ์ง๊ธ๊น์ง์ ๊ธ์ ์ ์ดํดํ์ จ๋ค๋ฉด ์ setTimeout์ ์ธ์๋ฅผ 0์ผ๋ก ํ์ ๋ ๋ฐ๋ก ์คํ๋์ง ์์๋์ง, ์ setTimeout์ ์ธ์(์ด)๊ฐ ์ ํํ์ง ์์์ง ์ ์ ์์ต๋๋ค.
๋ชจ๋ ์ข ๋ฅ์ Web API๋ ์ด๋ฐ์์ผ๋ก ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ์ข ๋ ์ฌํ๋ ์์ ๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
console.log('Started');
$.on('button', 'click', function onClick(){
console.log('Clicked');
});
setTimeout(function onTimeout(){
console.log('Timeout Finished');
}, 5000);
console.log('Done');
(์ฌ๊ธฐ๋ฅผ ๊ฐ์ ์ ์คํ์ํค๋ฉด ํด๋น ์ฝ๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ธฐ ํจ์ฌ ์ฝ์ต๋๋ค. ํด๋ฆญ์ด๋ฒคํธ๋ ์ฝ๋ ์๋์ Click me!๋ฅผ ๋๋ฅด์๋ฉด ๋ฉ๋๋ค.)
์ ์ฝ๋ ๊ฐ์ ๊ฒฝ์ฐ ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ Web API์ ๋ณด๊ด๋์ด์ ํด๋น ๋ฒํผ('button')์ ๋๋ฅผ ๋๋ง๋ค ์ด๋ฒคํธ๋ฅผ ํธ์ถํ๋๋ฐ Web API์์ Callback Queue์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ฝ๋ฐฑ์ ๋ณด๊ด ํ Stack์ console.log('Clicked')๋ฅผ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง๋ ๋์ผํฉ๋๋ค.
์ด์ธ์๋ ์ฌ๋ฌ ๊ฐ์ setTimeout์ด๋ผ๋๊ฐ, ํ๋ก ํธ์์์ ์คํฌ๋กค ๊ด๋ จ ์ด๋ฒคํธ๋ผ๋๊ฐ ์ฌ๋ฌ๊ฐ์ง ์์ ๊ฐ ์์ง๋ง ๋๋จธ์ง๋ ๋ ์๋ถ๋ค์๊ฒ ๋งก๊ธฐ๊ฒ ์ต๋๋ค. ์คํฌ๋กค ๊ด๋ จํ ๋น๋๊ธฐ ๋ฐฉ์์ ๊ผญ ํด๋ณด์๊ธธ ๊ถ์ฅํด๋๋ฆฝ๋๋ค.
๋งบ์ผ๋ฉฐ..
์๊ฐ๋ณด๋ค ๊ธ์ด ์์ฒญ ๊ธธ์ด์ก๋ค์.. ์ง๊ธ๊น์ง ์์ฑํ ๊ธ ์ค์์ ๊ฐ์ฅ ๋ถ๋์ด ๋ง์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ๋ธ๋ก๊ทธ(๊ฒจ์ฐ 4๊ฐ์..)๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ๊ฐ์ฅ ์ ์ตํ๊ณ ์ฌ๋ฐ์๋ ๋ด์ฉ์ด์์ต๋๋ค.
async/await์ ์ฝ๋ฐฑ ํจ์, ์๋ฐ์คํฌ๋ฆฝํธ์์์ ๋น๋๊ธฐ ๊ด๋ จํ ํผ์ฆ๋ค์ด ๋๋์ด ๋ง์ณ์ง๊ฒ ๊ฐ์ต๋๋ค. ์ ์ ์ฝ๋ฐฑํจ์ ๊ด๋ จ ๊ธ์ ์ด์ ์ด ์๋๋ฐ ์์ ๋์ฅํ์ด์๋ค๋ ๊ฒ๋ ์์ ์์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ง ๋ฐฐ์ด ๋ถ๋ค๊ป๋ ๋ค์ ์ด๋ ค์ธ ์ ์์ง๋ง ๊ณ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์์ ์ด๋ผ๋ฉด ๋ฐ๋์ ์ดํดํ๊ณ ๋์ด๊ฐ ๋ถ๋ถ์ด๊ธฐ๋ ํ๊ฒ ๊ฐ์ต๋๋ค. ์๊ธ ๊ฐ๋ฐ์๋ถ๊ป์ ์ด๋ฐ ๊ฑฐ ๋ชฐ๋ผ๋ ๊ฐ๋ฐ ์ํ๋ค๊ณ ํ์๋๋ฐ ํ์คํ๊ฒ ์ข์์์!!
๋ค์์๋ ์๋ฐ์ ์๋์๋ฆฌ์ ๋ํด ๊ณต๋ถํด๋ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค :)
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
Conference
- ์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๋ฒคํธ ๋ฃจํ
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์๋ฆฌ : ์์ง, ๋ฐํ์, ํธ์ถ ์คํ
- ๋น๋๊ธฐ ์์ ์ ์๋ฆฌ
- Event Loop(์ด๋ฒคํธ ๋ฃจํ)
- What the heck is the event loop anyway? | Philip Roberts | JSConf EU
- How JavaScript works: an overview of the engine, the runtime, and the call stack
- latenflip.com
- github.info
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฐ์ ๋์๊ณผ์ Java Compiler์ JVM (16) | 2021.05.11 |
---|---|
[CA] ๋ฐ์ด๋๋ฆฌ ํ์ผ๊ณผ ๋ฐ์ดํธ ํ์ผ ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ, ๋งํฌ (4) | 2021.05.10 |
[OS] ๋ ์ด์ ์ด๋ฒ๋ฒํ์ง๋ง์!! ์ค๋ ๋์ ํ๋ก์ธ์ค (13) | 2021.04.26 |
[Python] list(๋ฆฌ์คํธ)์ ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ (0) | 2021.04.25 |
[Node.js] uuid ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฐ ์ฌ์ฉํ๊ธฐ (0) | 2021.04.12 |