2022. 4. 6. 08:00ใBack-End ์์ ์ค/Node.js
๐ ๋ชฉ์ฐจ
โ [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 ๋ฐฉ์์ผ๋ก ์ด ์ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ์ง ์๊ณ , ๋ค์ ์์ ์ ์ํํ ์ ์๊ฒ ํด์ฃผ๋ ํน์ธ์ด ์๋ ๊ฒ์ด์์.
'Back-End ์์ ์ค > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Node.js][Nest.js] Configuration (์ค์ ) (0) | 2022.04.09 |
---|---|
[Node.js][Nest.js] ์ ํจ์ฑ ๊ฒ์ฌ์ Data ํ์ ๋ณํํ๊ธฐ - Pipe (0) | 2022.04.09 |
[BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ : DB ์ฐ๊ฒฐ(Sequelize) (0) | 2022.04.07 |
[BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ : DB ์ฐ๊ฒฐ (2) | 2022.04.07 |
[BackEnd][Node.js] Express.js - ์ด๊ธฐ ๊ตฌ์ฑ (0) | 2022.04.07 |