๐Ÿ“ ๊ฐœ๋ฐœ

Node.js๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ


Node.js์˜ ๋“ฑ์žฅ

Node.js๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค. Node.js๊ฐ€ ๋“ฑ์žฅํ•˜๊ธฐ ์ „์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋งŒ ๊ตฌ๋™๋  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ Node.js์˜ ๋“ฑ์žฅ ์ดํ›„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 2008๋…„ ๊ตฌ๊ธ€์ด V8์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋กฌ์„ ์ถœ์‹œํ–ˆ๊ณ , V8 ์—”์ง„์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์†๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 2009๋…„์— ๋ผ์ด์–ธ ๋‹ฌ์ด V8 ์—”์ง„ ๊ธฐ๋ฐ˜์˜ ๋…ธ๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ Node.js๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. Node.js๋Š” V8๊ณผ ๋”๋ถˆ์–ด libuv๋ผ๋Š” C์™€ C++๋กœ ๊ตฌํ˜„๋œ I/O ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— Node.js๋Š” ๋น„๋™๊ธฐ์ ์ด๋ฉฐ ๋น ๋ฅธ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Node.js์˜ ๋™์ž‘ ์›๋ฆฌ

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

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ๋Š” ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์–ด๋–ค ๋™์ž‘์„ ๋ฐœ์ƒ์‹œํ‚ฌ์ง€ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด๋‘์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

์œ„์˜ ๊ตฌ์„ฑ์š”์†Œ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์„ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š”์ง€ ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1-1. Node.js์˜ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ๋™์ž‘ ๊ณผ์ •

function run() {
    console.log("์‚ฌ์‹ค ์•„์ง ์•ˆ๊ฐ”์ง€๋กฑ~");
}
 
console.log("์•ˆ๋…•");
setTimeout(run, 1000);
console.log("์ž˜๊ฐ€");

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด console.log๊ฐ€ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ถœ๋ ฅ๋ ๊นŒ์š”? ๋กœ๊ทธ์˜ ๋‚ด์šฉ์œผ๋กœ๋„ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ โ€œ์•ˆ๋…•โ€ โ†’ โ€œ์ž˜๊ฐ€โ€ โ†’ โ€œ์‚ฌ์‹ค ์•„์ง ์•ˆ๊ฐ”์ง€๋กฑ~โ€์ˆœ์„œ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ๋™์ž‘์„ ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š”์ง€ gif๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ 1์ด ์‹คํ–‰๋  ๋•Œ ๋™์ž‘ ๊ณผ์ •

  1. ๋จผ์ € ์ „์—ญ ์ปจํ…์ŠคํŠธ์ธ anonymous๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  2. console.log(โ€์•ˆ๋…•โ€)์ด ํ˜ธ์ถœ ์Šคํƒ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  3. ํ˜ธ์ถœ ์Šคํƒ์˜ ๋งจ ์œ„์— ์žˆ๋Š” console.log(โ€์•ˆ๋…•โ€)์ด ํ˜ธ์ถœ๋˜๊ณ  โ€œ์•ˆ๋…•โ€์ด๋ผ๋Š” ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  4. setTimeout(run,1000)์ด ํ˜ธ์ถœ ์Šคํƒ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  5. setTimeout(run,1000)์ด ํ˜ธ์ถœ๋˜๋ฉด ํƒ€์ด๋จธ์™€ ํ•จ๊ป˜ run ์ฝœ๋ฐฑ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  6. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์˜์—ญ์—์„œ 1์ดˆ๋ฅผ ์„ธ๋Š” ๋™์•ˆ console.log(โ€์ž˜๊ฐ€โ€)๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์— ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ pop๋˜๋ฉด์„œ ์‹คํ–‰๋˜๊ณ , โ€œ์ž˜๊ฐ€โ€๋ผ๋Š” ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  7. ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ 1์ดˆ๋ฅผ ์„ผ ํ›„ run ํ•จ์ˆ˜๋ฅผ ํƒœ์Šคํฌ ํ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  8. ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ํ˜ธ์ถœ ์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด ํƒœ์ŠคํŠธ ํ์— ์žˆ๋Š” run ํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด ํ˜ธ์ถœ ์Šคํƒ์— ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.
  9. run ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ์Šคํƒ์—์„œ ๊บผ๋‚ด์ง€๊ณ  โ€œ์‚ฌ์‹ค ์•„์ง ์•ˆ๊ฐ”์ง€๋กฑ~โ€์ด๋ผ๋Š” ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

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

