[Node.js] Node.js ๊ธฐ์ดˆ

2022. 4. 6. 08:00ใ†Back-End ์ž‘์—…์‹ค/Node.js

728x90
๋ฐ˜์‘ํ˜•

 

 

 

 

๐Ÿ—‚ ๋ชฉ์ฐจ

โ— [Node.js] Node.js ๊ธฐ์ดˆ
โ— [JavaScript] ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
โ—[Web] URL์˜ ์ดํ•ด

 

 

 

 

 

 

 

๐Ÿš€ Node.js

    ๐Ÿ”ฝ  ๊ฐœ์š”

 

Node.js๋Š” Chrome V8 JavaScript Engine์œผ๋กœ Build๋œ JavaScript Runtime.

 

Node.js๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ JavaScript Application์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , Server๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

โ— Node.js๋Š” `JavaScript`๋ฅผ Server์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  `์†Œํ”„ํŠธ์›จ์–ด ํ”Œ๋žซํผ`์ด๋‹ค.
โ— Node.js๋Š” `V8`์ด๋ผ๋Š” `JavaScript` Engine ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” `JavaScript Runtime(ํ™˜๊ฒฝ)`์ด๋‹ค.
โ— Node.js๋Š” `Server Side Script Language`๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ(ํ™˜๊ฒฝ)์ด๋‹ค.
โ— Node.js๋Š” Web Serve์™€ ๊ฐ™์ด ํ™•์žฅ์„ฑ ์žˆ๋Š” `Network Program`์„ ์ œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.

Node.js๋Š” `JavaScript`๋ฅผ ์ด์šฉํ•˜์—ฌ Non-blocking I/O์™€ ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ Event loop์„ ํ†ตํ•œ ๋†’์€ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๋‚ด์žฅ HTTP Server Library๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์–ด Web Server์—์„œ `Apache` ๋“ฑ์˜ ๋ณ„๋„ Software ์—†์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•œ Web Server์˜ ๋™์ž‘์— ์žˆ์–ด ๋” ๋งŽ์€ ํ†ต์ œ์—์„œ ๋ฒ—์–ด๋‚˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  ์‚ฌํ•ญ
JavaScript๋ž€?

โ— JavaScript๋Š” C/C++, Java์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด.
โ— JavaScript๋Š” ๋…๋ฆฝ์ ์ธ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ Script ์–ธ์–ด.
    - Script ์–ธ์–ด๋Š” ํŠน์ • ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ ๋™์ž‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ € ํ”„๋กœ๊ทธ๋žจ ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ํŠน์ง•.
    - ์ฆ‰, ์›น ๋ธŒ๋ผ์šฐ์ €(ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ, ์ต์Šคํ”Œ๋กœ๋Ÿฌ, ํŒŒ์ด์–ดํญ์Šค ๋“ฑ)๊ฐ€ ์—†์œผ๋ฉด ์ด์šฉํ•  ์ˆ˜ ์—†์Œ.

Node.js๋ฅผ ์ด์šฉํ•˜๋Š” ์ด์œ 
โ— JavaScript๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋…๋ฆฝ์‹œํ‚ค๊ธฐ ์œ„ํ•ด Node.js๋ฅผ ์„ค์น˜ํ•˜๊ฒŒ ๋˜๋ฉด Terminal(์œˆ๋„์šฐ CMD ๋“ฑ)์—์„œ Node.js๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
   - ๋‹จ, JavaScript์—์„œ ๋ถ„๋ฆฌ๋œ ์–ธ์–ด์ฒด๊ณ„๋กœ ๋ฌธ๋ฒ•์€ ๋™์ผ.
โ— Node.js๋ฅผ ์ด์šฉํ•˜์—ฌ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ๋ฌด๊ด€ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, Server๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
   - ์ด์ „๊นŒ์ง€ Server-Clinet Web Site๋ฅผ ๋งŒ๋“ค ๋•Œ ์›น์—์„œ ํ‘œ์‹œ๋˜๋Š” ๋ถ€๋ถ„์€ JavaScript๋ฅผ ์ด์šฉํ•˜์—ฌ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์œผ๋ฉฐ, Server๋Š” Java, Python ๋“ฑ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค์—ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, Node.js๋กœ ์ธํ•˜์—ฌ `ํ•˜๋‚˜์˜ ์–ธ์–ด๋กœ ์ „์ฒด ์›น ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.`

 

