wiki:glossary:server_operations:nodejs
μ°¨μ΄
λ¬Έμμ μ νν λ ν μ¬μ΄μ μ°¨μ΄λ₯Ό 보μ¬μ€λλ€.
μμͺ½ μ΄μ νμ΄μ ν | |||
wiki:glossary:server_operations:nodejs [2025/07/30 06:43] β λ°κΉ₯ νΈμ§ 127.0.0.1 | wiki:glossary:server_operations:nodejs [2025/08/03 02:18] (νμ¬) β syjang0803 | ||
---|---|---|---|
μ€ 1: | μ€ 1: | ||
====== π’ Node.js ====== | ====== π’ Node.js ====== | ||
- | Node.jsλ JavaScript | + | Node.jsλ JavaScriptλ₯Ό μ¬μ©νμ¬ μΉ μλ²λ λ€μν λ€νΈμν¬ |
- | ===== π μ μ ===== | + | ===== 1. μ μ ===== |
- | **Node.js**λ Chrome V8 JavaScript μμ§μ κΈ°λ°μΌλ‘ | + | **Node.js**λ Chromeμ V8 JavaScript μμ§μ κΈ°λ°μΌλ‘ |
- | ===== π― μ£Όμ νΉμ§ ===== | + | Node.jsλ **μ΄λ²€νΈ κΈ°λ°(Event-driven)**, |
- | **1. μ΄λ²€νΈ κΈ°λ° (Event-driven)**Β | + | ===== 2. μ£Όμ νΉμ§ ===== |
- | - λΉλκΈ° νλ‘κ·Έλλ°μ μ§μνμ¬ λμμ λ§μ | + | |
- | - μ½λ°± ν¨μλ₯Ό ν΅ν΄ μ΄λ²€νΈ μ²λ¦¬κ° κ°λ₯ν©λλ€. | + | |
- | **2. λ ΌλΈλ‘νΉ I/O**Β | + | ----Β |
- | - νμΌ μμ€ν μ κ·Όμ΄λ λ€νΈμν¬ μμ² μ λ€λ₯Έ μμ μ μ°¨λ¨νμ§ μμ΅λλ€.Β | + | ==== 1) μ΄λ²€νΈ κΈ°λ° (Event-driven) ====Β |
- | - λμ μ±λ₯κ³Ό νμ₯μ±μ μ 곡ν©λλ€. | + | Node.jsλ 'μ΄λ²€νΈ'κ° λ°μνλ©΄ 미리 μ μλ ' |
- | **3. ν¬λ‘μ€ νλ«νΌ**Β | + | |
- | - Windows, macOS, Linux λ± λ€μν μ΄μ체μ μμ μ€νλ©λλ€.Β | + | * **μ₯μ **: λΉλκΈ° νλ‘κ·Έλλ°μ μ§μνμ¬ λμμ λ§μ μμ²μ ν¨μ¨μ μΌλ‘ μ²λ¦¬ν μ μμ΅λλ€. μ΄λ μλ²μ μλ΅ μλλ₯Ό ν₯μμν€κ³ , |
- | - λμΌν μ½λλ‘ μ¬λ¬ νλ«νΌμ μ§μν μ μμ΅λλ€. | + | |
- | ===== ποΈ κΈ°λ³Έ ꡬ쑰 ===== | + | ----Β |
+ | ==== 2) λ ΌλΈλ‘νΉ I/O (Non-blocking I/O) ====Β | ||
+ | ' | ||
- | **κ°λ¨ν HTTP μλ² | + | |
- | <code javascript> | + | |
- | const http = require(' | + | |
- | const server = http.createServer((req, | + | ----Β |
- | res.writeHead(200, | + | ==== 3) ν¬λ‘μ€ νλ«νΌ (Cross-platform) ====Β |
- | res.end(' | + | Node.jsλ νΉμ μ΄μ체μ μ μ’ μλμ§ μκ³ λ€μν νκ²½μμ μ€νλ μ μμ΅λλ€.Β |
+ | Β | ||
+ | * **μ₯μ **: κ°λ°μλ Windows, macOS, Linux λ± μ΄λ€ μ΄μ체μ μμλ λμΌν Node.js μ½λλ₯Ό μμ±νκ³ μ€νν μ μμ΅λλ€. μ΄λ κ°λ° λ° λ°°ν¬ κ³Όμ μ κ°μννκ³ , | ||
+ | Β | ||
+ | ===== 3. 기본 ꡬ쑰 ===== | ||
+ | Β | ||
+ | Node.js μ ν리μΌμ΄μ μ ν΅μ¬μ μΈ λμ λ°©μμ μ΄ν΄νκΈ° μν λ κ°μ§ μμ λ₯Ό μ΄ν΄λ΄ λλ€.Β | ||
+ | Β | ||
+ | ----Β | ||
+ | ==== 1) κ°λ¨ν HTTP μλ² μμ ====Β | ||
+ | μΉ μλ²λ ν΄λΌμ΄μΈνΈ(μΉ λΈλΌμ°μ λ±)μ μμ²μ λ°μ μλ΅μ 보λ΄μ£Όλ μν μ ν©λλ€. λ€μ μ½λλ Node.jsλ‘ κ°μ₯ κΈ°λ³Έμ μΈ μΉ μλ²λ₯Ό λ§λλ λ°©λ²μ 보μ¬μ€λλ€.Β | ||
+ | Β | ||
+ | <file javascript> | ||
+ | const http = require(' | ||
+ | // μ΄ λͺ¨λμ μΉ μλ²λ₯Ό λ§λ€κ³ HTTP μμ²μ μ²λ¦¬νλ κΈ°λ₯μ μ 곡ν©λλ€.Β | ||
+ | Β | ||
+ | const server = http.createServer((req, | ||
+ | // | ||
+ | // | ||
+ | res.writeHead(200, | ||
+ | // ' | ||
+ | // ' | ||
+ | res.end(' | ||
+ | // ' | ||
}); | }); | ||
- | server.listen(3000, | + | server.listen(3000, |
- | console.log(' | + | // μ΄μ μΉ λΈλΌμ°μ μμ ' |
+ | // μμμ μ μν 'Hello World' μλ΅μ λ°μ μ μμ΅λλ€.Β | ||
+ | console.log(' | ||
}); | }); | ||
- | </code> | + | </file>Β |
+ | Β | ||
+ | * **μ€λͺ
**: μ΄ μ½λλ 3000λ² ν¬νΈμμ μμ²μ κΈ°λ€λ¦¬λ κ°λ¨ν μΉ μλ²λ₯Ό λ§λλλ€. ν΄λΌμ΄μΈνΈκ° μ΄ μλ²μ μ μνλ©΄ "Hello World" | ||
+ | Β | ||
+ | ----Β | ||
+ | ==== 2) λͺ¨λ μμ€ν ====Β | ||
+ | μ ν리μΌμ΄μ
μ κ·λͺ¨κ° 컀μ§μλ‘ μ½λλ₯Ό μ¬λ¬ νμΌλ‘ λλμ΄ κ΄λ¦¬νλ κ²μ΄ μ€μν΄μ§λλ€. Node.jsλ ' | ||
+ | Β | ||
+ | * **νμμ±**: | ||
+ | * **λμ μ리**:Β | ||
+ | * '' | ||
+ | * '' | ||
- | **λͺ¨λ μμ€ν
: | + | <file javascript> |
- | <code javascript> | + | // math.js νμΌ (λͺ¨λ λ΄λ³΄λ΄κΈ°)Β |
- | // λͺ¨λ λ΄λ³΄λ΄κΈ°Β | + | // μ΄ νμΌμ λ§μ κ³Ό λΊμ κΈ°λ₯μ μ 곡νλ λͺ¨λμ λλ€.Β |
- | module.exports = { | + | module.exports = { // ' |
add: (a, b) => a + b, | add: (a, b) => a + b, | ||
subtract: (a, b) => a - b | subtract: (a, b) => a - b | ||
}; | }; | ||
- | // λͺ¨λ κ°μ Έμ€κΈ°Β | + | // app.js νμΌ (λͺ¨λ κ°μ Έμ€κΈ° |
- | const math = require(' | + | // μ΄ νμΌμ μμμ λ§λ ' |
- | console.log(math.add(5, | + | const math = require(' |
- | </code> | + | // ' |
+ | console.log(math.add(5, | ||
+ | </file> | ||
- | ===== π¦ ν¨ν€μ§ κ΄λ¦¬ ===== | + | ===== 4. ν¨ν€μ§ κ΄λ¦¬ ===== |
- | **npm (Node Package Manager)**Β | + | Node.js |
- | - Node.jsμ κΈ°λ³Έ ν¨ν€μ§ | + | |
- | - μμ‘΄μ± κ΄λ¦¬μ μ€ν¬λ¦½νΈ μ€νμ λ΄λΉν©λλ€. | + | |
- | **package.json μμ :**Β | + | ----Β |
- | <code json> | + | ==== 1) npm (Node Package Manager) ====Β |
+ | '' | ||
+ | Β | ||
+ | * **μ£Όμ κΈ°λ₯**:Β | ||
+ | * | ||
+ | * | ||
+ | * | ||
+ | Β | ||
+ | ----Β | ||
+ | ==== 2) package.json μμ | ||
+ | '' | ||
+ | Β | ||
+ | <file json> | ||
{ | { | ||
- | " | + | " |
- | " | + | " |
- | " | + | " |
- | " | + | " |
- | " | + | " |
- | " | + | " |
- | " | + | " |
- | " | + | " |
}, | }, | ||
- | " | + | " |
- | " | + | " |
- | " | + | " |
}, | }, | ||
- | " | + | " |
- | " | + | // μ€μ λ°°ν¬ νκ²½μμλ νμνμ§ μμ μ μμ΅λλ€.Β |
+ | " | ||
} | } | ||
} | } | ||
- | </code> | + | </file> |
- | ===== π§ κ°λ° νκ²½ ===== | + | * **μ€λͺ
**: μ΄ νμΌμ νλ‘μ νΈμ λ©νλ°μ΄ν°λ₯Ό μ 곡νκ³ , |
- | **nodemon**Β | + | ===== 5. κ°λ° |
- | - νμΌ λ³κ²½μ κ°μ§νμ¬ μλμΌλ‘ μλ²λ₯Ό μ¬μμν©λλ€.Β | + | |
- | - κ°λ° | + | |
- | <code bash> | + | ν¨μ¨μ μΈ Node.js κ°λ°μ μν΄ μ μ©ν λꡬμ μ€μ λ°©λ²μ μμλ΄ λλ€.Β |
+ | Β | ||
+ | ----Β | ||
+ | ==== 1) nodemon ====Β | ||
+ | κ°λ° μ€μλ μ½λλ₯Ό μμ ν λλ§λ€ μλ²λ₯Ό κ»λ€κ° λ€μ μΌμΌ νλ λ²κ±°λ‘μμ΄ μμ΅λλ€. '' | ||
+ | Β | ||
+ | * **νμμ±**: | ||
+ | * **μ¬μ©λ²**: | ||
+ | <file bash> | ||
# nodemon μ€μΉ | # nodemon μ€μΉ | ||
+ | # ' | ||
npm install -g nodemon | npm install -g nodemon | ||
# κ°λ° μλ² μ€ν | # κ°λ° μλ² μ€ν | ||
+ | # ' | ||
nodemon app.js | nodemon app.js | ||
- | </code> | + | </file>Β |
+ | Β | ||
+ | ----Β | ||
+ | ==== 2) νκ²½ λ³μ κ΄λ¦¬ ====Β | ||
+ | μ ν리μΌμ΄μ μ λ°μ΄ν°λ² μ΄μ€ μ°κ²° μ 보, API ν€, ν¬νΈ λ²νΈ λ± νκ²½μ λ°λΌ λ¬λΌμ§κ±°λ λ―Όκ°ν μ 보λ₯Ό ν¬ν¨ν μ μμ΅λλ€. μ΄λ¬ν μ 보λ€μ μ½λ μμ μ§μ μμ±νλ κ²μ 보μμ μ’μ§ μμΌλ©°, νκ²½μ΄ λ°λ λλ§λ€ μ½λλ₯Ό μμ ν΄μΌ νλ λΆνΈν¨μ΄ μμ΅λλ€. **νκ²½ λ³μ**λ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°ν΄μ€λλ€.Β | ||
+ | Β | ||
+ | * **νμμ±**: | ||
+ | * **μ¬μ©λ²**: | ||
- | **νκ²½ λ³μ | + | <file javascript> |
- | <code javascript> | + | // dotenv ν¨ν€μ§λ₯Ό μ¬μ©νμ¬ .env νμΌμ μ μλ |
+ | // μ΄ μ½λλ λ³΄ν΅ μ ν리μΌμ΄μ μ κ°μ₯ μλ¨μ μμΉν©λλ€. | ||
require(' | require(' | ||
+ | // process.env κ°μ²΄λ₯Ό ν΅ν΄ νκ²½ λ³μμ μ κ·Όν μ μμ΅λλ€. | ||
+ | // λ§μ½ PORT νκ²½ λ³μκ° μ€μ λμ΄ μμ§ μμΌλ©΄ κΈ°λ³Έκ°μΌλ‘ 3000μ μ¬μ©ν©λλ€. | ||
const port = process.env.PORT || 3000; | const port = process.env.PORT || 3000; | ||
+ | // DATABASE_URL νκ²½ λ³μμ μ μ₯λ λ°μ΄ν°λ² μ΄μ€ μ°κ²° λ¬Έμμ΄μ κ°μ Έμ΅λλ€. | ||
const dbUrl = process.env.DATABASE_URL; | const dbUrl = process.env.DATABASE_URL; | ||
- | </code> | + | </file> |
- | ===== π νλ‘λμ λ°°ν¬ ===== | + | ===== 6. νλ‘λμ λ°°ν¬ ===== |
- | **PM2 μ¬μ©:**Β | + | κ°λ°μ΄ μλ£λ Node.js μ ν리μΌμ΄μ μ μ€μ μ¬μ©μλ€μ΄ μ κ·Όν μ μλλ‘ μλ²μ λ°°ν¬νλ κ²μ μ€μν κ³Όμ μ λλ€. λ°°ν¬ νκ²½μμλ μ ν리μΌμ΄μ μ΄ μμ μ μΌλ‘ κ³μ μ€νλλλ‘ κ΄λ¦¬νλ κ²μ΄ μ€μν©λλ€.Β |
- | <code bash> | + | Β |
+ | ----Β | ||
+ | ==== 1) PM2 μ¬μ© ====Β | ||
+ | '' | ||
+ | Β | ||
+ | * **νμμ±**: | ||
+ | * **μ£Όμ κΈ°λ₯**:Β | ||
+ | | ||
+ | * | ||
+ | * | ||
+ | Β | ||
+ | <file bash> | ||
# PM2 μ€μΉ | # PM2 μ€μΉ | ||
+ | # ' | ||
npm install -g pm2 | npm install -g pm2 | ||
# μ ν리μΌμ΄μ μμ | # μ ν리μΌμ΄μ μμ | ||
+ | # ' | ||
pm2 start app.js --name " | pm2 start app.js --name " | ||
# ν΄λ¬μ€ν° λͺ¨λ | # ν΄λ¬μ€ν° λͺ¨λ | ||
+ | # μλ²μ CPU μ½μ΄ μλ§νΌ μ컀 νλ‘μΈμ€λ₯Ό μμ±νμ¬ λ‘λ λ°Έλ°μ±μ μλμΌλ‘ μ²λ¦¬ν©λλ€. | ||
+ | # ' | ||
pm2 start app.js -i max | pm2 start app.js -i max | ||
- | </code> | + | </file> |
- | ===== π μ±λ₯ μ΅μ ν ===== | + | ===== 7. μ±λ₯ μ΅μ ν ===== |
- | **λ©λͺ¨λ¦¬ κ΄λ¦¬:**Β | + | Node.js μ ν리μΌμ΄μ μ μ±λ₯μ μ΅λν λμ΄μ¬λ¦¬κ³ μμ μ±μ ν보νκΈ° μν κΈ°λ²λ€μ μμλ΄ λλ€.Β |
- | <code javascript> | + | Β |
- | // κ°λΉμ§ 컬λ μ κ°μ μ€ν | + | ----Β |
+ | ==== 1) λ©λͺ¨λ¦¬ κ΄λ¦¬ ====Β | ||
+ | Node.jsλ JavaScriptλ₯Ό μ¬μ©νλ©°, | ||
+ | Β | ||
+ | | ||
+ | | ||
+ | Β | ||
+ | <file javascript> | ||
+ | // κ°λ° λλ λλ²κΉ
λͺ©μ μΌλ‘ | ||
+ | // μ€μ νλ‘λμ νκ²½μμλ κΆμ₯λμ§ μμ΅λλ€. V8 μμ§μ΄ μ΅μ μ μμ μ μνν©λλ€. | ||
if (global.gc) { | if (global.gc) { | ||
global.gc(); | global.gc(); | ||
} | } | ||
- | // λ©λͺ¨λ¦¬ μ¬μ©λ λͺ¨λν°λ§ | + | // νμ¬ Node.js νλ‘μΈμ€μ |
+ | // ' | ||
const used = process.memoryUsage(); | const used = process.memoryUsage(); | ||
console.log(`λ©λͺ¨λ¦¬ μ¬μ©λ: ${Math.round(used.heapUsed / 1024 / 1024)} MB`); | console.log(`λ©λͺ¨λ¦¬ μ¬μ©λ: ${Math.round(used.heapUsed / 1024 / 1024)} MB`); | ||
- | </code> | + | </file> |
- | **ν΄λ¬μ€ν° λͺ¨λ:**Β | + | ----Β |
- | <code javascript> | + | ==== 2) ν΄λ¬μ€ν° λͺ¨λ ====Β |
- | const cluster | + | Node.jsλ κΈ°λ³Έμ μΌλ‘ λ¨μΌ μ€λ λ(Single-threaded) λ°©μμΌλ‘ λμν©λλ€. μ΄λ νλμ CPU μ½μ΄λ§ μ¬μ©νμ¬ μμ
μ μ²λ¦¬νλ€λ μλ―Έμ
λλ€. νμ§λ§ μ΅μ μλ²λ λλΆλΆ μ¬λ¬ κ°μ CPU μ½μ΄λ₯Ό κ°μ§κ³ μμ΅λλ€. ' |
- | const numCPUs | + | |
- | if (cluster.isMaster) {Β | + | * **νμμ±**: |
- | // λ§μ€ν° νλ‘μΈμ€ | + | * **λμ μ리**: ' |
+ | Β | ||
+ | <file javascript> | ||
+ | const cluster = require(' | ||
+ | const numCPUs = require(' | ||
+ | Β | ||
+ | if (cluster.isMaster) { // νμ¬ νλ‘μΈμ€κ° λ§μ€ν° νλ‘μΈμ€μΈμ§ νμΈν©λλ€.Β | ||
+ | // λ§μ€ν° νλ‘μΈμ€: μ컀 νλ‘μΈμ€λ€μ μμ±νκ³ κ΄λ¦¬νλ μν μ ν©λλ€.Β | ||
+ | console.log(`λ§μ€ν° νλ‘μΈμ€ ${process.pid}κ° μ€ν μ€μ
λλ€.`); | ||
for (let i = 0; i < numCPUs; i++) { | for (let i = 0; i < numCPUs; i++) { | ||
- | cluster.fork(); | + | cluster.fork(); |
} | } | ||
+ | |||
+ | cluster.on(' | ||
+ | console.log(`μ컀 νλ‘μΈμ€ ${worker.process.pid}κ° μ’
λ£λμμ΅λλ€. λ€μ μμν©λλ€.`); | ||
+ | cluster.fork(); | ||
+ | }); | ||
} else { | } else { | ||
- | // μ컀 νλ‘μΈμ€Β | + | // μ컀 νλ‘μΈμ€: μ€μ μ ν리μΌμ΄μ μ½λλ₯Ό μ€ννλ μν μ ν©λλ€.Β |
- | require(' | + | console.log(`μ컀 νλ‘μΈμ€ ${process.pid}κ° μμλμμ΅λλ€.`); |
+ | require(' | ||
} | } | ||
- | </code> | + | </file> |
- | ===== π λλ²κΉ ===== | + | ===== 8. λλ²κΉ ===== |
- | **λ΄μ₯ λλ²κ±° μ¬μ©:**Β | + | μ ν리μΌμ΄μ
μ κ°λ°νλ€ λ³΄λ©΄ μ€λ₯(λ²κ·Έ)κ° λ°μνκΈ° λ§λ ¨μ
λλ€. μ΄λ¬ν μ€λ₯λ₯Ό μ°Ύμλ΄κ³ μμ νλ κ³Όμ μ |
- | <code bash>Β | + | Β |
- | # λλ²κ·Έ λͺ¨λλ‘ μ€ν | + | ----Β |
+ | ==== 1) λ΄μ₯ λλ²κ±° μ¬μ© | ||
+ | Node.jsλ μ½λλ₯Ό ν μ€μ© μ€ννλ©° λ³μ κ°μ νμΈνκ³ νλ‘κ·Έλ¨μ νλ¦μ μ μ΄ν μ μλ κ°λ ₯ν λ΄μ₯ λλ²κ±°λ₯Ό μ 곡ν©λλ€.Β | ||
+ | Β | ||
+ | * **νμμ±**: λ¨μν '' | ||
+ | | ||
+ | <file bash>Β | ||
+ | # λλ²κ·Έ λͺ¨λλ‘ | ||
+ | # μ΄ λͺ λ Ήμ μ€ννλ©΄ Chrome κ°λ°μ λꡬμ κ°μ μΈλΆ λλ²κ±°λ₯Ό μ°κ²°ν μ μλ μ£Όμκ° μ½μμ μΆλ ₯λ©λλ€. | ||
node --inspect app.js | node --inspect app.js | ||
- | # λΈλ μ΄ν¬ν¬μΈνΈ μ€μ Β | + | # μ½λ λ΄μμ νΉμ μ§μ μ μ€νμ λ©μΆκ³ μΆμ λ 'debugger;' ν€μλλ₯Ό μ½μ ν©λλ€.Β |
- | debugger;Β | + | # λλ²κ·Έ λͺ¨λλ‘ μ€ν μ€ μ΄ ν€μλλ₯Ό λ§λλ©΄ μ€νμ΄ μΌμ μ€μ§λ©λλ€.Β |
- | </code> | + | </file>Β |
+ | Β | ||
+ | ----Β | ||
+ | ==== 2) λ‘κΉ ====Β | ||
+ | **λ‘κΉ
**μ μ ν리μΌμ΄μ
μ μ€ν μ€μ λ°μνλ μ€μν μ 보(μ€λ₯, | ||
+ | Β | ||
+ | * **νμμ±**: | ||
- | **λ‘κΉ
: | + | <file javascript> |
- | <code javascript> | + | const winston = require(' |
- | const winston = require(' | + | |
- | const logger = winston.createLogger({Β | + | const logger = winston.createLogger({ |
- | level: ' | + | level: ' |
- | format: winston.format.json(), | + | format: winston.format.json(), |
- | transports: [ | + | transports: [ // λ‘κ·Έλ₯Ό μ΄λλ‘ λ³΄λΌμ§(μ μ₯ν μ§) μ μν©λλ€.Β |
+ | // ' | ||
new winston.transports.File({ filename: ' | new winston.transports.File({ filename: ' | ||
+ | // ' | ||
new winston.transports.File({ filename: ' | new winston.transports.File({ filename: ' | ||
] | ] | ||
}); | }); | ||
- | </code> | + | </file> |
- | ===== π κ΄λ ¨ μ©μ΄ ===== | + | ===== 9. κ΄λ ¨ μ©μ΄ ===== |
- | * [[wiki: | + | * [[wiki: |
- | * [[wiki: | + | * [[wiki: |
- | * [[wiki: | + | * [[wiki: |
- | * [[wiki: | + | * [[wiki: |
- | * [[wiki: | + | * [[wiki: |
- | ===== π κ΄λ ¨ λ¬Έμ ===== | + | ===== 10. κ΄λ ¨ λ¬Έμ ===== |
- | * [[wiki: | + | * [[wiki: |
- | * [[wiki: | + | * [[wiki: |
- | * [[wiki: | + | * [[wiki: |
--- | --- | ||
- | //μ΄ νμ΄μ§λ μλμΌλ‘ μμ±λμμ΅λλ€.// | + | //μ΄ νμ΄μ§λ μλμΌλ‘ μμ±λμμ΅λλ€.// |
- | Β | + |
wiki/glossary/server_operations/nodejs.txt Β· λ§μ§λ§μΌλ‘ μμ λ¨: μ μ syjang0803