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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ์–ธ์–ด

javascript๋Š”ย ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด์ด๋‹ค. ์ฆ‰ ํ•˜๋‚˜์˜ ๋‹จ์ผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋Š” ๋ง ๊ทธ๋Œ€๋กœย ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ๋‹ค๋ฅธ ์ž‘์—…์ด ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค ์ˆ˜๋„ ์—†๊ณ , ๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•˜๋˜ ์ž‘์—…์ด ๋๋‚˜์•ผ๋งŒ ๊ทธ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
javascript๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—”์ง„์€ ํ•˜๋‚˜์˜ Memory Heap๊ณผ Call Stack์„ ๊ฐ–๋Š”๋‹ค.

js engine

  • Memory Heap : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณณ.
  • Call Stack : ์ฝ”๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ, ์Šคํƒ์œผ๋กœ ์Œ“์ด๋Š” ๊ณณ.

ํ•˜๋‚˜์˜ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋“ค์ด ์ฝœ์Šคํƒ์— ์Œ“์ผ๊ฒƒ์ด๊ณ , ์ด ํ•จ์ˆ˜๋“ค์€ย LIFO(Last In First Out)๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

์ฝœ์Šคํƒ๊ณผ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋ฅผ ์—ฐ๊ด€์ง€์–ด ์ƒ๊ฐํ•ด๋ณด๋ฉด, javascript๊ฐ€ ํ•˜๋‚˜์˜ ๋ฉ”์ธ์Šค๋ ˆ๋“œ์™€ ํ•˜๋‚˜์˜ ์ฝœ์Šคํƒ์„ ๊ฐ–๋Š”๋‹ค๋Š” ๋ง์ด๋‹ค.

ํ•˜์ง€๋งŒ javascript์˜ ํŠน์ง•๋“ค์„ ์•Œ์•„๋ณด๋ฉด ๋น„๋™๊ธฐ, ๋™์‹œ์„ฑ, ๋…ผ๋ธ”๋กœํ‚น(Non Blocking) I/O ๋“ฑ์˜ ์ƒ๋ฐ˜๋˜๋Š” ๊ฐœ๋…๋“ค์ด ๋“ฑ์žฅํ•œ๋‹ค.

์‹ฑ๊ธ€์Šค๋ ˆ๋“œ๋ผ๋ฉฐ? ์–ด๋–ป๊ฒŒ ๋™์‹œ์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ง€?

๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋น„๋™๊ธฐ, ๋…ผ๋ธ”๋กœํ‚น ์ž‘์—…๋“ค์€ javascript ์—”์ง„์„ ๊ตฌ๋™ํ•˜๋Š” ๋Ÿฐํƒ€์ž„(Runtime) ํ™˜๊ฒฝ์—์„œ ๋‹ด๋‹นํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด๋ž€, ๋ธŒ๋ผ์šฐ์ € ํ˜น์€ Node.js๋ฅผ ์˜๋งˆํ•œ๋‹ค.

Node.js ๊ณต์‹์‚ฌ์ดํŠธ์—์„œ๋Š” Node.js๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†Œ๊ฐœํ•œ๋‹ค.

Node.js๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฃผ๋„ javaScript ๋Ÿฐํƒ€์ž„์œผ๋กœ์จ Node.js ๋Š” ํ™•์žฅ์„ฑ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

node.js ๊ตฌ์กฐ

node.js ๊ตฌ์กฐ

Node.js๋ฅผ ํฌ๊ฒŒ ๋‚˜๋ˆ ๋ดค์„ ๋•Œ, ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ v8์—”์ง„ ๊ทธ๋ฆฌ๊ณ ย libuv๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. Node.js์˜ ํŠน์„ฑ์ธ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜, ๋…ผ๋ธ”๋กœํ‚น I/O ๋ชจ๋ธ๋“ค์€ ๋ชจ๋‘ย libuv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๊ตฌํ˜„๋œ๋‹ค.

libuv์˜ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ ์†Œ๊ฐœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

libuv is a multi-platform support library with a focus on asynchronous I/O. It was primarily developed for use by Node.js, but itโ€™s also used by Luvit, Julia, uvloop, and others.

  1. Node.js๋Š” Javascript์™€ C++์–ธ์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

V8์—”์ง„๋„ 70% ์ด์ƒ์˜ C++๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, libuv๋Š” 100%์˜ C++์–ธ์–ด๋กœ ๊ตฌ์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

  1. Node.js์˜ ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” binding API์„ ํ†ตํ•ด javascript ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด Node.js์˜ ๋‚ด์žฅ ๋ชจ๋“ˆ์ธ crypto๋Š” ์›๋ž˜ C++ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค)

  2. Node.js์— ๋™์ž‘ํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” libuv ๋‚ด์—์„œ ๊ตฌํ˜„๋œ๋‹ค. ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ libuv ๋‚ด์—์„œ ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•ด์„œ, Javascript์˜ ์Šค๋ ˆ๋“œ์™€ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, Node.js๋Š” ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ด๋ฒคํŠธ ๋ฃจํ”„

์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ์ด๋ฒคํŠธ๋ฃจํ”„

์ด๋ฒคํŠธ์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

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

  • ๋”ฐ๋ผ์„œ ์ฝœ์Šคํƒ์— ๋งŽ์€ ํ•จ์ˆ˜๋“ค์„ ์Œ“์•„ ๋†“๋Š” ๊ฒƒ๋“ค์€ ๋‹ค๋ฅธ ํƒœ์Šคํฌ๋“ค์„ ๋ธ”๋กœํ‚นํ•  ์—ฌ์ง€๋ฅผ ๋†’์ด๊ฒŒ ๋œ๋‹ค.

    ๋”ฐ๋ผ์„œ ์‹คํ–‰์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ฝ”๋“œ๋“ค์€ ์ ์ ˆํ•˜๊ฒŒ ํƒœ์Šคํฌ๋“ค์„ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๋น„๋™๊ธฐ ํ˜ธ์ถœํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋งค ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์ˆœํ™˜๋˜๋Š” Event Loop๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ์ด๋ฉฐ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” **์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ฆˆ(Phase)**๋“ค์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ํŽ˜์ด์ฆˆ๋“ค์€ **๊ฐ์ž๋งŒ์˜ ํ(Queue)**๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๋ผ์šด๋“œ ๋กœ๋นˆ(round-robin) ๋ฐฉ์‹์œผ๋กœ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ์ผ์ • ๊ทœ์น™์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŽ˜์ด์ฆˆ๋“ค์„ ๊ณ„์† ์ˆœํšŒํ•œ๋‹ค.

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

setImmediate(() => {
  console.log('immediate');
});

์œ„ ์ฝ”๋“œ์—์„œ ์–ด๋Š ๊ฒƒ์ด ๋จผ์ € ์ถœ๋ ฅ์ด ๋ ๊นŒ? ์ •๋‹ต์€ ์•Œ ์ˆ˜ ์—†๋‹ค ์ด๋‹ค.

  • setTimeout์€ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ timer๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋˜๊ณ , setImmediate๋Š” check๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.

  • ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๊ณ„์†ํ•ด์„œ ํŽ˜์ด์ฆˆ๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฏ€๋กœ, ํ˜„์žฌ ์–ด๋Š ํŽ˜์ด์ฆˆ์ธ์ง€์— ๋”ฐ๋ผ ๋‘˜์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

๋…ผ๋ธ”๋กœํ‚น (Non-Blocking)

