Programming/Node.js

Node.js ์ดํ•ดํ•˜๊ธฐ - ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ

osean 2020. 9. 26. 16:53

0. Node.js ๋กœ๊ณ 

๋“ค์–ด๊ฐ€๊ธฐ์— ์•ž์„œ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งŽ์€ ๋น„๋™๊ธฐ๋“ค์„ ์–ด๋– ํ•œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ,
์™œ ๋น„๋™๊ธฐ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ• ๊นŒ?
๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ณผ์ •์€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„๊นŒ?

์–ด์ œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋ฉด, Node.js ๋Š” V8 ์—”์ง„๊ณผ libuv๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , libuv๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ๋น„๋™๊ธฐ ๋…ผ ๋ธ”๋กœํ‚น I/O ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์˜ค๋Š˜์€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ใ„ดใ„ดใ…ˆํ•œ๋‹ค.

 


์ด๋ฒคํŠธ?

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

 

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜?

๊ทธ๋ ‡๋‹ค๋ฉด Node.js ์—์„œ ๋งํ•˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์ด๋ผ๋Š” ๊ฒƒ์€ ํŠน์ • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ๋ฏธ๋ฆฌ ์˜ˆ์•ฝ ํ˜น์€ ์ง€์ •ํ•ด๋†“์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œ๊ธ€ ์ทจ์†Œ ๋ฒ„ํŠผ์„ ํด๋ฆญ(ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฐœ์ƒ)ํ•˜๋ฉด ๊ฒŒ์‹œ๊ธ€์ด ์‚ญ์ œ๋œ๋‹ค๋Š” ๋ชจ๋‹ฌ์ด๋‚˜ alert ์ฐฝ์„ ๋„์šฐ๋Š” ๊ฒƒ ๋ง์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ง€์ •ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž‘์—…์ด ์ผ์–ด๋‚˜์•ผ ํ•  ์‹œ์ ์— ์ด๋ฒคํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค. 

์ด๋Ÿฌํ•œ ํ–‰์œ„๋ฅผ "์ด๋ฒคํŠธ ๋ฆฌ์Šคํ„ฐ(Event Listner) ์—๊ฒŒ ์ฝœ๋ฐฑ(callback) ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•œ๋‹ค."๋ผ๊ณ  ํ•œ๋‹ค.

 

Node.js ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์— ์˜ํ•ด ๋™์ž‘ํ•˜๊ธฐ์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ๋“ฑ๋กํ•ด๋‘” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์—†๊ฑฐ๋‚˜, ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๋ฉด Node.js ๋Š” ๋‹ค์Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.

 

์ด๋ฒคํŠธ ๋ฃจํ”„(Event Loop) / ํƒœ์Šคํฌ ํ(Task Queue) / ๋ฐฑ๊ทธ๋ผ์šด๋“œ(Background)?

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ์ฝœ๋ฐฑ, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๋ฐ‘๋ฐ”ํƒ•์ด ๊ทธ๋ ค์กŒ๋‹ค๋ฉด ๊ทธ๋‹ค์Œ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ผ๋Š” ๊ฐœ๋…์ด ๋‚˜์˜จ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„๋ผ๋Š” ๊ฒƒ์€ ๋ญ˜๊นŒ? 

Javascript๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ(Single Thread) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ์จ Call Stack ์ด ํ•˜๋‚˜๋ผ๋Š” ๋ง์ด๋‹ค. ์ฆ‰, ์ž‘์—…์˜ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค. Javascript ์ฝ”๋“œ ๋‚ด์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ํ•จ์ˆ˜๋“ค์„ Call Stack ์˜์—ญ์— ๋„ฃ๊ณ , ๊ทธ๋‹ค์Œ ์ฝ”๋“œ๋“ค์ด ์Œ“์ธ๋‹ค. (๋งจ ์œ„๋ถ€ํ„ฐ ํ•œ ์ค„์”ฉ ์‹คํ–‰ํ•œ๋‹ค.) 

 

function first(){
	second();
    console.log("์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ");
}

function second() {
	third();
    console.log("๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ");
}

function third(){
	
    console.log("์„ธ ๋ฒˆ์งธ ํ˜ธ์ถœ")
}

first();

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ์˜ ๊ตฌ์กฐ๋ฅผ ํ™•์ธํ•ด๋ณด์ž.