Node.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ‘์—์„œ ์ด์•ผ๊ธฐํ•  Single Thread, Non-Blocking Model์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— I/O ์š”์ฒญ์ด ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ฑ„ํƒํ•˜๋ฉด ์ข‹์€ ๊ฒƒ์ด์—์š”.

ํ•˜.์ง€.๋งŒ Node๋Š” CPU ๋ถ€ํ•˜๊ฐ€ ํฐ ์ž‘์—…์—๋Š” ์ด์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ด์—์š”.

๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๋Š” Code๋Š” ๋ชจ๋‘ Thread ํ•˜๋‚˜์—์„œ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— Code๊ฐ€ CPU ์—ฐ์‚ฐ์„ ๋งŽ์ด ์š”๊ตฌํ•˜๋ฉด Thread ํ•˜๋‚˜๊ฐ€ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์ด์—์š”.

์ฆ‰, ๊ฐœ์ˆ˜๋Š” ๋งŽ์ง€๋งŒ ํฌ๊ธฐ๋Š” ์ž‘์€ Data๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฃผ๊ณ  ๋ฐ›๋Š”๋ฐ Node.js๋Š” ์ ํ•ฉํ•œ ๊ฒƒ์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด Network, Data Base, Disk ์ž‘์—…๊ณผ ๊ฐ™์€ I/O ์ž‘์—…์— ํŠนํ™” ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์—ฌ๊ธฐ์— ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… Application, ์ฃผ์‹ Chart๋„ ํฌํ•จ์ธ ๊ฒƒ์ด์—์š”.

์ •๋ฆฌํ•˜์ž๋ฉด

Node.js ์žฅ์ ์€ Multi Thread ๋ฐฉ์‹์— ๋น„ํ•ด ์ ์€ ์ปดํ“จํ„ฐ ์ž์›์„ ์ด์šฉํ•˜๊ณ , I/O ์ž‘์—…์ด ๋งŽ์€ ์„œ๋ฒ„๋กœ ์ ํ•ฉํ•œ ๊ฒƒ์ด์—์š”. ๋˜ํ•œ, Web Server๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ๋ณ„๋„์˜ Web Server๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , JavaScript๋ฅผ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— `JSON` ํ˜•์‹๊ณผ ์‰ฝ๊ฒŒ ํ˜ธํ™˜๋˜๋Š” ์žฅ์ ์„ ๊ฐ€์ง„ ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ”ฝ  JavaScript Runtime

        ๐Ÿ“ฆ ๊ฐœ์š”

Runtime์ด๋ž€? ํŠน์ • ์–ธ์–ด๋กœ ๋งŒ๋“  `ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ™˜๊ฒฝ`์„ ๋งํ•˜๋Š” ๊ฒƒ์ด์—์š”.

Node.js๋Š” JavaScript๋ฅผ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” JavaScript ์‹คํ–‰๊ธฐ์ธ ๊ฒƒ์ด์—์š”.

๊ตฌ๊ธ€์€ 2008๋…„ V8 Engine์„ ์ด์šฉํ•œ ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ถœ์‹œํ–ˆ๊ณ , V8 Engine์€ ๋‹ค๋ฅธ JavaScript Engine๊ณผ ๋‹ฌ๋ฆฌ ๋งค์šฐ ๋นจ๋ผ Ryan Dahl(๋ผ์ด์–ธ ๋‹ฌ)์€ 2009๋…„ V8 Engine ๊ธฐ๋ฐ˜ Node Project๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ์„ธ์ƒ์— ๋‚˜์˜จ ๊ฒƒ์ด์—์š”.

 

 

 

 

 

    ๐Ÿ”ฝ  Event ๊ธฐ๋ฐ˜

Node.js๋Š” V8๊ณผ ๋”๋ถˆ์–ด `libuv`๋ผ๋Š” Library๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด Library๋Š” Node์˜ ํŠน์„ฑ์ธ `์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜`, `๋…ผ ๋ธ”๋กœํ‚น I/O Model`์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

