JavaScript ์ด๋ฒคํธ ๋ฃจํ์ ๋น๋ฐ์ ํ๊ณ , ์์ ํ ์ฐ์ ์์์ ๋ง์ดํฌ๋กํ์คํฌ ์ค์ผ์ค๋ง์ ์ดํดํ์ธ์. ๋ชจ๋ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ์ง์์ ๋๋ค.
JavaScript ์ด๋ฒคํธ ๋ฃจํ: ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์์ ํ ์ฐ์ ์์ ๋ฐ ๋ง์ดํฌ๋กํ์คํฌ ์ค์ผ์ค๋ง ๋ง์คํฐํ๊ธฐ
์น ๊ฐ๋ฐ ๋ฐ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ๋์ ์ธ ์ธ๊ณ์์ JavaScript๊ฐ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ์์ ์ดํดํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ ์ธ๊ณ ๊ฐ๋ฐ์์๊ฒ JavaScript ์ด๋ฒคํธ ๋ฃจํ์ ๋ํ ๊น์ ์ดํด๋ ์ ์ตํ ๋ฟ๋ง ์๋๋ผ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ๋ฐ์์ฑ์ด ์ข์ผ๋ฉฐ ์์ธก ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ๊ฒ์๋ฌผ์์๋ ์ด๋ฒคํธ ๋ฃจํ์ ์ ๋น๋ฅผ ํ๊ณ ์์ ํ ์ฐ์ ์์ ๋ฐ ๋ง์ดํฌ๋กํ์คํฌ ์ค์ผ์ค๋ง์ ์ค์ํ ๊ฐ๋ ์ ์ค์ ์ ๋์ด ๋ค์ํ ๊ตญ์ ์ฒญ์ค์๊ฒ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ธฐ๋ณธ: JavaScript๊ฐ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ
์ด๋ฒคํธ ๋ฃจํ์ ๋ณต์ก์ฑ์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ JavaScript์ ๊ธฐ๋ณธ ์คํ ๋ชจ๋ธ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ ํต์ ์ผ๋ก JavaScript๋ ๋จ์ผ ์ค๋ ๋ ์ธ์ด์ ๋๋ค. ์ฆ, ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต์ JavaScript์ ๋ง๋ฒ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋งค์ฐ ๋ฐ์์ฑ์ด ์ข๊ฒ ๋๊ปด์ง๋๋ก ํ๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค.
์ด๋ ๋ค์์ ์กฐํฉ์ ํตํด ๋ฌ์ฑ๋ฉ๋๋ค.
- ์ฝ ์คํ: ์ฌ๊ธฐ์์ ํจ์ ํธ์ถ์ด ๊ด๋ฆฌ๋ฉ๋๋ค. ํจ์๊ฐ ํธ์ถ๋๋ฉด ์คํ์ ๋งจ ์์ ์ถ๊ฐ๋ฉ๋๋ค. ํจ์๊ฐ ๋ฐํ๋๋ฉด ๋งจ ์์์ ์ ๊ฑฐ๋ฉ๋๋ค. ๋๊ธฐ ์ฝ๋ ์คํ์ ์ฌ๊ธฐ์์ ๋ฐ์ํฉ๋๋ค.
- ์น API (๋ธ๋ผ์ฐ์ ) ๋๋ C++ API (Node.js): ์ด๋ JavaScript๊ฐ ์คํ๋๋ ํ๊ฒฝ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์
๋๋ค (์:
setTimeout, DOM ์ด๋ฒคํธ,fetch). ๋น๋๊ธฐ ์์ ์ด ๋ฐ์ํ๋ฉด ์ด๋ฌํ API์ ์ ๋ฌ๋ฉ๋๋ค. - ์ฝ๋ฐฑ ํ (๋๋ ์์ ํ): ์น API์์ ์์๋ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋๋ฉด (์: ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๊ฑฐ๋ ๋คํธ์ํฌ ์์ฒญ์ด ์๋ฃ๋จ) ๊ด๋ จ ์ฝ๋ฐฑ ํจ์๊ฐ ์ฝ๋ฐฑ ํ์ ๋ฐฐ์น๋ฉ๋๋ค.
- ์ด๋ฒคํธ ๋ฃจํ: ์ด๊ฒ์ด ์ค์ผ์คํธ๋ ์ดํฐ์ ๋๋ค. ์ฝ ์คํ๊ณผ ์ฝ๋ฐฑ ํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํฉ๋๋ค. ์ฝ ์คํ์ด ๋น์ด ์์ผ๋ฉด ์ฝ๋ฐฑ ํ์์ ์ฒซ ๋ฒ์งธ ์ฝ๋ฐฑ์ ๊ฐ์ ธ์ ์คํ์ ์ํด ์ฝ ์คํ์ ํธ์ํฉ๋๋ค.
์ด ๊ธฐ๋ณธ ๋ชจ๋ธ์ setTimeout๊ณผ ๊ฐ์ ๊ฐ๋จํ ๋น๋๊ธฐ ์์
์ด ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ์ค๋ช
ํฉ๋๋ค. ๊ทธ๋ฌ๋ Promises, async/await ๋ฐ ๊ธฐํ ์ต์ ๊ธฐ๋ฅ์ ๋์
์ผ๋ก ์ธํด ๋ง์ดํฌ๋กํ์คํฌ์ ๊ด๋ จ๋ ๋ณด๋ค ๋ฏธ๋ฌํ ์์คํ
์ด ๋์
๋์์ต๋๋ค.
๋ง์ดํฌ๋กํ์คํฌ ์๊ฐ: ๋ ๋์ ์ฐ์ ์์
๊ธฐ์กด ์ฝ๋ฐฑ ํ๋ ์ข ์ข ๋งคํฌ๋กํ์คํฌ ํ ๋๋ ๋จ์ํ ์์ ํ๋ผ๊ณ ํฉ๋๋ค. ์ด์๋ ๋์กฐ์ ์ผ๋ก ๋ง์ดํฌ๋กํ์คํฌ๋ ๋งคํฌ๋กํ์คํฌ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ ๋ณ๋์ ํ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๊ตฌ๋ณ์ ๋น๋๊ธฐ ์์ ์ ์ ํํ ์คํ ์์๋ฅผ ์ดํดํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
๋ง์ดํฌ๋กํ์คํฌ๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ ๋ฌด์์ ๋๊น?
- Promises: Promises์ fulfillment ๋๋ rejection ์ฝ๋ฐฑ์ ๋ง์ดํฌ๋กํ์คํฌ๋ก ์์ฝ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋
.then(),.catch()๋ฐ.finally()์ ์ ๋ฌ๋ ์ฝ๋ฐฑ์ด ํฌํจ๋ฉ๋๋ค. queueMicrotask(): ๋ง์ดํฌ๋กํ์คํฌ ํ์ ์์ ์ ์ถ๊ฐํ๋๋ก ํน๋ณํ ์ค๊ณ๋ ๊ธฐ๋ณธ JavaScript ํจ์์ ๋๋ค.- Mutation Observers: ์ด๋ DOM์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด์ฐฐํ๊ณ ์ฝ๋ฐฑ์ ๋น๋๊ธฐ์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
process.nextTick()(Node.js ํน์ ): ๊ฐ๋ ์ ๋น์ทํ์ง๋ง Node.js์process.nextTick()์ ํจ์ฌ ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ฉฐ ๋ชจ๋ I/O ์ฝ๋ฐฑ ๋๋ ํ์ด๋จธ๋ณด๋ค ๋จผ์ ์คํ๋์ด ํจ๊ณผ์ ์ผ๋ก ๋ ๋์ ๊ณ์ธต์ ๋ง์ดํฌ๋กํ์คํฌ ์ญํ ์ ํฉ๋๋ค.
์ด๋ฒคํธ ๋ฃจํ์ ํฅ์๋ ์ฃผ๊ธฐ
์ด๋ฒคํธ ๋ฃจํ์ ์๋์ ๋ง์ดํฌ๋กํ์คํฌ ํ์ ๋์ ์ผ๋ก ๋์ฑ ์ ๊ตํด์ง๋๋ค. ํฅ์๋ ์ฃผ๊ธฐ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ฌ ์ฝ ์คํ ์คํ: ์ด๋ฒคํธ ๋ฃจํ๋ ๋จผ์ ์ฝ ์คํ์ด ๋น์ด ์๋์ง ํ์ธํฉ๋๋ค.
- ๋ง์ดํฌ๋กํ์คํฌ ์ฒ๋ฆฌ: ์ฝ ์คํ์ด ๋น์ด ์์ผ๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ๋ง์ดํฌ๋กํ์คํฌ ํ๋ฅผ ํ์ธํฉ๋๋ค. ํ์ ์๋ ๋ชจ๋ ๋ง์ดํฌ๋กํ์คํฌ๋ฅผ ํ๋์ฉ ๋ง์ดํฌ๋กํ์คํฌ ํ๊ฐ ๋น์์ง ๋๊น์ง ์คํํฉ๋๋ค. ์ด๊ฒ์ด ์ค์ํ ์ฐจ์ด์ ์ ๋๋ค. ๋ง์ดํฌ๋กํ์คํฌ๋ ๊ฐ ๋งคํฌ๋กํ์คํฌ ๋๋ ์คํฌ๋ฆฝํธ ์คํ ํ์ ์ผ๊ด ์ฒ๋ฆฌ๋ฉ๋๋ค.
- ์ ๋ฐ์ดํธ ๋ ๋๋ง (๋ธ๋ผ์ฐ์ ): JavaScript ํ๊ฒฝ์ด ๋ธ๋ผ์ฐ์ ์ธ ๊ฒฝ์ฐ ๋ง์ดํฌ๋กํ์คํฌ๋ฅผ ์ฒ๋ฆฌํ ํ ๋ ๋๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- ๋งคํฌ๋กํ์คํฌ ์ฒ๋ฆฌ: ๋ชจ๋ ๋ง์ดํฌ๋กํ์คํฌ๊ฐ ์ง์์ง๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ๋ค์ ๋งคํฌ๋กํ์คํฌ (์: ์ฝ๋ฐฑ ํ,
setTimeout๊ณผ ๊ฐ์ ํ์ด๋จธ ํ, I/O ํ)์์ ์ ํํ์ฌ ์ฝ ์คํ์ ํธ์ํฉ๋๋ค. - ๋ฐ๋ณต: ๊ทธ๋ฐ ๋ค์ ์ฃผ๊ธฐ๊ฐ 1๋จ๊ณ๋ถํฐ ๋ฐ๋ณต๋ฉ๋๋ค.
์ด๋ ๋จ์ผ ๋งคํฌ๋กํ์คํฌ ์คํ์ด ์ ์ฌ์ ์ผ๋ก ๋ค์ ๋งคํฌ๋กํ์คํฌ๊ฐ ๊ณ ๋ ค๋๊ธฐ ์ ์ ์๋ง์ ๋ง์ดํฌ๋กํ์คํฌ์ ์คํ์ผ๋ก ์ด์ด์ง ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ธ์ง๋ ์๋ต์ฑ ๋ฐ ์คํ ์์์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
์์ ํ ์ฐ์ ์์ ์ดํด: ์ค์ฉ์ ์ธ ๊ด์
๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ฌ ์ ์ธ๊ณ ๊ฐ๋ฐ์์ ๊ด๋ จ๋ ์ค์ ์์๋ก ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
์์ 1: `setTimeout` vs. `Promise`
๋ค์ ์ฝ๋ ์ค๋ํซ์ ๊ณ ๋ คํ์ญ์์ค.
console.log('Start');
setTimeout(function callback1() {
console.log('Timeout Callback 1');
}, 0);
Promise.resolve().then(function promiseCallback1() {
console.log('Promise Callback 1');
});
console.log('End');
์ถ๋ ฅ์ด ์ด๋ป๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ญ๋๊น? ๋ฐ๋, ๋ด์, ๋์ฟ ๋๋ ์๋๋์ ๊ฐ๋ฐ์์๊ฒ ๊ธฐ๋์น๋ ์ผ๊ด๋์ด์ผ ํฉ๋๋ค.
console.log('Start');๋ ์ฝ ์คํ์ ์์ผ๋ฏ๋ก ์ฆ์ ์คํ๋ฉ๋๋ค.setTimeout์ด ๋ฐ์ํฉ๋๋ค. ํ์ด๋จธ๋ 0ms๋ก ์ค์ ๋์ง๋ง ์ค์ํ ๊ฒ์ ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋ ํ ์ฝ๋ฐฑ ํจ์๊ฐ ๋งคํฌ๋กํ์คํฌ ํ์ ๋ฐฐ์น๋ฉ๋๋ค (์ฆ์).Promise.resolve().then(...)์ด ๋ฐ์ํฉ๋๋ค. Promise๋ ์ฆ์ resolve๋๊ณ ํด๋น ์ฝ๋ฐฑ ํจ์๋ ๋ง์ดํฌ๋กํ์คํฌ ํ์ ๋ฐฐ์น๋ฉ๋๋ค.console.log('End');๊ฐ ์ฆ์ ์คํ๋ฉ๋๋ค.
์ด์ ์ฝ ์คํ์ด ๋น์ด ์์ต๋๋ค. ์ด๋ฒคํธ ๋ฃจํ์ ์ฃผ๊ธฐ๊ฐ ์์๋ฉ๋๋ค.
- ๋ง์ดํฌ๋กํ์คํฌ ํ๋ฅผ ํ์ธํฉ๋๋ค.
promiseCallback1์ ์ฐพ์ ์คํํฉ๋๋ค. - ์ด์ ๋ง์ดํฌ๋กํ์คํฌ ํ๊ฐ ๋น์ด ์์ต๋๋ค.
- ๋งคํฌ๋กํ์คํฌ ํ๋ฅผ ํ์ธํฉ๋๋ค.
callback1(setTimeout์์)์ ์ฐพ์ ์ฝ ์คํ์ ํธ์ํฉ๋๋ค. callback1์ด ์คํ๋์ด 'Timeout Callback 1'์ ๊ธฐ๋กํฉ๋๋ค.
๋ฐ๋ผ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Start
End
Promise Callback 1
Timeout Callback 1
์ด๋ `setTimeout`์ ์ง์ฐ ์๊ฐ์ด 0์ด๋๋ผ๋ ๋ง์ดํฌ๋กํ์คํฌ (Promises)๊ฐ ๋งคํฌ๋กํ์คํฌ (setTimeout)๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋จ์ ๋ช
ํํ๊ฒ ๋ณด์ฌ์ค๋๋ค.
์์ 2: ์ค์ฒฉ๋ ๋น๋๊ธฐ ์์
์ค์ฒฉ๋ ์์ ๊ณผ ๊ด๋ จ๋ ๋ณด๋ค ๋ณต์กํ ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
console.log('Script Start');
setTimeout(() => {
console.log('setTimeout 1');
Promise.resolve().then(() => console.log('Promise 1.1'));
setTimeout(() => console.log('setTimeout 1.1'), 0);
}, 0);
Promise.resolve().then(() => {
console.log('Promise 1');
setTimeout(() => console.log('setTimeout 2'), 0);
Promise.resolve().then(() => console.log('Promise 1.2'));
});
console.log('Script End');
์คํ์ ์ถ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
console.log('Script Start');๋ 'Script Start'๋ฅผ ๊ธฐ๋กํฉ๋๋ค.- ์ฒซ ๋ฒ์งธ
setTimeout์ด ๋ฐ์ํฉ๋๋ค. ํด๋น ์ฝ๋ฐฑ (`timeout1Callback`์ด๋ผ๊ณ ํจ)์ ๋งคํฌ๋กํ์คํฌ๋ก ํ์ ๋๊ธฐ๋ฉ๋๋ค. - ์ฒซ ๋ฒ์งธ
Promise.resolve().then(...)์ด ๋ฐ์ํฉ๋๋ค. ํด๋น ์ฝ๋ฐฑ (`promise1Callback`)์ ๋ง์ดํฌ๋กํ์คํฌ๋ก ํ์ ๋๊ธฐ๋ฉ๋๋ค. console.log('Script End');๋ 'Script End'๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
์ด์ ์ฝ ์คํ์ด ๋น์ด ์์ต๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์์๋ฉ๋๋ค.
๋ง์ดํฌ๋กํ์คํฌ ํ ์ฒ๋ฆฌ (1๋ผ์ด๋):
- ์ด๋ฒคํธ ๋ฃจํ๋ ๋ง์ดํฌ๋กํ์คํฌ ํ์์ `promise1Callback`์ ์ฐพ์ต๋๋ค.
- `promise1Callback`์ด ์คํ๋ฉ๋๋ค.
- 'Promise 1'์ ๊ธฐ๋กํฉ๋๋ค.
setTimeout์ ๋ง๋ฉ๋๋ค. ํด๋น ์ฝ๋ฐฑ (`timeout2Callback`)์ ๋งคํฌ๋กํ์คํฌ๋ก ํ์ ๋๊ธฐ๋ฉ๋๋ค.- ๋ค๋ฅธ
Promise.resolve().then(...)์ ๋ง๋ฉ๋๋ค. ํด๋น ์ฝ๋ฐฑ (`promise1.2Callback`)์ ๋ง์ดํฌ๋กํ์คํฌ๋ก ํ์ ๋๊ธฐ๋ฉ๋๋ค. - ์ด์ ๋ง์ดํฌ๋กํ์คํฌ ํ์ `promise1.2Callback`์ด ํฌํจ๋ฉ๋๋ค.
- ์ด๋ฒคํธ ๋ฃจํ๋ ๋ง์ดํฌ๋กํ์คํฌ ์ฒ๋ฆฌ๋ฅผ ๊ณ์ํฉ๋๋ค. `promise1.2Callback`์ ์ฐพ์ ์คํํฉ๋๋ค.
- ์ด์ ๋ง์ดํฌ๋กํ์คํฌ ํ๊ฐ ๋น์ด ์์ต๋๋ค.
๋งคํฌ๋กํ์คํฌ ํ ์ฒ๋ฆฌ (1๋ผ์ด๋):
- ์ด๋ฒคํธ ๋ฃจํ๋ ๋งคํฌ๋กํ์คํฌ ํ๋ฅผ ํ์ธํฉ๋๋ค. `timeout1Callback`์ ์ฐพ์ต๋๋ค.
- `timeout1Callback`์ด ์คํ๋ฉ๋๋ค.
- 'setTimeout 1'์ ๊ธฐ๋กํฉ๋๋ค.
Promise.resolve().then(...)์ ๋ง๋ฉ๋๋ค. ํด๋น ์ฝ๋ฐฑ (`promise1.1Callback`)์ ๋ง์ดํฌ๋กํ์คํฌ๋ก ํ์ ๋๊ธฐ๋ฉ๋๋ค.- ๋ค๋ฅธ
setTimeout์ ๋ง๋ฉ๋๋ค. ํด๋น ์ฝ๋ฐฑ (`timeout1.1Callback`)์ ๋งคํฌ๋กํ์คํฌ๋ก ํ์ ๋๊ธฐ๋ฉ๋๋ค. - ์ด์ ๋ง์ดํฌ๋กํ์คํฌ ํ์ `promise1.1Callback`์ด ํฌํจ๋ฉ๋๋ค.
์ฝ ์คํ์ด ๋ค์ ๋น์ด ์์ต๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ฃผ๊ธฐ๋ฅผ ๋ค์ ์์ํฉ๋๋ค.
๋ง์ดํฌ๋กํ์คํฌ ํ ์ฒ๋ฆฌ (2๋ผ์ด๋):
- ์ด๋ฒคํธ ๋ฃจํ๋ ๋ง์ดํฌ๋กํ์คํฌ ํ์์ `promise1.1Callback`์ ์ฐพ์ ์คํํฉ๋๋ค.
- ์ด์ ๋ง์ดํฌ๋กํ์คํฌ ํ๊ฐ ๋น์ด ์์ต๋๋ค.
๋งคํฌ๋กํ์คํฌ ํ ์ฒ๋ฆฌ (2๋ผ์ด๋):
- ์ด๋ฒคํธ ๋ฃจํ๋ ๋งคํฌ๋กํ์คํฌ ํ๋ฅผ ํ์ธํฉ๋๋ค. `timeout2Callback` (์ฒซ ๋ฒ์งธ setTimeout์ ์ค์ฒฉ๋ setTimeout์์)์ ์ฐพ์ต๋๋ค.
- `timeout2Callback`์ด ์คํ๋์ด 'setTimeout 2'๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
- ์ด์ ๋งคํฌ๋กํ์คํฌ ํ์ `timeout1.1Callback`์ด ํฌํจ๋ฉ๋๋ค.
์ฝ ์คํ์ด ๋ค์ ๋น์ด ์์ต๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ฃผ๊ธฐ๋ฅผ ๋ค์ ์์ํฉ๋๋ค.
๋ง์ดํฌ๋กํ์คํฌ ํ ์ฒ๋ฆฌ (3๋ผ์ด๋):
- ๋ง์ดํฌ๋กํ์คํฌ ํ๊ฐ ๋น์ด ์์ต๋๋ค.
๋งคํฌ๋กํ์คํฌ ํ ์ฒ๋ฆฌ (3๋ผ์ด๋):
- ์ด๋ฒคํธ ๋ฃจํ๋ `timeout1.1Callback`์ ์ฐพ์ ์คํํ์ฌ 'setTimeout 1.1'์ ๊ธฐ๋กํฉ๋๋ค.
์ด์ ํ๊ฐ ๋น์ด ์์ต๋๋ค. ์ต์ข ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Script Start
Script End
Promise 1
Promise 1.2
setTimeout 1
setTimeout 2
Promise 1.1
setTimeout 1.1
์ด ์๋ ๋จ์ผ ๋งคํฌ๋กํ์คํฌ๊ฐ ๋ง์ดํฌ๋กํ์คํฌ์ ์ฐ์ ๋ฐ์์ ํธ๋ฆฌ๊ฑฐํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ค์ ๋งคํฌ๋กํ์คํฌ๋ฅผ ๊ณ ๋ คํ๊ธฐ ์ ์ ๋ชจ๋ ์ฒ๋ฆฌ๋จ์ ๊ฐ์กฐํฉ๋๋ค.
์์ 3: `requestAnimationFrame` vs. `setTimeout`
๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ requestAnimationFrame์ ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ์ค์ผ์ค๋ง ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ ๋๋ฉ์ด์
์ฉ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋งคํฌ๋กํ์คํฌ ํ์ ์ฒ๋ฆฌ๋์ง๋ง ๋ค๋ฅธ ๋ ๋๋ง ์
๋ฐ์ดํธ ์ ์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ฐ์ ์์๋ ์ผ๋ฐ์ ์ผ๋ก setTimeout(..., 0)๋ณด๋ค ๋์ง๋ง ๋ง์ดํฌ๋กํ์คํฌ๋ณด๋ค ๋ฎ์ต๋๋ค.
๋ค์์ ๊ณ ๋ คํ์ญ์์ค.
console.log('Start');
setTimeout(() => console.log('setTimeout'), 0);
requestAnimationFrame(() => console.log('requestAnimationFrame'));
Promise.resolve().then(() => console.log('Promise'));
console.log('End');
์์ ์ถ๋ ฅ:
Start
End
Promise
setTimeout
requestAnimationFrame
์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์คํฌ๋ฆฝํธ ์คํ์ 'Start', 'End'๋ฅผ ๊ธฐ๋กํ๊ณ
setTimeout์ ๋ํ ๋งคํฌ๋กํ์คํฌ๋ฅผ ํ์ ๋๊ธฐ์ํค๊ณ Promise์ ๋ํ ๋ง์ดํฌ๋กํ์คํฌ๋ฅผ ํ์ ๋๊ธฐ์ํต๋๋ค. - ์ด๋ฒคํธ ๋ฃจํ๋ ๋ง์ดํฌ๋กํ์คํฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. 'Promise'๊ฐ ๊ธฐ๋ก๋ฉ๋๋ค.
- ์ด๋ฒคํธ ๋ฃจํ๋ ๋งคํฌ๋กํ์คํฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. 'setTimeout'์ด ๊ธฐ๋ก๋ฉ๋๋ค.
- ๋งคํฌ๋กํ์คํฌ์ ๋ง์ดํฌ๋กํ์คํฌ๊ฐ ์ฒ๋ฆฌ๋ ํ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ด ์์๋ฉ๋๋ค.
requestAnimationFrame์ฝ๋ฐฑ์ ์ผ๋ฐ์ ์ผ๋ก ์ด ๋จ๊ณ์์ ๋ค์ ํ๋ ์์ด ๊ทธ๋ ค์ง๊ธฐ ์ ์ ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ 'requestAnimationFrame'์ด ๊ธฐ๋ก๋ฉ๋๋ค.
์ด๋ ๋ํํ UI๋ฅผ ๊ตฌ์ถํ๋ ๋ชจ๋ ๊ธ๋ก๋ฒ ๊ฐ๋ฐ์์๊ฒ ๋งค์ฐ ์ค์ํ๋ฉฐ ์ ๋๋ฉ์ด์ ์ด ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ์ ์ง๋๋๋ก ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐ์๋ฅผ ์ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ
์ด๋ฒคํธ ๋ฃจํ์ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ ๊ฒ์ ํ๋ฌธ์ ์ธ ์ฐ์ต์ด ์๋๋๋ค. ์ ์ธ๊ณ์ ์ผ๋ก ๊ฐ๋ ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ง์ ์ธ ์ด์ ์ด ์์ต๋๋ค.
- ์์ธก ๊ฐ๋ฅํ ์ฑ๋ฅ: ์คํ ์์๋ฅผ ์๋ฉด ํนํ ์ฌ์ฉ์ ์ํธ ์์ฉ, ๋คํธ์ํฌ ์์ฒญ ๋๋ ํ์ด๋จธ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฝ๋๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์์ ์ง๋ฆฌ์ ์์น ๋๋ ์ธํฐ๋ท ์๋์ ๊ด๊ณ์์ด ๋ณด๋ค ์์ธก ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ผ๋ก ์ด์ด์ง๋๋ค.
- ์์์น ๋ชปํ ๋์ ๋ฐฉ์ง: ๋ง์ดํฌ๋กํ์คํฌ์ ๋งคํฌ๋กํ์คํฌ ์ฐ์ ์์๋ฅผ ์๋ชป ์ดํดํ๋ฉด ์์์น ๋ชปํ ์ง์ฐ์ด๋ ์์๊ฐ ์๋ชป๋ ์คํ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ถ์ฐ ์์คํ ๋๋ ๋ณต์กํ ๋น๋๊ธฐ ์ํฌํ๋ก๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ฒ๊น ํ ๋ ํนํ ์ข์ ์ค๋ฌ์ธ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ์ต์ ํ: ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ์๋ต์ฑ์ด ์ค์ํฉ๋๋ค. ์๊ฐ ๋ฏผ๊ฐํ ์
๋ฐ์ดํธ์ Promises ๋ฐ
async/await(๋ง์ดํฌ๋กํ์คํฌ์ ์์กด)์ ์ ๋ต์ ์ผ๋ก ์ฌ์ฉํ๋ฉด ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ UI๊ฐ ์ ๋์ ์ด๊ณ ๋ํํ์ผ๋ก ์ ์ง๋๋๋ก ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์์ ์์ ์งํ์ ๋ ์ค์ํ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ UI์ ์ค์ํ ๋ถ๋ถ์ ์ฆ์ ์ ๋ฐ์ดํธํฉ๋๋ค. - ํจ์จ์ ์ธ ๋ฆฌ์์ค ๊ด๋ฆฌ (Node.js): Node.js ํ๊ฒฝ์์
process.nextTick()๊ณผ ๋ค๋ฅธ ๋ง์ดํฌ๋กํ์คํฌ ๋ฐ ๋งคํฌ๋กํ์คํฌ์์ ๊ด๊ณ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋น๋๊ธฐ I/O ์์ ์ ํจ์จ์ ์ธ ์ฒ๋ฆฌ์ ๋งค์ฐ ์ค์ํ๋ฉฐ ์ค์ํ ์ฝ๋ฐฑ์ด ์ฆ์ ์ฒ๋ฆฌ๋๋๋ก ํฉ๋๋ค. - ๋ณต์กํ ๋น๋๊ธฐ ๋๋ฒ๊น : ๋๋ฒ๊น ํ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ (์: Chrome DevTools์ ์ฑ๋ฅ ํญ) ๋๋ Node.js ๋๋ฒ๊น ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ ๋ฃจํ์ ํ๋์ ์๊ฐ์ ์ผ๋ก ๋ํ๋ด์ด ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์คํ ํ๋ฆ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ฆ๊ฐ์ ์ธ ์ฐ์์ Promise ๋ฐ
async/await์ ํธ: ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ์ฆ๊ฐ์ ์ธ ์์ ๋๋ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํด์ผ ํ๋ ๊ฒฝ์ฐsetTimeout(..., 0)์ ๋นํด ๋ ๋น ๋ฅธ ์คํ์ ๋ณด์ฅํ๋ ๋ง์ดํฌ๋กํ์คํฌ ์ค์ผ์ค๋ง์ผ๋ก ์ธํด ์ผ๋ฐ์ ์ผ๋ก Promises ๋๋async/await๊ฐ ์ ํธ๋ฉ๋๋ค. - ์ด๋ฒคํธ ๋ฃจํ์ ์๋ณดํ๋ ค๋ฉด
setTimeout(..., 0)์ฌ์ฉ: ๋๋ก๋ ๋ค์ ๋งคํฌ๋กํ์คํฌ ์ฃผ๊ธฐ๋ก ์์ ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ ๋๋งํ๊ฑฐ๋ ์ฅ๊ธฐ ์คํ ๋๊ธฐ ์์ ์ ๋ถํ ํ ์ ์๋๋ก ํฉ๋๋ค. - ์ค์ฒฉ๋ ๋น๋๊ธฐ์ฑ์ ์ ์ํ์ญ์์ค: ์์์ ๋ณผ ์ ์๋ฏ์ด ๊น์ด ์ค์ฒฉ๋ ๋น๋๊ธฐ ํธ์ถ์ ์ฝ๋๋ฅผ ์ถ๋ก ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋น๋๊ธฐ ๋ ผ๋ฆฌ๋ฅผ ํ๋ฉดํํ๊ฑฐ๋ ๋ณต์กํ ๋น๋๊ธฐ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ํ๊ฒฝ ์ฐจ์ด ์ดํด: ํต์ฌ ์ด๋ฒคํธ ๋ฃจํ ์์น์ ๋น์ทํ์ง๋ง ํน์ ๋์ (์: Node.js์
process.nextTick())์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ํญ์ ์ธ์ํ์ญ์์ค. - ๋ค์ํ ์กฐ๊ฑด์์ ํ ์คํธ: ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด ๋ฐ ์ฅ์น ๊ธฐ๋ฅ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ต์ฑ์ ํ ์คํธํ์ฌ ์ผ๊ด๋ ํ๊ฒฝ์ ๋ณด์ฅํ์ญ์์ค.
๊ฒฐ๋ก
๋ง์ดํฌ๋กํ์คํฌ์ ๋งคํฌ๋กํ์คํฌ์ ๋ํ ๋๋ ทํ ํ๊ฐ ์๋ JavaScript ์ด๋ฒคํธ ๋ฃจํ๋ JavaScript์ ๋น๋๊ธฐ์ ํน์ฑ์ ๊ฐํํ๋ ์กฐ์ฉํ ์์ง์ ๋๋ค. ์ ์ธ๊ณ ๊ฐ๋ฐ์์๊ฒ ์ฐ์ ์์ ์์คํ ์ ๋ํ ์ฒ ์ ํ ์ดํด๋ ๋จ์ํ ํ๋ฌธ์ ํธ๊ธฐ์ฌ์ ๋ฌธ์ ๊ฐ ์๋๋ผ ๊ณ ํ์ง์ ์๋ต์ฑ์ด ์ข๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ค์ง์ ์ธ ํ์์ฑ์ ๋๋ค. ์ฝ ์คํ, ๋ง์ดํฌ๋กํ์คํฌ ํ ๋ฐ ๋งคํฌ๋กํ์คํฌ ํ ๊ฐ์ ์ํธ ์์ฉ์ ๋ง์คํฐํ๋ฉด ๋ณด๋ค ์์ธก ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ ํํ๋ฉฐ ๋ชจ๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋ณต์กํ ๋น๋๊ธฐ ๋ฌธ์ ๋ฅผ ์์ ์๊ฒ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๊ณ์ ์คํํ๊ณ , ๊ณ์ ๋ฐฐ์ฐ๊ณ , ํ๋ณตํ ์ฝ๋ฉ์ ํ์ธ์!