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

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

 

์ด ๊ธ€์—์„œ๋Š” Node.js์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ชจ๋ธ๊ณผ ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” libuv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์—ญํ• ์„ ์„ค๋ช…ํ•˜๊ณ , ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์Šค๋ ˆ๋“œ ํ’€๊ณผ ์™ธ๋ถ€ API ํ˜ธ์ถœ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

1. Node.js์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ๋น„๋™๊ธฐ ๋…ผ๋ธ”๋กœํ‚น I/O ๋ชจ๋ธ

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

 

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

 

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

 

 

2. ๋น„๋™๊ธฐ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ๊ณผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ฆฌ์†Œ์Šค

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

 

๊ทธ๋Ÿฌ๋‚˜, ๋Œ€๊ทœ๋ชจ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Œ€์‹ , API ํ˜ธ์ถœ์„ ํ†ตํ•ด ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค์— ์ปดํ“จํŒ… ๋ถ€๋‹ด์„ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ฃ . Node.js๋Š” ๋น„๋™๊ธฐ API ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ œ3์ž ์„œ๋ฒ„(์˜ˆ: ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค, ์™ธ๋ถ€ API)์— ์ž‘์—…์„ ์œ„์ž„ํ•˜๊ณ , ์‹ค์ œ ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋Š” ์™ธ๋ถ€์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, Node.js ์„œ๋ฒ„๋Š” ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ๊ณผ API ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋˜๊ณ , ์ง์ ‘์ ์ธ ์ปดํ“จํŒ… ํŒŒ์›Œ๋Š” ์™ธ๋ถ€์—์„œ ์ œ๊ณต๋ฐ›๋Š” ๊ตฌ์กฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

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

 

3. libuv์˜ ์—ญํ• ๊ณผ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜

Node.js์˜ ๋น„๋™๊ธฐ ์„ฑ๋Šฅ์€ libuv ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋•๋ถ„์— ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. libuv๋Š” ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ๋น„๋™๊ธฐ I/O ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜์—ฌ, Node.js๊ฐ€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๋ฉด์„œ๋„ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. Node.js๋Š” ์ „ํ†ต์ ์ธ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฉ์‹ ๋Œ€์‹ , ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์—์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ž‘์—…, ๋„คํŠธ์›Œํฌ ์š”์ฒญ, ํƒ€์ด๋จธ ๋“ฑ ๋‹ค์–‘ํ•œ I/O ์ž‘์—…์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ง์ ‘์ ์ธ ์“ฐ๋ ˆ๋“œ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ณ , ๊ฐ„ํŽธํ•˜๊ฒŒ ๋น„๋™๊ธฐ ํ•จ์ˆ˜, ์ฝœ๋ฐฑ, Promise, async/await ํŒจํ„ด์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

libuv๋Š” ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ผ๋ถ€ ๋ธ”๋กœํ‚น ์ž‘์—…์˜ ๊ฒฝ์šฐ ๋‚ด๋ถ€ ์“ฐ๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , I/O ์ž‘์—…์ด ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋†’์€ ํšจ์œจ์„ฑ์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๋‚ด๋ถ€์ ์œผ๋กœ ์“ฐ๋ ˆ๋“œ ํ’€์„ ํ†ตํ•ด ๋ธ”๋กœํ‚น ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ด€๋ฆฌ์˜ ๋ถ€๋‹ด ์—†์ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ง๊ด€์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ฑ๋Šฅ๊ณผ ์ƒ์‚ฐ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Node.js ์•„ํ‚คํ…์ฒ˜

 

 

4. libuv์˜ ์Šค๋ ˆ๋“œ ํ’€

๊ธฐ๋ณธ์ ์œผ๋กœ Libuv์˜ ์Šค๋ ˆ๋“œ ํ’€์€ 4๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‹œ์Šคํ…œ์—์„œ I/O ์ž‘์—…์ด ๊ทธ๋‹ค์ง€ ๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์„ ์ž์ฃผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, I/O ์ž‘์—…์ด ๋งŽ์„ ๊ฒฝ์šฐ์—๋Š” ์Šค๋ ˆ๋“œ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‹œ์Šคํ…œ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ ๋” ๋งŽ์€ ๋ณ‘๋ ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก UV_THREADPOOL_SIZE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ ํ’€์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UV_THREADPOOL_SIZE=8 node app.js
 

 

 

 