non blocking

  • Node.js์—์„œ์˜ ๋…ผ๋ธ”๋กœํ‚น ๋ชจ๋ธ์€ Input๊ณผ Output์ด ๊ด€๋ จ๋œ ์ž‘์—…(http, Database CRUD, third party api, filesystem), ์˜ค๋žซ๋™์•ˆ CPU๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ž‘์—… ๋“ฑ์˜ ๋ธ”๋กœํ‚น ์ž‘์—…๋“ค์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ด๋ฅผ ๋น„๋™๊ธฐ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋ž€ OS ์ปค๋„ ํ˜น์€ libuv์˜ ์Šค๋ ˆ๋“œ ํ’€์„ ์˜๋ฏธํ•œ๋‹ค.
  • libuv๋Š” OS ์ปค๋„์—์„œ ์–ด๋–ค ๋น„๋™๊ธฐ ์ž‘์—…๋“ค์„ ์ง€์›ํ•ด์ฃผ๋Š”์ง€ ์•Œ๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์—, ์ž‘์—… ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ปค๋„ ํ˜น์€ ์Šค๋ ˆ๋“œ ํ’€๋กœ ๋ถ„๊ธฐํ•œ๋‹ค.
  • ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ด๋ฒคํŠธ๋ฃจํ”„์—๊ฒŒ ์ด๋ฅผ ์•Œ๋ ค์ฃผ๊ณ , ์ด๋ฒคํŠธ ๋ฃจํ”„์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๋“ฑ๋ก๋œ๋‹ค.

๋™์‹œ์„ฑ์˜ ์˜๋ฏธ

์‚ฌ์‹ค ๋™์‹œ์„ฑ์˜ ์˜๋ฏธ๊ฐ€ ์ •๋ง๋กœ javascript ์ฝ”๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š”๊ฑธ ์˜๋ฏธํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค.
์–ด์ฐจํ”ผ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๋์€ Event Loop๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ตญ์—” javascript ์—”์ง„์˜ ๋‹จ์ผ Call Stack์œผ๋กœ ์˜ค๊ฒŒ ๋˜์–ด์žˆ๋‹ค.
์•ž์—์„œ ๋งํ–ˆ๋“ฏ์ด javascript๋Š” ๊ฒฐ๊ตญ์—” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์–ธ์–ด์ด๊ณ , ์ด ํ•ต์‹ฌ์€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. (single thread โ†’ single call stack โ†’ single thing at a time)

์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ๋˜์ง€ ์•Š์•˜์„๊นŒ?

์‚ฌ์‹ค ์ด๋Ÿด๊ฑฐ๋ฉด ์–ธ์–ด ์ฐจ์›์—์„œ ๊ทธ๋ƒฅ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š”๊ฒŒ ๋‚ซ์ง€ ์•Š์•˜์„๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

ํ•˜์ง€๋งŒ javascript๊ฐ€ ์ด๋ ‡๊ฒŒ ์„ค๊ณ„๋œ ์ด์œ ๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ œ์ผ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์‚ฌ์‹ค javascript๊ฐ€ ๊ฐœ๋ฐœ๋๋˜ ์‹œ์ ์—๋Š” ์˜ค๋Š˜ ๋‚ ์ฒ˜๋Ÿผ ๋ณต์žกํ•œ ์ž‘์—…์„ ์š”๊ตฌํ•˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค.
๋ฌด์—‡๋ณด๋‹ค๋„ DOM์„ ์กฐ์ž‘ํ•  ๋•Œ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋ผ๋ฉด ํƒ€์ด๋ฐ์ด ์–ด๊ธ‹๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ํž˜๋“ค ๊ฑฐ๋ผ ์ƒ๊ฐ๋œ๋‹ค.

ios๋‚˜ android์—์„œ๋„ UI์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์€ UI thread(main thread)์—์„œ๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค.

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

๋‚ด๊ฐ€ ์• ์šฉํ•˜๋Š” python(CPython ๊ธฐ์ค€)๋„ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋„, ์‹ค์ƒ์€ python ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ GIL(Global Iterpreter Lock)์ด๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋‹ค.

์ด ์—ญ์‹œ python์—์„œ thread-safe ๊ด€๋ จํ•œ ๋ฌธ์ œ๋“ค์„ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด์—ˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

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

์ฐธ๊ณ 

Welcome to the libuv documentation - libuv documentation

๋ธ”๋กํ‚น๊ณผ ๋…ผ๋ธ”๋กํ‚น ์‚ดํŽด๋ณด๊ธฐ | Node.js

The Node.js Event Loop, Timers, and process.nextTick

Javascript ๋™์ž‘์›๋ฆฌ (Single thread, Event loop, Asynchronous)