๊ฐ€์žฅ ๋จผ์ € first() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ๊ทธ ์•ˆ์— ์žˆ๋Š” second() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ second() ํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋Š” third() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ

 

์„ธ ๋ฒˆ์งธ ํ˜ธ์ถœ

๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ

์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ

 

์ˆœ์œผ๋กœ console์— ์ถœ๋ ฅ๋œ๋‹ค.

๋˜ํ•œ ์œ„์˜ ํ•จ์ˆ˜๋“ค์ด ํ˜ธ์ถœ ์Šคํƒ์— ์Œ“์ด๊ธฐ ์ „์— ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(์ „์—ญ ์ปจํ…์ŠคํŠธ) ๊ฐ€ ์Œ“์ด๊ณ  ํ•ด๋‹น ์ปจํ…์ŠคํŠธ ์œ„์— ๋‹ค์Œ์— ์˜ฌ ํ•จ์ˆ˜๋“ค์ด ์Œ“์ด๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ(์ „์—ญ ์ปจํ…์ŠคํŠธ) ๋Š” ์ฝ”๋“œ๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด ๋ง์€ Javascript ์ฝ”๋“œ๋Š” ์‹คํ–‰ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์—ญ ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ๋Œ์•„๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.(๊ณ  ํ•œ๋‹ค..)

 

๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์—ˆ๋‹ค๋ฉด third(), second(), first(), ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ˆœ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์—์„œ ์ง€์›Œ์ง€๋ฉฐ, ๋ชจ๋‘ ์ง€์›Œ์ง€๊ฒŒ ๋˜๋ฉด ํ˜ธ์ถœ ์Šคํƒ์€ ๋น„์›Œ์ง€๊ฒŒ ๋œ๋‹ค. 

 

์œ„์˜ ์ฝ”๋“œ์—์„œ setTimeout() ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค๋ฉด setTimeout() ํ•จ์ˆ˜ ๋‚ด์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„๊นŒ? 

์ถœ๋ ฅ๋˜๋Š” ์ˆœ์„œ์— ๋Œ€ํ•ด์„œ๋Š” ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ํ˜ธ์ถœ ์Šคํƒ์— ์–ธ์ œ ๋“ค์–ด๊ฐ€๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ผ๊ณ  ํ•˜๋ฉด ๋งŽ์ด ํž˜๋“ค ๊ฒƒ ๊ฐ™๋‹ค!

 

์ด๋ ‡๊ฒŒ ํ˜ธ์ถœ ์Šคํƒ์— ๋“ค์–ด๊ฐ€๋Š” ์ˆœ์„œ๋‚˜ ๋‚˜์˜ค๋Š” ์ˆœ์„œ ๋“ฑ์— ๋Œ€ํ•ด ๋ช…ํ™•ํžˆ ์„ค๋ช…ํ•˜๋ ค๋ฉด

์ด๋ฒคํŠธ ๋ฃจํ”„, ํƒœ์Šคํฌ ํ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ฐœ๋…์— ๋Œ€ํ•ด ํŒŒ์•…ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.(๋ผ๊ณ  ํ–ˆ๋‹ค..)

 

๊ทธ๋ ‡๋‹ค๋ฉด ์œ„์˜ 3๊ฐ€์ง€ ๊ฐœ๋…์€ ๋„๋Œ€์ฒด ๋ฌด์—‡์ผ๊นŒ?

 

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

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

๋ฐฑ๊ทธ๋ผ์šด๋“œ (Background)?

setTimeout() ๊ฐ™์€ ํƒ€์ด๋จธ๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋“ค์ด ๋Œ€๊ธฐํ•˜๋Š” ๊ณณ์ด๋‹ค. ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
(์Šค๋ ˆ๋“œ์˜ ์˜์—ญ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ? Javascript ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ๊ณต๋ถ€ํ–ˆ๋˜ ๊ธฐ์–ต์ด ์žˆ๋Š”๋ฐ, ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ ์ƒํƒœ์—์„œ ์–ด๋–ป๊ฒŒ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฑธ๊นŒ? -> ๊ฒ€์ƒ‰ํ•ด์„œ ์•Œ์•„๋ณธ ๊ฒฐ๊ณผ, ์ด๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์ธ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ด๋ฉฐ, ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ด๋ฒคํŠธ์˜ ์ˆœ์„œ์— ๋งž๊ฒŒ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค! ๋งž์„๊นŒ..? )

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

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

 

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

 

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

 