1-2. Javascript ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์ด๋ฒคํŠธ ๋ฐฉ์‹์˜ ๋™์ž‘ ๊ณผ์ •

Node.js ํ™˜๊ฒฝ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋ฒคํŠธ ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

$.on("button", "click",
    function () {
        console.log("hello");
    }
)

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— console.log("hello")๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ผ์šฐ์ € ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Call Stack, Web Apis, Callback Queue์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋งจ ์™ผ์ชฝ ์œ„๋ถ€ํ„ฐ ํ™”์‚ดํ‘œ ๋ฐฉํ–ฅ๋Œ€๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ ๋™์ž‘ ๊ณผ์ •

  1. ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ์ฝœ์Šคํƒ์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
  2. ์ฝœ์Šคํƒ์˜ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•ด์„œ ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜๋Š” ์ˆœ๊ฐ„ callback queue์— anoymous๊ฐ€ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. anoymous๋Š” ์ฒ˜์Œ ์‹คํ–‰ ์‹œ์˜ ์ „์—ญ ์ปจํ…์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„ ์ „์—ญ ์ปจํ…์ŠคํŠธ ์•ˆ์—์„œ ๋™์ž‘ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์ฃผ์„ธ์š”.
  4. ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์˜ํ•ด callback queue์— ์žˆ๋˜ ์ „์—ญ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ฝœ์Šคํƒ์œผ๋กœ ์˜ฎ๊ฒจ์ง€๊ณ , ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์— ์žˆ๋˜ console.log๋„ ์ฝœ์Šคํƒ ์˜์—ญ์œผ๋กœ push๋ฉ๋‹ˆ๋‹ค.
  5. ์ฝœ์Šคํƒ ๋งจ ์œ„์— ์žˆ๋Š” ๋™์ž‘๋ถ€ํ„ฐ pop๋˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

2. ๋…ผ ๋ธ”๋กœํ‚น I/O

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

Node.js์—์„œ๋Š” I/O ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋„˜๊ฒจ์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์€ ์ตœ๋Œ€ํ•œ ๋ฌถ์–ด์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋„˜๊ฒจ์•ผ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ“์ด์ฏค๋˜๋ฉด ์ƒ๊ธฐ๋Š” ๊ถ๊ธˆ์ฆ!!

Javascript๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ธ๋ฐ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์˜ I/O ์ž‘์—…์€ ์–ด๋–ป๊ฒŒ ๋™์‹œ์— ์‹คํ–‰๋ ๊นŒ์š”? ๋งŒ์•ฝ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์˜ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค๋ฉด, setTimeout๋“ฑ์„ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ์œผ๋กœ ๋„˜๊ธฐ๋ฉด ๋™์‹œ์— ์‹คํ–‰๋ ๊นŒ์š”?

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

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

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

3. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ

Node.js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ, ๋…ผ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค

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

์Šค๋ ˆ๋“œ

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

๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค์—๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜๋ฟ์ผ๊นŒ?

Node.js๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ”„๋กœ์„ธ์Šค์—์„œ ์Šค๋ ˆ๋“œ๋“ค์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ ํ•˜๋‚˜๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ค‘์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ดNode.js๋ฅผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ, ๋…ผ ๋ธ”๋กœํ‚น

Node.js๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Node.js๋Š” ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋…ผ ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ , ๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ

Node.js๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