Event-driven(์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜)์ด๋ž€? ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•˜๋Š” ๊ฒƒ์ด์—์š”.
์ฆ‰, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ๋Š” ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๋ฌด์—‡์„ ํ• ์ง€ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•˜๊ณ , ์ด๋ฅผ ์ด๋ฒคํŠธ ๋ฆฌ์Šคํ„ฐ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•œ ๋’ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฆฌ์Šค๋„ˆ์— ๋“ฑ๋กํ•ด๋‘” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ์ด๋ฒคํŠธ๊ฐ€ ๋๋‚œ ๋’ค Node.js๋Š” ๋‹ค์Œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ์‹์ธ ๊ฒƒ์ด์—์š”.

 

 

 

 

    ๐Ÿ”ฝ  Event Loop

Event Loop(์ด๋ฒคํŠธ ๋ฃจํ”„)๋Š” ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๊ฐ€ ๋™์‹œ์— ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ• ์ง€์— ๋Œ€ํ•ด ํŒ๋‹จํ•˜๋Š” ์นœ๊ตฌ์ธ ๊ฒƒ์ด์—์š”.

Node.js๋Š” ์ด๋ฒคํŠธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— Loop(๋ฃจํ”„)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด์—์š”.

 

๋ฐ˜์‘ํ˜•

 

 

 

 

    ๐Ÿ”ฝ  Non-Blocking I/O

Event Loop๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.
์ด๋•Œ, ์ž‘์—…์—๋Š” ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…๊ณผ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์—†๋Š” ์ž‘์—…์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

ํŠนํžˆ ํŒŒ์ผ ์‹œ์Šคํ…œ ์ ‘๊ทผ, ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ ์š”์ฒญ ์ž‘์—…์€ ์ž…๋ ฅ(Input) / ์ถœ๋ ฅ(Output)์˜ ์ผ์ข…์ด๋ฉฐ, ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ํ•  ๋•Œ, Node.js๋Š” ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ Blocking์„ ๋งŒ๋“ค์ง€ ์•Š๊ฒŒ Non-Blocking ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๐Ÿ’ก์ฐธ๊ณ  ์‚ฌํ•ญ
๋น„๋™๊ธฐ๋ž€? ์ด์ „ ์ž‘์—…์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ , ๋™์‹œ์— ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹.
๋™๊ธฐ๋ž€? ์ด์ „ ์ž‘์—…์ด ๋๋‚˜์•ผ๋งŒ ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹.

 

ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋‹น์‹œ ๋‹น์žฅ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ(๋™๊ธฐ -> ๋ธ”๋กœํ‚น) ์ผ๋‹จ, ์–ด๋Š ๊ณณ์— ์Œ“์•„ ๋†“๊ณ , ๋™์‹œ์— ์š”์ฒญ์„ ์ฒ˜๋ฆฌ(๋น„๋™๊ธฐ -> ๋…ผ ๋ธ”๋กœํ‚น) ์š”์ฒญ์ด ์™„๋ฃŒ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌ(์Šคํƒ ์ด์šฉ)ํ•˜๋Š” ๋ฐฉ์‹์ธ ๊ฒƒ์ด์—์š”.

 

 

 

 

    ๐Ÿ”ฝ  Single Thread

Event ๊ธฐ๋ฐ˜, ๋…ผ ๋ธ”๋กœํ‚น ๋ชจ๋ธ๊ณผ ๋”๋ถˆ์–ด Node.js๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ `Single Thread`์ธ ๊ฒƒ์ด์—์š”.

JavaScript Code๋Š” ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์—†๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” `Single Thread` ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก์ฐธ๊ณ  ์‚ฌํ•ญ
ํ”„๋กœ์„ธ์Šค : ์šด์˜์ฒด์ œ์—์„œ ํ• ๋‹นํ•˜๋Š” ์ž‘์—… ๋‹จ์œ„ Node.js, Web Browser์™€ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์€ ๊ฐœ๋ณ„์  ํ”„๋กœ์„ธ์Šค์ธ๋ฐ, ํ”„๋กœ์„ธ์Šค ๊ฐ„์—๋Š” Memory ๋“ฑ์˜ ์ž์›์„ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

 

Node.js๋Š” Single Thread, Non-Blocking Model์ด๊ธฐ ๋•Œ๋ฌธ์— Single Thread๊ฐ€ ํ˜ผ์ž์„œ ์ผ์„ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ, ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ ์ˆœ์„œ๊ฐ€ ์•„๋‹Œ Non-Blocking ๋ฐฉ์‹์œผ๋กœ ์ด ์ „ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํŠน์ธ์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•