๐Ÿ“•CS

JavaScript์˜ ๋น„๋™๊ธฐ์™€ ์ด๋ฒคํŠธ ๋ฃจํ”„

stonesy 2024. 11. 21. 09:29
728x90

๐Ÿ“Œ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์ž‘์—…์„ ๋™์‹œ์—

JavaScript๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด๋กœ, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ˜๋ฉด Java๋‚˜ Python์€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜์—ฌ ์›ํ•˜๋Š” ์ฝ”๋“œ ๋กœ์ง์„ ๋™์‹œ์— ์ˆ˜ํ–‰์‹œํ‚ค๋Š” ๋ฉ€ํ‹ฐ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด๋‚˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ, ํƒ€์ด๋จธ์™€ ๊ฐ™์€ ์ž‘์—…์„ ๋ฉ€ํ‹ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋งŒ์ผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋ธŒ๋ผ์šฐ์ € ๋™์ž‘์ด ํ•œ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ๋™์•ˆ ๋ธŒ๋ผ์šฐ์ €๋Š” ํŒŒ์ผ์„ ๋‹ค ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ์›น์„œํ•‘๋„ ๋ชปํ•˜๊ณ  ๋ฉˆ์ถฐ ๋Œ€๊ธฐํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ์ผ ๋‹ค์šด, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ํƒ€์ด๋จธ, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ด๋Ÿฌํ•œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…๋“ค์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ธ Web APIs์—์„œ ๋น„๋™๊ธฐ+๋…ผ๋ธ”๋กœํ‚น์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋น„๋™๊ธฐ+๋…ผ๋ธ”๋กœํ‚น(Async+Non blocking)๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…์„ ๋‹ค๋ฅธ ๊ณณ์— ์š”์ฒญํ•˜์—ฌ ๋Œ€์‹  ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ด๋ฒคํŠธ๋‚˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„ ๊ฒฐ๊ณผ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. (ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ์š”์ฒญ ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์œผ๋กœ ์ „์ดํ•˜์—ฌ ๋™์‹œ์— ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ ๊ฒƒ)

 

๐Ÿ“Œ๋ธŒ๋ผ์šฐ์ €์˜ ๋‚ด๋ถ€ ๊ตฌ์„ฑ๋„

๋ธŒ๋ผ์šฐ์ €๋Š” ์›น ์‚ฌ์ดํŠธ๋ฅผ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ Web APIs, Event Table, Callback Queue, Event Loop ๋“ฑ์ด ์žˆ๋‹ค.

์ฝœ๋ฐฑ ํ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋‹ด๊ธฐ๊ณ , ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋Œ๋ฉด์„œ ์ฝœ ์Šคํƒ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์ฝœ๋ฐฑ ํ์—์„œ ํ•จ์ˆ˜๋ฅผ ์˜ฎ๊ฒจ ์‹คํ–‰ํ•œ๋‹ค.

- Call Stack: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฝ”๋“œ ์‹คํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

- Heap: ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„

- Web APIs: ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” API ๋ชจ์Œ์œผ๋กœ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์—…๋“ค์„ ์ „๋‹ดํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. (AJAX ํ˜ธ์ถœ, ํƒ€์ด๋จธ ํ˜ธ์ถœ, DOM ์กฐ์ž‘ ๋“ฑ)

- Callback Queue: ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋“ค์„ ์ ์ ˆํ•œ ์‹œ์ ์— ์‹คํ–‰์‹œํ‚ค๋Š” ๊ด€๋ฆฌ์ž

- Event Table: ํŠน์ • ์ด๋ฒคํŠธ(timeout, click, mouse ๋“ฑ)๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋–ค callback ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ

 

๐Ÿ“ŒCallback Queue์˜ ์ข…๋ฅ˜

Callback Queue์—๋Š” (macro)task queue์™€ microtask queue๊ฐ€ ์žˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” MicroTask Queue>Task Queue์ด๋‹ค.

Task Queue: setTimeout, setInterval, fetch, addEventListener์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ํ

MicroTask Queue: Promise์˜ .then, .catch, .finally, MutationObserver ์ฝœ๋ฐฑ ๋“ฑ

console.log('Start!');

setTimeout(() => {
	console.log('Timeout!');
}, 0);

Promise.resolve('Promise!').then(res => console.log(res));

console.log('End!');

1) console.log('Start!');

Call Stack์— console.log("Start!") ์ฝ”๋“œ ๋ถ€๋ถ„์ด ์Œ“์ธ ๋’ค ์‹คํ–‰๋˜์–ด ์ฝ˜์†”์ฐฝ์— "Start!")๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

2) setTimeout

setTimeout ์ฝ”๋“œ๊ฐ€ ์ฝœ ์Šคํƒ์— ์ ์žฌ๋˜๊ณ  ์‹คํ–‰๋˜๋ฉด, ๊ทธ ์•ˆ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด Web APIs๋กœ ์˜ฎ๊ฒจ์ง€๊ณ  ํƒ€์ด๋จธ๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ํƒ€์ด๋จธ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” Task Queue์— ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด ์ ์žฌ๋œ๋‹ค.

3) Promise

Promise ์ฝ”๋“œ๊ฐ€ ์ฝœ์Šคํƒ์— ์ ์žฌ๋˜์–ด ์‹คํ–‰๋˜๊ณ , then ํ•ธ๋“ค๋Ÿฌ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฒคํ”„ ๋ฃจํ”„์— ์˜ํ•ด MicroTask Queue

์— ์˜ํ•ด ์ ์žฌ๋œ๋‹ค.

4) console.log('End!')

Promise ์ฝ”๋“œ๊ฐ€ ์ฝœ์Šคํƒ์— ์ ์žฌ๋˜์–ด ์‹คํ–‰๋˜๊ณ  then ํ•ธ๋“ค๋Ÿฌ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด MicroTask Queue์— ์ ์žฌ๋œ๋‹ค.

์ฆ‰, 1>4>3>2์˜ ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

728x90