μ‚¬μš©μž 도ꡬ

μ‚¬μ΄νŠΈ 도ꡬ


wiki:it:dream_of_enc:metaverse:nodejs

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


🟒 Node.js λ°±μ—”λ“œ μ„€μ •

Phaser Baduk Metaverse ν”„λ‘œμ νŠΈμ˜ Node.js λ°±μ—”λ“œ μ„€μ •κ³Ό ꡬ성에 λŒ€ν•΄ μ„€λͺ…ν•©λ‹ˆλ‹€.

πŸ“‹ κ°œμš”

이 ν”„λ‘œμ νŠΈλŠ” Node.jsλ₯Ό 기반으둜 ν•œ μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§κ³Ό μ‹€μ‹œκ°„ 톡신을 μ œκ³΅ν•©λ‹ˆλ‹€.

πŸ—οΈ μ„œλ²„ ꡬ쑰

메인 μ„œλ²„ 파일 (server.js):

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const path = require('path');
 
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
 
// 정적 파일 μ„œλΉ™
app.use(express.static(path.join(__dirname, 'public')));
 
// 라우트 μ„€μ •
app.get('/', (req, res) => {
    res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
 
// Socket.IO 이벀트 처리
io.on('connection', (socket) => {
    console.log('μƒˆλ‘œμš΄ ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²°:', socket.id);
 
    socket.on('join-game', (gameId) => {
        socket.join(gameId);
        console.log(`ν”Œλ ˆμ΄μ–΄κ°€ κ²Œμž„ ${gameId}에 μ°Έκ°€ν–ˆμŠ΅λ‹ˆλ‹€.`);
    });
 
    socket.on('disconnect', () => {
        console.log('ν΄λΌμ΄μ–ΈνŠΈ μ—°κ²° ν•΄μ œ:', socket.id);
    });
});
 
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
    console.log(`μ„œλ²„κ°€ 포트 ${PORT}μ—μ„œ μ‹€ν–‰ μ€‘μž…λ‹ˆλ‹€.`);
});

πŸ“¦ μ˜μ‘΄μ„± 관리

package.json μ£Όμš” μ˜μ‘΄μ„±:

{
  "name": "phaser-baduk-metaverse",
  "version": "1.0.0",
  "description": "Phaser.js 기반 λ°”λ‘‘ λ©”νƒ€λ²„μŠ€ κ²Œμž„",
  "main": "server.js",
  "scripts": {
    "start": "node server.js",
    "dev": "nodemon server.js",
    "pm2": "pm2 start server.js"
  },
  "dependencies": {
    "express": "^4.18.2",
    "socket.io": "^4.7.2",
    "cors": "^2.8.5"
  },
  "devDependencies": {
    "nodemon": "^3.0.1"
  }
}

πŸ”§ ν™˜κ²½ μ„€μ •

ν™˜κ²½ λ³€μˆ˜ μ„€μ •:

# .env 파일
NODE_ENV=development
PORT=3000
DB_PATH=./db.json

개발 ν™˜κ²½ μ‹€ν–‰:

# 개발 λͺ¨λ“œ (nodemon μ‚¬μš©)
npm run dev
 
# ν”„λ‘œλ•μ…˜ λͺ¨λ“œ
npm start

πŸ—„οΈ 데이터 관리

κ²Œμž„ 데이터 μ €μž₯μ†Œ (db.json):

{
  "games": {},
  "users": {},
  "rooms": {},
  "statistics": {
    "totalGames": 0,
    "activePlayers": 0
  }
}

πŸ” 디버깅

둜그 레벨 μ„€μ •:

// 개발 ν™˜κ²½μ—μ„œ 상세 둜그 좜λ ₯
if (process.env.NODE_ENV === 'development') {
    console.log('πŸ”§ 개발 λͺ¨λ“œλ‘œ μ‹€ν–‰ 쀑');
    console.log('πŸ“Š λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰:', process.memoryUsage());
}

μ—λŸ¬ 핸듀링:

process.on('uncaughtException', (err) => {
    console.error('❌ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μ˜ˆμ™Έ:', err);
    process.exit(1);
});
 
process.on('unhandledRejection', (reason, promise) => {
    console.error('❌ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ Promise κ±°λΆ€:', reason);
});

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

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

// 주기적인 λ©”λͺ¨λ¦¬ 정리
setInterval(() => {
    if (global.gc) {
        global.gc();
        console.log('🧹 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜ μ‹€ν–‰');
    }
}, 30000); // 30μ΄ˆλ§ˆλ‹€

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

const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
 
if (cluster.isMaster) {
    console.log(`λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€ ${process.pid} μ‹€ν–‰ 쀑`);
 
    // μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€ 생성
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
 
    cluster.on('exit', (worker, code, signal) => {
        console.log(`μ›Œμ»€ ${worker.process.pid} μ’…λ£Œ`);
        cluster.fork(); // μƒˆλ‘œμš΄ μ›Œμ»€ 생성
    });
} else {
    // μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ„œλ²„ μ‹€ν–‰
    require('./server.js');
}

πŸ“š κ΄€λ ¨ λ¬Έμ„œ

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

wiki/it/dream_of_enc/metaverse/nodejs.1753682235.txt.gz Β· λ§ˆμ§€λ§‰μœΌλ‘œ μˆ˜μ •λ¨: μ €μž 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki