๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

1. JavaScript Runtime ๊ตฌ์„ฑ ์š”์†Œ

๋ธŒ๋ผ์šฐ์ € ๋‚ด์˜ JavaScript *๋Ÿฐํƒ€์ž„์€ ํฌ๊ฒŒ JavaScript ์—”์ง„๊ณผ ์›น API๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— ํ…Œ์Šคํฌ ํ์™€ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ผ๋Š” ๊ฐœ๋… ๋˜ํ•œ ์กด์žฌํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ผ ๋ถˆ๋ฆฌ๋Š” JavaScript๋„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

*๋Ÿฐํƒ€์ž„: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๊ตฌ๋™๋˜๋Š” ํ™˜๊ฒฝ

 

2. JavaScript ์—”์ง„

JavaScript ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ , ํ•ด์„, ์‹คํ–‰์„ ๋‹ด๋‹นํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ์ด๋‹ค. ์“ฐ๋ ˆ๋“œ ํ•˜๋‚˜๋กœ๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ ์˜์—ญ๋„ ๋‹จ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋๋‚˜๊ธฐ ์ „์—๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์—†๋Š” "Run to Completion" ํŠน์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

JavaScript ์—”์ง„์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์˜ ๋‘ ๊ฐ€์ง€ ์˜์—ญ

1) ํž™ ์˜์—ญ

  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ
  • ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด๋“ค์„ ํ• ๋‹นํ•˜๋Š” ๊ณณ
  • ๊ตฌ์กฐํ™”๋˜์ง€ ์•Š์€ ๋„“์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ง€์นญํ•œ๋‹ค. 
  • ex) ๋ณ€์ˆ˜ ํ• ๋‹น์‹œ ๊ด€๋ จ ์ •๋ณด ์ €์žฅ

2) ์Šคํƒ ์˜์—ญ

  • ์‹คํ–‰ํ•  ํ…Œ์Šคํฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์˜์—ญ
  • ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์Šคํƒ ํ”„๋ ˆ์ž„์ด ํ‘ธ์‹œ๋˜๊ณ ,
  • ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์Šคํƒ ํ”„๋ ˆ์ž„์ด ํŒ ๋˜๋Š” ์˜์—ญ์„ ์ง€์นญํ•œ๋‹ค. 
  • ex) ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์Šคํƒ์— ์Œ“์ž„

 ์Šคํƒ ์˜์—ญ์— ํ‘ธ์‹œ๋˜๋Š” ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์€ ๊ทธ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๋งฅ๋ฝ(Execution Context)์„ ์˜๋ฏธํ•œ๋‹ค. ์‹คํ–‰ ๋งฅ๋ฝ์ด๋ž€, ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฐ์ข… ์ •๋ณด๋“ค(ex. ์ง€์—ญ ๋ณ€์ˆ˜)์˜ ์ง‘ํ•ฉ์ด๋‹ค. JavaScript ์—”์ง„์€ JavaScript ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์‹œ์ž‘ํ•จ๊ณผ ๋™์‹œ์— ์ „์—ญ ์‹คํ–‰ ๋งฅ๋ฝ(Global Execution Context)์„ ์Šคํƒ ์˜์—ญ์— ํ‘ธ์‹œํ•˜๊ณ , ์ดํ›„ ํŠน์ • ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ ๋ฌธ์„ ๋งŒ๋‚˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ๋งฅ๋ฝ์„ ์Šคํƒ ์˜์—ญ์— ํ‘ธ์‹œํ•˜๊ณ  ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊ทธ ์‹คํ–‰ ๋งฅ๋ฝ์„ ํŒ ํ•œ๋‹ค. 

 

JavaScript ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์ „๋ถ€ ๋‹ค ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์ „์—ญ ์‹คํ–‰ ๋งฅ๋ฝ์ด ์Šคํƒ ์˜์—ญ์—์„œ ํŒ ๋˜์ง€ ์•Š๊ณ  ๋‚จ์•„ ์žˆ๋‹ค. ์ด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ๋’ค์—์„œ ์„ค๋ช…ํ•  "์Šคํƒ์ด ๋น„๋Š” ์ˆœ๊ฐ„"์ด๋ผ๋Š” ๋ง์˜ ์˜๋ฏธ๋ฅผ ์กฐ๊ธˆ ๋” ๋ช…ํ™•ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์Šคํƒ์ด ๋น„๋Š” ์ˆœ๊ฐ„์ด๋ผ๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ๋” ์ด์ƒ ์‹คํ–‰ํ•  JavaScript ์ฝ”๋“œ๊ฐ€ ์—†์–ด์„œ ์ „์—ญ ์‹คํ–‰ ๋งฅ๋ฝ๊นŒ์ง€ ์Šคํƒ ์˜์—ญ์—์„œ ํŒ์ด ๋œ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

 

 

3. ๋น„๋™๊ธฐ ๋ฐฉ์‹ Event loop๋กœ Javascript์˜ ๋™์‹œ์„ฑ์„ ์ง€์›ํ•œ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop)๋ฅผ ์ด์šฉํ•ด์„œ callback queue(๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ) ๋ฅผ call stack์— ๋ณด๋‚ธ๋‹ค. call stack์„ ์ง€์ผœ๋ณด๊ณ ์žˆ๋‹ค๊ฐ€, ์Šคํƒ์ด ๋น„๋Š” ์ˆœ๊ฐ„ callback queue์—์„œ callback function์„ ๊บผ๋‚ด์„œ ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ์ผ๋งŒ ํ•œ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๊ณ„์† stack์˜ empty ์—ฌ๋ถ€๋งŒ์„ ์‹ ๊ฒฝ์“ฐ๊ธฐ ๋•Œ๋ฌธ์—, ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰์ค‘์ธ ํƒœ์Šคํฌ๊ฐ€ call stack์— ์žˆ๋Š”์ง€, ์—†๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ž…์žฅ์—์„œ๋Š” single thread ๋กœ ์ฒ˜๋ฆฌ์ค‘์ธ javascript๊ฐ€ ๋งˆ์น˜ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

 

๊ตฌ๋™ํ™˜๊ฒฝ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ณด๊ธฐ: https://www.jsv9000.app/

 

4. Web APIs

Web api๋ž€?

์›น API๋Š” JavaScript ์—”์ง„์˜ ๋ฐ”๊นฅ์— ์œ„์น˜ํ•œ๋‹ค. Ajax ์š”์ฒญ, setTimeout(), ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋“ฑ๋ก๊ณผ ๊ฐ™์ด ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋งํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์š”์ฒญ๋“ค์˜ ์ฒ˜๋ฆฌ๊ฐ€ JavaScript ์—”์ง„์˜ ์“ฐ๋ ˆ๋“œ์™€๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋“ค์—์„œ ์ด๋ค„์ง„๋‹ค๋Š” ์ ์ด๋‹ค. JavaScript ์—”์ง„์˜ ์Šคํƒ์—์„œ ์‹คํ–‰๋œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ์ •๋ณด์™€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์›น API๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋„˜๊ธฐ๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋Ÿฌํ•œ ์š”์ฒญ๋“ค์„ ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ์— ์œ„์ž„ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์“ฐ๋ ˆ๋“œ๋Š” ํ•ด๋‹น ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋Š” ์ˆœ๊ฐ„ ์ „๋‹ฌ๋ฐ›์•˜๋˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ JavaScript ์—”์ง„์˜ ํƒœ์Šคํฌ ํ๋ผ๋Š” ๊ณณ์— ์ง‘์–ด๋„ฃ๋Š”๋‹ค. 

์˜ˆ๋ฅผ ๋“ค์–ด, setTimeout() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด JavaScript ์—”์ง„์€ ์›น API๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ setTimeout() ์ž‘์—…์„ ์š”์ฒญํ•˜๋ฉด์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋Ÿฌํ•œ ํƒ€์ด๋จธ ์ž‘์—…์„ ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜๋ฉด JavaScript ์—”์ง„์˜ ์Šคํƒ์—์„œ๋Š” setTimeout() ํ•จ์ˆ˜์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ฆ‰์‹œ ํŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์ž๋กœ ๋ช…์‹œํ•œ ์‹œ๊ฐ„์ด ํ๋ฅด๊ณ  ๋‚˜๋ฉด ํ•ด๋‹น ํƒ€์ด๋จธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋˜ ์“ฐ๋ ˆ๋“œ๋Š” ์ „๋‹ฌ๋ฐ›์•˜๋˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ JavaScript ์—”์ง„์˜ ํƒœ์Šคํฌ ํ์— ์ง‘์–ด๋„ฃ๊ฒŒ ๋œ๋‹ค.

 

5. ์ด๋ฒคํŠธ ๋ฃจํ”„ (Event Loop)

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

while (queue.waitForMessage()) {
    queue.processNextMessage();
}
The event loop facilitates this process; it constantly checks whether or not the call stack is empty. If it is empty, new functions are added from the event queue. If it is not, then the current function call is processed. (๋ฐœ์ทŒ)

 

6. ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ชจ๋ธ

  • ์—ฌ๋Ÿฌ ํŒ€์—๊ฒŒ ์ž‘์—…์„ ์ง€์‹œํ•œ ํ›„, ๊ทธ ํŒ€๋“ค์ด ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„๋ณด๊ณ  ํ›„์† ์กฐ์น˜๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ(๋งค๋‹ˆ์ €)๋Š” ์‹ค์ œ ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ , ์ž‘์—…์„ ๋ถ„๋ฐฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋˜์ ธ์คŒ.
  • ๊ฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ๋‹ค์‹œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ.

์ฃผ์š” ์žฅ์ 

  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ์ง์ ‘ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…๋“ค์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„๋™๊ธฐ ์ž‘์—…์˜ ํšจ์œจ์  ๊ด€๋ฆฌ: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ์ฝœ๋ฐฑ์„ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ํšจ์œจ์ ์ธ ์‹คํ–‰ ํ๋ฆ„์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์˜ ํ•ต์‹ฌ ์—ญํ• ์€ ์ž‘์—…์„ ์™ธ๋ถ€ ์“ฐ๋ ˆ๋“œ์— ์œ„์ž„ํ•˜๊ณ  ๊ทธ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ฝœ๋ฐฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„, ๋น„๋™๊ธฐ์ ์ธ ๋น„ํšจ์œจ์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ๋™์‹œ์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žกํ•œ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ตœ๋Œ€ํ•œ ์—ญํ• ๋ณ„๋กœ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์— ๋ถ„์‚ฐ์‹œ์ผœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.์ตœ์ข…์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋Š” ํŠน์ •ํ•œ ํ•ต์‹ฌ ์—ญํ• ์„ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

7. ๋ธŒ๋ผ์šฐ์ €์˜ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ

๋ธŒ๋ผ์šฐ์ €๋Š” ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

  1. ๋ Œ๋”๋ง ์—”์ง„: ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ, ํŽ˜์ธํŒ…, ์ปดํฌ์ง€ํŒ… ์ž‘์—… ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ Œ๋”๋ง ๊ด€๋ จ ์“ฐ๋ ˆ๋“œ.
  2. ๋„คํŠธ์›Œํฌ ์“ฐ๋ ˆ๋“œ: ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ์‘๋‹ต ์ฒ˜๋ฆฌ (XHR, Fetch API ๋“ฑ).
  3. ์ž…์ถœ๋ ฅ(I/O) ์“ฐ๋ ˆ๋“œ: ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๋“ฑ๊ณผ ๊ฐ™์€ I/O ์ž‘์—….
  4. ํƒ€์ด๋จธ ์“ฐ๋ ˆ๋“œ: setTimeout, setInterval ๊ฐ™์€ ํƒ€์ด๋จธ ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ด€๋ฆฌ.
  5. GPU ์“ฐ๋ ˆ๋“œ: ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง, ํ•˜๋“œ์›จ์–ด ๊ฐ€์† ์ž‘์—… ๋“ฑ์„ ๋‹ด๋‹นํ•˜๋Š” GPU ๊ด€๋ จ ์“ฐ๋ ˆ๋“œ.
  6. Compositor ์“ฐ๋ ˆ๋“œ: ํ™”๋ฉด์— ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๋ฅผ ์กฐํ•ฉํ•ด ์ตœ์ข…์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ Œ๋”๋งํ•˜๋Š” ์“ฐ๋ ˆ๋“œ.

์ด ์™ธ์—๋„, ๋ธŒ๋ผ์šฐ์ €๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์“ฐ๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ

  1. ์ž‘์—… ์œ„์ž„
    • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…(์˜ˆ: ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ํŒŒ์ผ ์ž…์ถœ๋ ฅ, ๋ Œ๋”๋ง ๋“ฑ)์„ ํ•ด๋‹นํ•˜๋Š” ์“ฐ๋ ˆ๋“œ์— ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, XHR์ด๋‚˜ fetch ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ๋„คํŠธ์›Œํฌ ์“ฐ๋ ˆ๋“œ๋กœ ๋„˜๊ธฐ๊ณ  ์ฆ‰์‹œ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋น„๋™๊ธฐ ์ž‘์—… ๊ด€๋ฆฌ
    • ์ž‘์—…์„ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋กœ ๋„˜๊ธด ํ›„, ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์ฆ‰์‹œ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•๋ถ„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์‹œ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ
    • ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด, ํ•ด๋‹น ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋Š” ์ฝœ๋ฐฑ ํ˜•ํƒœ๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” Task Queue๋‚˜ Microtask Queue์— ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, setTimeout์ด๋‚˜ Promise๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ทธ ์ฝœ๋ฐฑ์ด ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  4. DOM ์กฐ์ž‘ ๋ฐ UI ์—…๋ฐ์ดํŠธ
    • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” DOM ์กฐ์ž‘๊ณผ UI ์—…๋ฐ์ดํŠธ๋„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํผ์„ ์ œ์ถœํ•˜๋Š” ๋“ฑ์˜ UI ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ์— ๋”ฐ๋ฅธ DOM ๋ณ€๊ฒฝ ์ž‘์—…๋„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ํ์— ๋Œ€๊ธฐ ์ค‘์ธ ์ž‘์—…๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐฉ์ง€: ๋ธŒ๋ผ์šฐ์ €์˜ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ๋ Œ๋”๋ง, I/O ์ž‘์—… ๋“ฑ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋Š” ์™„๋ฃŒ๋œ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ฝœ๋ฐฑ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ค„์ž…๋‹ˆ๋‹ค.

 

8. ํƒœ์Šคํฌ ํ (Task Queue)

ํƒœ์Šคํฌ ํ๋Š” ์›น API๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋˜ ์“ฐ๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ FIFO(First-In First-Out) ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์ผ์ข…์˜ ํ(Queue)๋กœ, JavaScript ์—”์ง„ ์ž์ฒด์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์—ฌ๊ธฐ์— ์ €์žฅ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์€ ์Šคํƒ์ด ๋น„๋Š” ์ˆœ๊ฐ„ ์Šคํƒ์— ์ˆœ์„œ๋Œ€๋กœ ํ‘ธ์‹œ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์›๋ฆฌ๋กœ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ์ดํ›„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด ํƒœ์Šคํฌ ํ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋”๋ผ๋„ ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ•ด๋‹น ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰๋˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ setTimeout() ํ•จ์ˆ˜๋„ ์ธ์ž๋กœ ๋ช…์‹œํ•œ ์‹œ๊ฐ„์€ '์ž ๋“œ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„'์ผ ๋ฟ, ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ์˜ค๋ž˜ ์ž ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

*์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ํƒœ์Šคํฌ๋ž€ ๊ณง ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํƒœ์Šคํฌ ํ๋Š” ์ฝœ๋ฐฑ ํ(Callback Queue)๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์ด๋ฒคํŠธ ํ, ๋ฉ”์„ธ์ง€ ํ๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. (์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ์— ๋“ฑ๋ก๋œ ํ•จ์ˆ˜๋ฅผ ์ฝœ์Šคํƒ์— ์ถ”๊ฐ€)

 

9. ์žก ํ (Job Queue)

ECMA 2015 ์—์„œ ๋‚˜์˜จ ๊ฐœ๋…์œผ๋กœ Promises์— ์˜ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. promises๋Š” async ํ•จ์ˆ˜๋ฅผ ์ฝœ์Šคํƒ์— ๋„ฃ๋Š” ๋Œ€์‹ ์— ๊ฐ€๋Šฅํ•œ ๋นจ๋ฆฌ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. Promises ๋Š” ํ˜„์žฌ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— resolve ๋œํ›„ ํ˜„์žฌ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜์ž๋งˆ์ž ๋ฐ”๋กœ ์‹คํ–‰๋œ๋‹ค. job queue๋Š” event queue ๋ณด๋‹ค ์šฐ์„  ๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด event queue์— ์Œ“์ธ ํ•จ์ˆ˜๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ๋‹ค. (์ƒ์œ„ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š๋”๋ผ๋„ ์žกํ์— ๋“ฑ๋ก๋œ ์ฝœ๋ฐฑ์„ ์ฝœ์Šคํƒ์— ์ถ”๊ฐ€)

 

const task = () => console.log('task');
const job = () => console.log('job');

const run = () => {
  console.log('callStack');
  setTimeout(task, 0);
  new Promise((resolve, reject) => resolve('job'))
  	.then((resolve) => job());
};

run();

// 'callStak'
// 'job'
// 'task'

 

 

 

 

 

 

 

์š”์•ฝ

๋ธŒ๋ผ์šฐ์ €๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฌด๊ฑฐ์šด ์ž‘์—…(๋ Œ๋”๋ง, ๋„คํŠธ์›Œํฌ, I/O ๋“ฑ)์„ ๋ณ„๋„์˜ ์“ฐ๋ ˆ๋“œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹จ์ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์Šค๋ ˆ๋“œ์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์‹คํ–‰, ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ด€๋ฆฌ, DOM ์กฐ์ž‘ ๋“ฑ์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์ฝœ๋ฐฑ์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งค๋„๋Ÿฝ๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

 

 

๋ฐ˜์‘ํ˜•