5. ๋น„๋™๊ธฐ I/O ์ž‘์—…๊ณผ ์Šค๋ ˆ๋“œ ํ’€์˜ ๊ด€๊ณ„

Node.js๋Š” ๋น„๋™๊ธฐ I/O ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ libuv์˜ ์Šค๋ ˆ๋“œ ํ’€์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋ชจ๋“  ๋น„๋™๊ธฐ ์ž‘์—…์ด ์Šค๋ ˆ๋“œ ํ’€์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๊ฐ™์€ ์ž‘์—…์€ ์ปค๋„์˜ ๋น„๋™๊ธฐ I/O ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

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

 

๊ทธ๋Ÿฌ๋‚˜ CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…(์˜ˆ: ๋ณต์žกํ•œ ๊ณ„์‚ฐ, ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ)์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, Node.js์˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—์„œ๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” Worker Threads๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CPU ์ž‘์—…์„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด CPU ์‚ฌ์šฉ์ด ๋งŽ์€ ์ž‘์—…๋„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ, Node.js์˜ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์• ์ดˆ์— CPU ๋ฐ”์šด๋“œ ์ž‘์—…์„ ๋งŽ์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์„œ๋ฒ„๋ผ๋ฉด, ๋‹ค๋ฅธ ์–ธ์–ด(์˜ˆ: C++, Go, Rust)๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

6. ์Šค๋ ˆ๋“œ ํ’€์„ ๋Š˜๋ ธ์„ ๋•Œ ์ด์ ์ด ์žˆ๋Š” ์ž‘์—…์˜ ๊ตฌ๋ถ„

1. ์ œ3์ž API ํ˜ธ์ถœ ์ž‘์—… (์˜ˆ: ํด๋ผ์šฐ๋“œ API ํ˜ธ์ถœ)

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

2. CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—… (์˜ˆ: ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋ณต์žกํ•œ ๊ณ„์‚ฐ)

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

3. ๋‚ด๋ถ€ I/O ์ž‘์—… (์˜ˆ: ํŒŒ์ผ ์‹œ์Šคํ…œ, DNS ์กฐํšŒ ๋“ฑ)

  • ์Šค๋ ˆ๋“œ ํ’€ ์˜ํ–ฅ ์žˆ์Œ: ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ์ด๋‚˜ ๋ธ”๋กœํ‚น I/O ์ž‘์—…์€ libuv์˜ ์Šค๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ํ’€์„ ๋Š˜๋ฆฌ๋ฉด ์ด๋Ÿฌํ•œ ์ž‘์—…๋“ค์„ ๋” ๋งŽ์ด ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด, ํŒŒ์ผ ์ž…์ถœ๋ ฅ์ด๋‚˜ DNS ์กฐํšŒ ์ž‘์—…์„ ๋งŽ์ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์Šค๋ ˆ๋“œ ํ’€์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ ๋ธ”๋กœํ‚น I/O ์ž‘์—…์„ ๋” ๋น ๋ฅด๊ฒŒ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ I/O์™€ ๊ฐ™์€ ์ž‘์—…์ด๋‚˜ CPU ๋ฐ”์šด๋“œ ์ž‘์—…์—์„œ๋Š” ์Šค๋ ˆ๋“œ ํ’€์„ ๋Š˜๋ ค๋„ ์„ฑ๋Šฅ์ƒ์˜ ํฐ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

 

๊ฒฐ๋ก 

Node.js๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์ž„์—๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์„ ํ†ตํ•ด ๋†€๋ผ์šด ๋™์‹œ์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” libuv์˜ ์ด๋ฒคํŠธ ๋ฃจํ”„์™€ ์Šค๋ ˆ๋“œ ํ’€ ๋•๋ถ„์ด๋ฉฐ, ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์€ ๋ธ”๋กœํ‚น I/O ์ž‘์—…์—์„œ ํฐ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ž‘์—…์ด ์Šค๋ ˆ๋“œ ํ’€์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋„คํŠธ์›Œํฌ I/O๋‚˜ CPU ์ง‘์•ฝ์ ์ธ ์ž‘์—…์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์Šค๋ ˆ๋“œ ํ’€์˜ ํฌ๊ธฐ ์กฐ์ •๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Worker Threads๋‚˜ ์Šค์ผ€์ผ ์•„์›ƒ ์ „๋žต์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•