์ด๋Ÿฌํ•œ ์ƒํƒœ์—์„œ ํ˜ธ์ถœ ์Šคํƒ์— ์กด์žฌํ•˜๋˜ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋˜๊ณ  ๋‚œ ๋’ค ์ง€์›Œ์ง€๊ฒŒ ๋˜๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํƒœ์Šคํฌ ํ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ง€๊ณ  ์™€์„œ ํ˜ธ์ถœ ์Šคํƒ์— ๋„ฃ๊ณ  ์‹คํ–‰ํ•œ๋‹ค.

 

๊ทธ๋Ÿฐ ํ›„, ํ˜ธ์ถœ ์Šคํƒ์—์„œ ์‹คํ–‰๋œ ํ•จ์ˆ˜๋Š” ์ง€์›Œ์ง€๊ฒŒ ๋˜๋ฉฐ ํ˜ธ์ถœ ์Šคํƒ์€ ๋น„์›Œ์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ, ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋‹ค์Œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํƒœ์Šคํฌ ํ์— ์Œ“์—ฌ ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.

 

์ œ๋กœ์ดˆ ๋‹˜ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๋ณด๋‹ค ๊ฑฐ๊ธฐ์— ๋งํฌ๋˜์–ด ์žˆ๋Š” ์œ ํŠœ๋ธŒ ์˜์ƒ์„ ์‹œ์ฒญํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ๋ช…ํ™•ํžˆ ๋‚ด ๊ฒƒ์ด ๋œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ๋จธ๋ฆฟ์†์—์„œ ๋ฐ‘๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค!

 

 

(JavaScript) ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ๋ฃจํ”„

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ํ˜ธ์ถœ ์Šคํƒ๊ณผ ์ด๋ฒคํŠธ๋ฃจํ”„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! ์ •๋ง ์˜ค๋žœ๋งŒ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒํŠธ ๊ฐ•์ขŒ๋ฅผ ์˜ฌ๋ฆฌ๋„ค์š”. ์‚ฌ์‹ค ์›ฌ๋งŒํ•œ ๊ฒƒ๋“ค์€ ๋‹ค ๋‹ค๋ค˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ 50๊ฐ•์œผ๋กœ ๋๋‚ด๋ ค๏ฟฝ๏ฟฝ

www.zerocho.com

 

Event Loop ? Call Stack ? Task Queue ?

 

์ด ์˜์ƒ์„ ๋ณด๊ณ  ์ดํ•ดํ•œ ๋ถ€๋ถ„์€ setTimeout() ํ•จ์ˆ˜๋‚˜ Ajax ๋“ฑ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ์ œ๊ณต์ด ์•„๋‹Œ Web API ๋กœ์จ C++ ์–ธ์–ด๋กœ ๊ตฌ๋™๋œ๋‹ค.(๋งž๋‚˜?) ๊ทธ๋ ‡๊ธฐ์— ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์ธ Javascript ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ํž˜์„ ๋นŒ๋ ค ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด๋‹ค!

 

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


๋‘ ๋ฒˆ์งธ ๊ณต๋ถ€๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ด ์˜์ƒ๊ณผ ์ œ๋กœ์ดˆ๋‹˜์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€์„ ํ†ตํ•ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋จธ๋ฆฌ์นด๋ฝ ํ•˜๋‚˜ ์ •๋„๋Š” ์ดํ•ด๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. 

์ด๋ฒˆ ๊ณต๋ถ€๋ฅผ ํ†ตํ•ด ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ดํ•ด๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๋‹ค.

์˜ค๋Š˜ ์ €๋…์—๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋„ ๊ณต๋ถ€๋ฅผ ์กฐ๊ธˆ ํ•˜๊ณ , ๋‚ฎ์—๋Š” ์ด ์˜์ƒ์˜ 3๋ถ„์˜ 2 ์ •๋„๋ฅผ ์‹œ์ฒญํ–ˆ๋Š”๋ฐ ์˜ค๋Š˜ ์ €๋…์— ๋‚˜๋จธ์ง€ ๋’ท๋ถ€๋ถ„๋„ ๋งˆ์ € ์‹œ์ฒญํ•ด์„œ ๊ฐœ๋… ์ดํ•ด์— ๋ฐ•์ฐจ๋ฅผ ๊ฐ€ํ•ด์•ผ๊ฒ ๋‹ค!