μ‚¬μš©μž 도ꡬ

μ‚¬μ΄νŠΈ 도ꡬ


wiki:glossary:server_operations:nodejs

λ¬Έμ„œμ˜ 이전 νŒμž…λ‹ˆλ‹€!


🟒 Node.js

Node.jsλŠ” JavaScript λŸ°νƒ€μž„ ν™˜κ²½μœΌλ‘œ, μ„œλ²„ μ‚¬μ΄λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ κ°€λŠ₯ν•˜κ²Œ ν•©λ‹ˆλ‹€.

πŸ“‹ μ •μ˜

Node.jsλŠ” Chrome V8 JavaScript 엔진을 기반으둜 ν•œ μ„œλ²„ μ‚¬μ΄λ“œ JavaScript λŸ°νƒ€μž„ ν™˜κ²½μž…λ‹ˆλ‹€. 이벀트 기반, λ…ΌλΈ”λ‘œν‚Ή I/O λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ κ°€λ²Όμš°λ©΄μ„œλ„ 효율적인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

🎯 μ£Όμš” νŠΉμ§•

1. 이벀트 기반 (Event-driven) - 비동기 ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜μ—¬ λ™μ‹œμ— λ§Žμ€ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. - 콜백 ν•¨μˆ˜λ₯Ό 톡해 이벀트 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

2. λ…ΌλΈ”λ‘œν‚Ή I/O - 파일 μ‹œμŠ€ν…œ μ ‘κ·Όμ΄λ‚˜ λ„€νŠΈμ›Œν¬ μš”μ²­ μ‹œ λ‹€λ₯Έ μž‘μ—…μ„ μ°¨λ‹¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. - 높은 μ„±λŠ₯κ³Ό ν™•μž₯성을 μ œκ³΅ν•©λ‹ˆλ‹€.

3. 크둜슀 ν”Œλž«νΌ - Windows, macOS, Linux λ“± λ‹€μ–‘ν•œ μš΄μ˜μ²΄μ œμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. - λ™μΌν•œ μ½”λ“œλ‘œ μ—¬λŸ¬ ν”Œλž«νΌμ„ 지원할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ—οΈ κΈ°λ³Έ ꡬ쑰

κ°„λ‹¨ν•œ HTTP μ„œλ²„ 예제:

const http = require('http');
 
const server = http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello World\n');
});
 
server.listen(3000, () => {
    console.log('μ„œλ²„κ°€ 포트 3000μ—μ„œ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€.');
});

λͺ¨λ“ˆ μ‹œμŠ€ν…œ:

// λͺ¨λ“ˆ 내보내기
module.exports = {
    add: (a, b) => a + b,
    subtract: (a, b) => a - b
};
 
// λͺ¨λ“ˆ κ°€μ Έμ˜€κΈ°
const math = require('./math');
console.log(math.add(5, 3)); // 8

πŸ“¦ νŒ¨ν‚€μ§€ 관리

npm (Node Package Manager) - Node.js의 κΈ°λ³Έ νŒ¨ν‚€μ§€ κ΄€λ¦¬μžμž…λ‹ˆλ‹€. - μ˜μ‘΄μ„± 관리와 슀크립트 싀행을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

package.json 예제:

{
  "name": "my-project",
  "version": "1.0.0",
  "description": "ν”„λ‘œμ νŠΈ μ„€λͺ…",
  "main": "index.js",
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest"
  },
  "dependencies": {
    "express": "^4.18.2",
    "socket.io": "^4.7.2"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}

πŸ”§ 개발 ν™˜κ²½

nodemon - 파일 변경을 κ°μ§€ν•˜μ—¬ μžλ™μœΌλ‘œ μ„œλ²„λ₯Ό μž¬μ‹œμž‘ν•©λ‹ˆλ‹€. - 개발 μ‹œ νŽΈμ˜μ„±μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

# nodemon μ„€μΉ˜
npm install -g nodemon
 
# 개발 μ„œλ²„ μ‹€ν–‰
nodemon app.js

ν™˜κ²½ λ³€μˆ˜ 관리:

require('dotenv').config();
 
const port = process.env.PORT || 3000;
const dbUrl = process.env.DATABASE_URL;

πŸš€ ν”„λ‘œλ•μ…˜ 배포

PM2 μ‚¬μš©:

# PM2 μ„€μΉ˜
npm install -g pm2
 
# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘
pm2 start app.js --name "my-app"
 
# ν΄λŸ¬μŠ€ν„° λͺ¨λ“œ
pm2 start app.js -i max

πŸ“Š μ„±λŠ₯ μ΅œμ ν™”

λ©”λͺ¨λ¦¬ 관리:

// κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ κ°•μ œ μ‹€ν–‰
if (global.gc) {
    global.gc();
}
 
// λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ λͺ¨λ‹ˆν„°λ§
const used = process.memoryUsage();
console.log(`λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);

ν΄λŸ¬μŠ€ν„° λͺ¨λ“œ:

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
 
if (cluster.isMaster) {
    // λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} else {
    // μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€
    require('./app.js');
}

πŸ” 디버깅

λ‚΄μž₯ 디버거 μ‚¬μš©:

# 디버그 λͺ¨λ“œλ‘œ μ‹€ν–‰
node --inspect app.js
 
# 브레이크포인트 μ„€μ •
debugger;

λ‘œκΉ…:

const winston = require('winston');
 
const logger = winston.createLogger({
    level: 'info',
    format: winston.format.json(),
    transports: [
        new winston.transports.File({ filename: 'error.log', level: 'error' }),
        new winston.transports.File({ filename: 'combined.log' })
    ]
});

πŸ“š κ΄€λ ¨ μš©μ–΄

  • Express.js - Node.js μ›Ή ν”„λ ˆμž„μ›Œν¬
  • PM2 - Node.js ν”„λ‘œμ„ΈμŠ€ κ΄€λ¦¬μž
  • Socket.IO - μ‹€μ‹œκ°„ 톡신 라이브러리
  • Git - 버전 관리 μ‹œμŠ€ν…œ
  • JavaScript - ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄

πŸ”— κ΄€λ ¨ λ¬Έμ„œ

β€” 이 νŽ˜μ΄μ§€λŠ” μžλ™μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

wiki/glossary/server_operations/nodejs.1753857794.txt.gz Β· λ§ˆμ§€λ§‰μœΌλ‘œ μˆ˜μ •λ¨: μ €μž 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki