Node.js๋ž€?

์ด์• ์˜นยท2022๋…„ 10์›” 21์ผ
1

Node.js

๋ชฉ๋ก ๋ณด๊ธฐ
1/32

๐Ÿ“ Node.js๋ž€?

Node.js์˜ ์˜๋ฏธ

Node.js๋Š” Chrome V8 Javascript ์—”์ง„์œผ๋กœ ๋นŒ๋“œ์—… ๋œ Javascript ๋Ÿฐํƒ€์ž„์ด๋‹ค.
ํ™•์žฅ์„ฑ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ์ž‘์„ฑ์–ธ์–ด๋กœ Javascript๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด Node.js๋Š” ์›น์„œ๋ฒ„๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๊ณ ,
JavaScript๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์„œ๋ฒ„์—์„œ JavaScript๊ฐ€ ์ž‘๋™๋˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ผ์ข…์˜ ์‹คํ–‰ํ™˜๊ฒฝ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

Node.js์˜ ํŠน์ง•

1) ์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ๋™๊ธฐ๋ฐฉ์‹(Blocking I/O)

  • ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ request๋ฅผ ๋ฐ›์œผ๋ฉด ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์‘๋‹ต ์ „์†ก

  • ๊ธฐ์กด ์—…๋ฌด ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋˜ ๋‹ค๋ฅธ request๊ฐ€ ์žˆ์œผ๋ฉด ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—…๋ฌด ์ฒ˜๋ฆฌ

  • ๋™์‹œ request๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ๋งŽ์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•ด์„œ ์„œ๋ฒ„ ๊ณผ๋ถ€ํ™”

2) ๋‹จ์ผ์“ฐ๋ ˆ๋“œ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ๋ฐฉ์‹(Non-Blocking I/O)

  • ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ request๋ฅผ ๋ฐ›์œผ๋ฉด ๋ฐ”๋กœ ๋‹ค์Œ ์ฒ˜๋ฆฌ์— ์š”์ฒญ์„ ๋ณด๋‚ด๋†“๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋‹ค๊ฐ€ ๋จผ์ € ์š”์ฒญํ•œ ์ž‘์—…์ด ๋๋‚˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„์„œ ์‘๋‹ต์„ ๋ณด๋ƒ„

  • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ด๋ฒคํŠธ๋Š” ํด๋ฆญ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ๋“ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ

  • ์—ฌ๊ธฐ์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ ๋ฌด์—‡์„ ํ• ์ง€ ๋ฏธ๋ฆฌ ๋“ฑ๋ก ํ•ด ๋‘๋Š”๊ฒƒ์„ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•œ๋‹ค๊ณ  ํ‘œํ˜„

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

  • ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๊ฐ€ ์—†๊ฑฐ๋‚˜ ๋ฐœ์ƒํ–ˆ๋˜ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค ์ฒ˜๋ฆฌํ•˜๋ฉด ๋‹ค์Œ ์ด๋ฒคํŠธ ๋ฐœ์ƒ๊นŒ์ง€ ๋Œ€๊ธฐ

์ž์„ธํ•œ ๋‚ด์šฉ์€ Node.js ์ดํ•ดํ•˜๊ธฐ_์ด๋ฒคํŠธ ๋ฃจํ”„

3) Javascript ์–ธ์–ด ์‚ฌ์šฉ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ํ†ตํ•ด Front ๋ฐ Back ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ

4) ๋…ผ๋ธ”๋กœํ‚น I/O

์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด, ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋ณด๋‚ด๊ณ  ๊ทธ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํƒœ์Šคํฌํ๋ฅผ ๊ฑฐ์ณ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์˜ฌ๋ผ์˜ค๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ์‹์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๋…ผ๋ธ”๋กœํ‚น ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์‰ฝ๊ฒŒ ๋งํ•ด, ์ด์ „ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฉˆ์ถ”์ง€์•Š๊ณ  ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
function longRunningTask(){
    console.log("์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…");
}
console.log("์‹œ์ž‘");
setTimeout(longRunningTask,0);
console.log("๋‹ค์Œ ์ž‘์—…");

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ ์‹œ, ๊ฒฐ๊ณผ๋Š” ์‹œ์ž‘ -> ๋‹ค์Œ ์ž‘์—… -> ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ์ˆœ์œผ๋กœ ์ด๋ค„์ง„๋‹ค.

์—ฌ๊ธฐ์„œ SetTimeOut(์ฝœ๋ฐฑ,0)์€ ์ฝ”๋“œ๋ฅผ ๋…ผ๋ธ”๋กœํ‚น์œผ๋กœ ๋งŒ๋“ค๊ธฐ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.

5) ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ

  • ์Šค๋ ˆ๋“œ : ์ปดํ“จํ„ฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์†

  • ํ•œ ๋ฒˆ์— ํ•œ๊ฐ€์ง€ ์ผ๋ฐ–์— ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ, ์–ด๋– ํ•œ ์ž‘์—…์—์„œ ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•  ์‹œ ๋‹ค์Œ ์ผ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค.


Node.js์˜ ์žฅ์ 

  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ(Single-Thread)์˜ ๋…ผ ๋ธ”๋กœํ‚น(Non-blocking I/O) ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ๋†’์€ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ๊ฐ€์ง„๋‹ค.

  • ๋‚ด์žฅ HTTP ์„œ๋ฒ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด Apache๋“ฑ์˜ ๋ณ„๋„ ์†Œํ”„ํŠธ์›จ์–ด ์—†์ด ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Javascript ์–ธ์–ด๋กœ Front-end ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Back-end ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋˜ํ•œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์ƒ์‚ฐ์„ฑ์ด ๋†’๊ณ  ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ์ค„์–ด๋“ ๋‹ค.

  • ๋‹ค์–‘ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(npm:Node Package Manager)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ(ํŒจํ‚ค์ง€)์„ ์ œ๊ณตํ•œ๋‹ค.

Node.js์˜ ๋‹จ์ 

  • ๋ชจ๋“  API๋Š” ๋น„๋™๊ธฐ ๊ธฐ๋ฐ˜์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋ผ ์„œ๋ฒ„ ๋กœ์ง์ด ๋ณต์žกํ•œ ๊ฒฝ์šฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋Šช์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

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

  • ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ๋งŒ ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์„ธ์…˜์„ ๊ณต์œ ํ•  ๊ฒฝ์šฐ redis์™€ ๊ฐ™์€ ๋ถ€๊ฐ€์  ์ธํ”„๋ผ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Node.js ์‚ฌ์šฉ ๋ฐฉํ–ฅ

  • ํ•˜๋‚˜์˜ ์–ธ์–ด๋กœ Back/Front ๊ฐœ๋ฐœ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  • ๊ฐ„๋‹จํ•œ ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ์„œ๋น„์Šค

  • ์ž…์ถœ๋ ฅ(I/O)์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์ž‘๊ณ  ๋นˆ๋ฒˆํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค

  • ๋น„๋™๊ธฐ ๋ฐฉ์‹์ด ์–ด์šธ๋ฆฌ๋Š” ์„œ๋น„์Šค

  • ๋น ๋ฅด๊ฒŒ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

Node์™€ ์„œ๋ฒ„

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

์„œ๋ฒ„๋ž€, ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์— ์ •๋ณด๋‚˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปดํ“จํ„ฐ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์˜๋ฏธํ•œ๋‹ค.
(์—ฌ๊ธฐ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ฃผ์ฒด๋กœ, ๋ธŒ๋ผ์šฐ์ €์ผ์ˆ˜๋„ ์žˆ๊ณ  ๋ชจ๋ฐ”์ผ ์•ฑ, ์„œ๋ฒ„ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.)


๐Ÿ“ JavaScript์™€ Node.js์˜ ์ฐจ์ด์ 

JavaScript๋ž€?

'์›นํŽ˜์ด์ง€์— ์ƒ๋™๊ฐ์„ ๋ถˆ์–ด๋„ฃ๊ธฐ ์œ„ํ•ด' ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ,
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์Šคํฌ๋ฆฝํŠธ(script)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
์Šคํฌ๋ฆฝํŠธ๋Š” ์›นํŽ˜์ด์ง€์˜ HTML ์•ˆ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ , ์›น ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž๋™ ์‹คํ–‰๋œ๋‹ค.

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

ํ•˜์ง€๋งŒ Node.js๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ Javascript๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋…๋ฆฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด, ํ„ฐ๋ฏธ๋„ํ”„๋กœ๊ทธ๋žจ(cmd ๋“ฑ)์—์„œ Node.js๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋˜ํ•œ, Node.js๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ ์„œ๋ฒ„๋˜ํ•œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
์ด์ „๊นŒ์ง€๋Š” Server-Client ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ์›น์—์„œ ํ‘œ์‹œ๋˜๋Š” ๋ถ€๋ถ„์€ JavaScript๋กœ,
์„œ๋ฒ„๋Š” Reby, Java๋“ฑ์˜ ์–ธ์–ด๋ฅผ ์จ์„œ ๊ตฌํ˜„ํ•ด์•ผํ–ˆ๋Š”๋ฐ, Node.js๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ JavaScript ํ•œ ๊ฐ€์ง€ ๋งŒ์œผ๋กœ ์ „์ฒด ์›นํŽ˜์ด์ง€ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

๋ฌผ๋ก  ๋‹จ์ˆœ ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” Javascript๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
์ฑ„ํŒ…์ด๋‚˜ ๊ฒŒ์ž„๋“ฑ์˜ ์‹ค์‹œ๊ฐ„ ๊ธฐ๋Šฅ์„ ๋„ฃ์„๋•Œ๋‚˜, ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ๋“ฑ์„ ๋„ฃ์„๋•Œ๋Š” Node.js๋ฅผ ์ด์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.(Node.js๋ฅผ ์ด์šฉํ•ด DB ๊ตฌํ˜„ ๊ฐ€๋Šฅ)

JavaScriptNode.js
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ธŒ๋ผ์šฐ์ € ๋ฐ–์—์„œ ๋™์ž‘ํ•˜๋Š” Javascript ๋Ÿฐํƒ€์ž„
๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ๋™์ž‘๋ฐ์Šคํฌํƒ‘์—์„œ ๋™์ž‘
Client์— ๋Œ€ํ•œ ๊ฐœ๋ฐœ์›น์„œ๋ฒ„ ๊ตฌ์ถ•

๐Ÿ‘€ ์ถœ์ฒ˜

profile
์•ˆ๋…•ํ•˜์„ธ์š”

0๊ฐœ์˜ ๋Œ“๊ธ€