๋ค์ง๊ณ ์ง ์๋ฐ์คํฌ๋ฆฝํธ ์์ง ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ ๐
์ด๊ฒ ๋ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ตฌ์กฐ๋ก, ๊ทธ ์ค์์๋ V8 ์์ง์ ๊ตฌ์กฐ์ด๋ค.
JS Engine,
- Memory Heap : ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ผ์ด๋๋ ๊ณณ์ด๋ค.
์ฌ๊ธฐ์ Heap์ ๊ตฌ์กฐํ๋์ง ์์ ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ผ๋ก, ๊ฐ์ฒด(๋ณ์๋ ํจ์)๋ค์ด ๋ด๊ธฐ๋ ๊ณณ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค. - Call Stack(ํธ์ถ ์คํ) : ์คํ๋ ์ฝ๋๊ฐ ํ ์ค์ฉ ํ ๋น๋๋ค.
Web APIs,
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ด๋น์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๊ธฐ์ค์์๋ Web APIs, ๋
ธ๋์์๋ Background๋ก ์ค๋ช
๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ API๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค. (DOM, Ajax, Timeout ๋ฑ๋ฑ)
Callback Queue,
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋๋ ํ์ ์คํ๋์ด์ผ ํ ์ฝ๋ฐฑ ํจ์๋ค์ด ์ฐจ๋ก๋ก ๋๊ธฐํ๋ ๊ณต๊ฐ์ด๋ค.
Task Queue, Event Queue ๋ฑ ๋ค์ํ ํํ๋ก ์ค๋ช
๋๋๋ฐ,
์ ํํ๊ฒ ๋งํ์๋ฉด Callback Queue ์์ ์ ๋ค๋ฅธ ํํ์ Queue๋ค์ด ์กด์ฌํ๊ณ ์๋ค.
- Queue : ์๋ฃ๊ตฌ์กฐ ์ค ํ๋๋ก, ์ ์ ์ ์ถ(FIFO)์ ๋ฃฐ์ ๋ฐ๋ฅธ๋ค.
๊ทธ๋ฆฌ๊ณ Event Loop!
Queue์ ํ ๋น๋ ํจ์๋ค์ ์์์ ๋ง์ถฐ Call Stack์ผ๋ก ๋ณด๋ด์ฃผ๋ ์ญํ ์ด๋ค.
์ด ๋, Call Stack์ด ๋น์ด์๋ ์ํ์ผ ๋๋ง ๋ณด๋ด์ค๋ค. ์ด๊ฑธ ๊ณ์ ๋ฐ๋ณตํ๋๋ฐ, ๋ฐ๋ณต์ ์ธ ํ๋์ ํฑ(tick)์ด๋ผ๊ณ ํ๋ค.
๋ง์ฝ์ ๋๊ธฐ์ ์ธ ํจ์๋ง ์กด์ฌํ๋ค๋ฉด, Web APIs, Callback Queue โฆ ์ด๋ฐ๊ฑฐ ํ์์๊ณ ,
Call Stack ํ๋๋ง์ผ๋ก๋ ๋์ํ ์ ์๋ค.
์ฝ๋ ๋ณด๋ฉด์ ์ดํดํ๊ธฐ ๐ค
๋๊ธฐ์ ์ธ ์ฝ๋
function first() {
second();
console.log('์ฒซ ๋ฒ์งธ');
}
function second() {
third();
console.log('๋ ๋ฒ์งธ');
}
function third() {
console.log('์ธ ๋ฒ์งธ');
}
first();
third();
Call Stack ๋ด๋ถ์์๋?
1๏ธโฃ ํธ์ถ์ด ๋๋ฉด ๋ชจ๋ ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ anonymous
(๋
ธ๋์์๋ main)๊ฐ ๋จผ์ ๋ด๊ธด๋ค.
2๏ธโฃ first();
ํธ์ถ๋๋ฉด์ ๋ด๊ธด๋ค.
3๏ธโฃ first();
๋ด๋ถ์ second();
๊ฐ ํธ์ถ๋๋ฉด์ ๋ด๊ธด๋ค.
4๏ธโฃ second();
๋ด๋ถ์ third();
๊ฐ ํธ์ถ๋๋ฉด์ ๋ด๊ธด๋ค.
5๏ธโฃ third();
๋ด๋ถ์ console.log('์ธ ๋ฒ์งธ');
๊ฐ ๊ทธ ์๋ก ์์ธ๋ค.
6๏ธโฃ ํธ์ถ๋๋ ์ฝ๋๋ค์ด Call Stack ๋ด๋ถ์ ๋ค ์์๋ค๋ฉด, ์ด ๋ ์คํ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ค.
์คํ ๋จ๊ณ
- Stack์ด๋๊น ๋ง์ง๋ง์ ๋ด๊ธด ๊ฒ๋ถํฐ(๊ฑฐ๊พธ๋ก์) ๋จผ์ ๋น ์ง๋ฉด์ ์คํ๋๋ค.
1๏ธโฃ console.log('์ธ ๋ฒ์งธ');
2๏ธโฃ third();
๋ ์คํ๋์์ผ๋ Stack์์ ๋น ์ง๋ค.
3๏ธโฃ second();
๋ฅผ ์คํํ๋ฉด์ console.log('๋ ๋ฒ์งธ');
์ถ๋ ฅํ๋ค.
4๏ธโฃ second();
๋น ์ง๋ฉด์ first();
์คํ, console.log('์ฒซ ๋ฒ์งธ')
์ถ๋ ฅํ๋ค.
5๏ธโฃ first();
ํจ์ ๋์์ด ๋๋๋ค.
6๏ธโฃ third();
ํจ์๊ฐ Call Stack์ ๋ด๊ธด๋ค.
7๏ธโฃ console.log('์ธ ๋ฒ์งธ');
์คํ๋๋ฉด์ ์ถ๋ ฅํ๋ค.
8๏ธโฃ ์ต์ข
์ ์ผ๋ก anonymous
๊น์ง ๋น ์ง๋ฉด์ ์คํ ๋จ๊ณ๋ ๋๋๋ค.
์ด์ Call Stack์ ์๊ธฐ๋ ์์๋๋ฐ.. ๐ณ
์คํํ๋ค๋ณด๋ฉด ์ฝ์คํ์์ ๊ฒฝํํ ์ ์๋ ์๋ฌ๊ฐ ์๋ค.
โUncaught RangeError: Maximum call stack size exceededโ
Call Stack ์ฌ์ด์ฆ๋ฅผ ์ด๊ณผํ๋ค๋ ์๋ฌ๋ก, ์ฝ์คํ๋ง๋ค ํ๊ณ์ ์ด ์กด์ฌํ๋ค. ๊ทธ ํ๊ณ์ ์ ์ด๊ณผํ๋ฉด ๋จ๋ ์๋ฌ๋ก,
์ฝ์คํ ์์ ์คํ ์ฝ๋๊ฐ ํ๋์ฉ ๋ด๊ธฐ๋ค๊ฐ ๊ฐ๋นํ ์ ์์๋งํผ ๋ง์์ง๋ฉด ํ๋ก๊ทธ๋จ์ด ํ ์ข
๋ฃ๋๋ค..
๋ธ๋ผ์ฐ์ ์์ง๋ง๋ค ์ฝ์คํ์ ํ๊ณ๋ ๋ค๋ฅด๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก 1๋ง๊ฐ์ด๊ณ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ ์ฝ 12๋ง๊ฐ๋ผ๊ณ ํ๋ค.
๋น๋๊ธฐ์ ์ธ ์ฝ๋
- ์ด๋ฒคํธ ๋ฃจํ์์๋ ๋น๋๊ธฐ ์ฝ๋์ ์๋ ๋ฐฉ์์ด ํต์ฌ!
console.log('์์');
setTimeout(function () {
console.log('์ค๊ฐ');
}, 3000);
console.log('๋');
ํ๋ก๊ทธ๋จ ๋์ ๋จ๊ณ
1๏ธโฃ anonymous
๊ฐ ๋จผ์ ๋ด๊ธด๋ค.
2๏ธโฃ console.log('์์')
์ด ์คํ๋๊ณ Stack์์ ๋น ์ง๋ฉด์
3๏ธโฃ ์ฝ์ ์ฐฝ์ โ์์โ ์ถ๋ ฅ๋๋ค.
4๏ธโฃ setTimeout(์ต๋ช
ํจ์, 3์ด)
์์ด๋ฉด์
5๏ธโฃ Web APIs(=Background)๋ก ๋์ด๊ฐ timeout์ด 3์ด๋์ ๋๊ธฐํ๋ค.
6๏ธโฃ ๋๊ธฐํ๋ ์ฌ์ด์ console.log('๋')
ํจ์๊ฐ Stack์ ์์ด๊ณ ๋น ์ง๋ฉด์
7๏ธโฃ ์ฝ์ ์ฐฝ์ โ๋โ ์ถ๋ ฅ๋๋ฉด์ anonymous
๋ Stack์์ ๋น ์ง๋ค.
8๏ธโฃ 3์ด๊ฐ ๋ ์์ ์ timeout์ ์ต๋ช
ํจ์๊ฐ Callback Queue๋ก ๋์ด๊ฐ๋ฉด์, ์ด๋ฒคํธ ๋ฃจํ๊ฐ Call Stack ์๋ฆฌ๊ฐ ๋น์ด์๋์ง ๋ค๋ฅธ ๊ฒ์ด ์๋์ง ๊ฒ์ฌํ๋ค. ๋น์ด์์ ๋๋ฅผ ์ฒดํฌํ ๋ค์์,
9๏ธโฃ ์ต๋ช
ํจ์ ์์ ์๋ console.log('์ค๊ฐ')
์ Stack์ ์๋๋ค.
๐ ์ต๋ช
ํจ์๊ฐ ์ข
๋ฃ๋๋ฉด์ Stack์์ ๋น ์ง๋ฉด์ ์ฝ์ ์ฐฝ์๋ โ์ค๊ฐโ ์ถ๋ ฅ๋๊ณ , ํด๋น ์ฝ๋์ ํ๋ก๊ทธ๋จ ๋์์ด ๋ง๋ฌด๋ฆฌ๋๋ค.
- Call Stack์ด ์คํํ ์ฝ๋๊ฐ ์๋์ง ์๋์ง ์ฒดํฌํ๋ ์ญํ ์ ํ๋ ๊ฒ์ด โ์ด๋ฒคํธ ๋ฃจํโ๋ก,
์คํ์ด ๋น์ด์๋ค๋ฉด Callback Queue์์ ๋๊ธฐ ์ค์ธ ํจ์๋ฅผ ๋๊ฒจ์ค๋ค. ๐ซ
์ด๋ฒ์๋ Promise๋ฅผ ์ถ๊ฐํ ๋น๋๊ธฐ์ ์ธ ์ฝ๋๋ฅผ ์ดํด๋ณด์
console.log('์์');
setTimeout(function () {
console.log('์ค๊ฐ');
}, 0);
Promise.resolve().then(function () {
console.log('ํ๋ก๋ฏธ์ค');
});
console.log('๋');
ํ๋ก๊ทธ๋จ ๋์ ๋จ๊ณ 1/2
1๏ธโฃ anonymous
๊ฐ ๋จผ์ ๋ด๊ธด๋ค.
2๏ธโฃ console.log('์์')
์ด ์คํ๋๊ณ Stack์์ ๋น ์ง๋ฉด์
3๏ธโฃ ์ฝ์ ์ฐฝ์ โ์์โ ์ถ๋ ฅ๋๋ค.
4๏ธโฃ ๋น๋๊ธฐ ํจ์์ธ setTimeout(์ต๋ช
ํจ์, 0์ด)
๊ฐ ์์ด๋ฉด์
5๏ธโฃ Web APIs(=Background)๋ก ๋์ด๊ฐ๋ค.
6๏ธโฃ ๋ค์์ผ๋ก Promise๊ฐ ๋์ด์ค๋๋ฐ, ์ฌ๊ธฐ์ ๊ธฐ์ตํด๋์ด์ผ ํ ์ ์ Promise๋ โ๋๊ธฐโ๋ผ๋ ์ ์ด๋ค.
๐ฅ ๊ทธ๋ฐ๋ฐ ์ ๋น๋๊ธฐ๋ผ๊ณ ์ธ์ํ๊ณ ์์์ง..?
๐ฉโ๐ป Promise ์์ฒด๋ ๋๊ธฐ์ธ๋ฐ, then์ ๋ง๋๋ ์๊ฐ ์์ง์ด ๋น๋๊ธฐ๋ก ์ธ์ํฉ๋๋ค!
7๏ธโฃ then์ด ์กด์ฌํ๋ Promise๋ ๋น๋๊ธฐ๋ก ์ธ์๋์ด Web APIs์ ๋ด๊ธด๋ค.
8๏ธโฃ Web APIs์ ๋ด๊ธด setTimeout์ ์คํ์ด ๋๋๊ณ Callback Queue๋ก ์ต๋ช
ํจ์๊ฐ ๋จผ์ ๋์ด๊ฐ๋ค๊ณ ๊ฐ์ ํ์.
9๏ธโฃ ๊ทธ ๋ค์์ผ๋ก then์ ์ต๋ช
ํจ์๊ฐ Callback Queue์ ๋์ด๊ฐ๋ค.
๐ ์ด๋ฒคํธ ๋ฃจํ์์ Call Stack์ด ๋น์ด์๋์ง ์๋์ง ์ฒดํฌ๋ฅผ ํ ํ์, Queue์ ์๋ ํจ์๋ค์ ๋๊ฒจ์คํ
๋ฐ ๊ณผ์ฐ ์ฌ๊ธฐ์ ์ด๋ค ์ต๋ช
ํจ์๋ฅผ ๋จผ์ ๋๊ฒจ์ค๊น?!
์ ๋ต์.. 60์ด ํ ๊ณต๊ฐ๊ฐ ์๋ ์ง๊ธ ๊ณต๊ฐ!
ํ๋ก๊ทธ๋จ ๋์ ๋จ๊ณ 2/2
1๏ธโฃ Callback Queue์ ์๋ ํจ์๋ค์ ๋๊ฒจ์ฃผ๊ธฐ ์ํด์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ด์ฌํ ์ง์ผ๋ณด๋๋ฐ, Call Stack์๋ ์์ง ์ฝ๋๋ค์ด ์์ฌ์์ด์ ๋ฐ๋ก ๋๊ฒจ์ฃผ์ง ๋ชปํ๋ค. Call Stack์ด ๋น๋ ์๊ฐ๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
2๏ธโฃ console.log('๋')
์ด ์คํ๋๊ณ , ์ฝ์ ์ฐฝ์ โ๋โ์ด ์ถ๋ ฅ๋๋ค.
3๏ธโฃ ๋ ์ด์ ์คํํ ์ฝ๋๊ฐ ์๊ธฐ ๋๋ฌธ์ anonymous
๋ Stack์์ ์ฌ๋ผ์ง๊ณ ๋น์ด์๋ ์ํ๊ฐ ๋๋ค.
4๏ธโฃ ์ด์ ์ด๋ฒคํธ ๋ฃจํ์์ Queue์ ์๋ ์ต๋ช
ํจ์๋ค์ ๋๊ฒจ์ค์ผ ํ ์ฐจ๋ก์ธ๋ฐ.. ์ด๋ค ํจ์๋ฅผ ๋จผ์ ๋๊ฒจ์ค๊น?
๐ฅ ์~ Queue๋ ์ ์
์ ์ถ, FIFO๋ผ์ timeout์ ์ต๋ช
ํจ์๋ฅผ ๋จผ์ ๋ด๋ณด๋ด๊ฒ ๋ค!
๐
โโ๏ธ ํ๋ ธ์ต๋๋ค.. ์ฐ์ ์์๋๋ฌธ์ then์ ์ต๋ช
ํจ์๋ฅผ ๋จผ์ ๋๊น๋๋ค~
5๏ธโฃ Promise then์ ์ต๋ช
ํจ์๋ฅผ Queue์์ ๋จผ์ ๊บผ๋ด์ด Stack์ผ๋ก ๋๊ธด๋ค.
6๏ธโฃ ์ต๋ช
ํจ์ ์์ ์ฝ๋ console.log('ํ๋ก๋ฏธ์ค')
๋ฅผ ๋ด๊ณ
7๏ธโฃ ์ฝ์ ์ฐฝ์ โํ๋ก๋ฏธ์คโ ์ถ๋ ฅํ๋ฉด์ Stack์์ ๋น ์ง๋ค.
8๏ธโฃ ์ด๋ฒคํธ ๋ฃจํ์์ Queue์ ๋จ์์๋ timeout์ ์ต๋ช
ํจ์๋ฅผ ๊บผ๋ด์ด Stack์ผ๋ก ๋๊ธด๋ค.
9๏ธโฃ ์ต๋ช
ํจ์ ์์ ์ฝ๋ console.log('์ค๊ฐ')
๋ฅผ ๋ด๊ณ
๐ ์ฝ์ ์ฐฝ์ โ์ค๊ฐโ ์ถ๋ ฅํ๋ฉด์ Stack์์ ๋น ์ง๋ค.
์ ๊น ๐ Callback Queue์ ์ฐ์ ์์?
์์์ ๋ณธ ๋น๋๊ธฐ ์ฝ๋์ ์งํ์ ๋ดค์ ๋, Queue์ ๋ด๊ธด ์ต๋ช ํจ์๋ค์ ์ฐ์ ์์์ ๋ฐ๋ผ์ ์คํ ์์๊ฐ ์ ํด์ก๋ค.
Callback Queue๋ ํฌ๊ฒ 3๊ฐ์ง์ ํ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
- ์ด๋ฒคํธ ๋ฃจํ๋ Callback Queue์ ์ฐ์ ์์๋ฅผ ๋งค๊ฒจ์ Call Stack์ผ๋ก ๋๊ฒจ์ค๋ค.
1์์. Microtask Queue (Job Queue) : Promise callback, async functions, โฆ
2์์. Animation Frames
3์์. Task Queue (Event Queue) : setTimeout, setInterval, โฆ
console.log('์์');
setTimeout(function () {
console.log('์ค๊ฐ');
}, 0);
Promise.resolve().then(function () {
console.log('ํ๋ก๋ฏธ์ค');
});
requestAnimationFrame(function () {
console.log('requestAnimationFrame');
});
console.log('๋');
์ด์ ์ด๋ฒคํธ ๋ฃจํ ๋์ ๋ฐฉ์ (Microtask Queue > Animation Frames > Task Queue)์ ์ดํดํ์ผ๋,
์คํ ๊ฒฐ๊ณผ๊ฐ ์ด๋ป๊ฒ ๋์ค๋์ง ๋ฐ๋ก ๋ ์ค๋ฅธ๋ค!
์ฝ์ : ์์
> ๋
> ํ๋ก๋ฏธ์ค
> requestAnimationFrame
> ์ค๊ฐ
โจ ์ ๋ฆฌ
์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์์ง ๋ชปํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ง ๋ชปํ๋ ๊ฒ์ด๋ค!
๋ ์ฌํ๊น์ง ๋์ ์๋ฆฌ๋ฅผ ์ ๋๋ก ์์ง๋ ๋ชจ๋ฅธ ์ฑ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค. ๋๊ตฐ๊ฐ ๊ฐ๋ฅด์ณ ์ฃผ์ง ์์์, ๋ค์ ์ ์ด ์์๋ค๊ณ ๋ณ๋ช ํ๊ธฐ๋ ๋ถ๋๋ฝ์ง๋ง.. ๋ด๊ฐ ๋ญ ๋ชจ๋ฅด๋์ง ๋ชจ๋ฅด๋๊น ์์๋ณผ ์๊ฐ๋ ์์๋๋ฐ ์คํฐ๋๋ฅผ ํ๋ฉด์ ์ด๋ค ๊ฐ๋ ๋ค์ด ์๊ณ , ๋ด๊ฐ ์ฐ๋ ์ธ์ด์ ๋์ ์๋ฆฌ ๊ฐ์ ๊ฑด ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ณ ์จ์ผ๊ฒ ๋ค๋ ๋ค์ง์ ํ ๋ฒ ๋ ํ ์ ์๊ฒ ๋์๋ค ๐
์ฐธ๊ณ ๋ด์ฉ
์ด๋ฒคํธ ๋ฃจํ ๋์ ์๋ฆฌ๋ฅผ ๋์ผ๋ก ์ง์ ์ฒดํํ๊ธฐ