์‚ฌ์šฉ์ž ๋„๊ตฌ

์‚ฌ์ดํŠธ ๋„๊ตฌ


wiki:it:dream_of_enc:metaverse:nodejs

์ฐจ์ด

๋ฌธ์„œ์˜ ์„ ํƒํ•œ ๋‘ ํŒ ์‚ฌ์ด์˜ ์ฐจ์ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ฐจ์ด ๋ณด๊ธฐ๋กœ ๋งํฌ

์–‘์ชฝ ์ด์ „ ํŒ์ด์ „ ํŒ
๋‹ค์Œ ํŒ
์ด์ „ ํŒ
wiki:it:dream_of_enc:metaverse:nodejs [2025/07/29 06:13] โ€“ syjang0803wiki:it:dream_of_enc:metaverse:nodejs [2025/07/30 06:43] (ํ˜„์žฌ) โ€“ ๋ฐ”๊นฅ ํŽธ์ง‘ 127.0.0.1
์ค„ 1: ์ค„ 1:
 ====== ๐ŸŸข Node.js ๋ฐฑ์—”๋“œ ์„ค์ • ====== ====== ๐ŸŸข Node.js ๋ฐฑ์—”๋“œ ์„ค์ • ======
-Phaser Baduk Metaverse ํ”„๋กœ์ ํŠธ์˜ Node.js ๋ฐฑ์—”๋“œ ์„ค์ •๊ณผ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.+ย 
 +Phaser Baduk Metaverse ํ”„๋กœ์ ํŠธ์˜ ''Node.js'' ๋ฐฑ์—”๋“œ ์„ค์ •๊ณผ ๊ตฌ์„ฑ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  
 ---- ----
-==== 1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ====ย +===== 1. Node.js๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”? =====ย 
-  * ์ด ํ”„๋กœ์ ํŠธ๋Š” Node.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์›น ํŽ˜์ด์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™€์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.ย +ย 
-  * ์ฃผ์š” ๊ธฐ์ˆ  ์Šคํƒ์€ ''Express.js'' (์›น ํ”„๋ ˆ์ž„์›Œํฌ)์™€ ''Socket.IO'' (์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์ž…๋‹ˆ๋‹ค.+''Node.js''๋Š” ''JavaScript''๋ฅผ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์‹คํ–‰๋˜๋˜ ''JavaScript''๋ฅผ ์„œ๋ฒ„์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.ย 
 +ย 
 +**์ฃผ์š” ํŠน์ง•:**ย 
 +  * ''JavaScript''๋กœ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 
 +  * ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๊ฐ•์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.ย 
 +  * ''npm''์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย 
 +  * ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  
 ---- ----
-==== 2. ์„œ๋ฒ„ ๊ตฌ์กฐ ๋ฐ ์ฃผ์š” ํŒŒ์ผ ====+===== 2. ํ”„๋กœ์ ํŠธ ๊ฐœ์š” =====ย 
 +ย 
 +์ด ํ”„๋กœ์ ํŠธ๋Š” ''Node.js''๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์›น ํŽ˜์ด์ง€๋ฅผ ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋งํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์™€์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.ย 
 +ย 
 +**์ฃผ์š” ๊ธฐ์ˆ  ์Šคํƒ:**ย 
 +  * **''Express.js''** - ์›น ํ”„๋ ˆ์ž„์›Œํฌย 
 +  * **''Socket.IO''** - ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌย 
 +  * **''PM2''** - ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ๋„๊ตฌย 
 +ย 
 +----ย 
 +===== 3. ์„œ๋ฒ„ ๊ตฌ์กฐ ๋ฐ ์ฃผ์š” ํŒŒ์ผ =====ย 
 Phaser Baduk Metaverse ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ์„œ๋ฒ„ ํŒŒ์ผ์ธ ''server.js''์˜ ๊ตฌ์กฐ์™€ ๊ฐ ๋ถ€๋ถ„์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Phaser Baduk Metaverse ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ์„œ๋ฒ„ ํŒŒ์ผ์ธ ''server.js''์˜ ๊ตฌ์กฐ์™€ ๊ฐ ๋ถ€๋ถ„์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  
-=== 1) ์ดˆ๊ธฐ ์„ค์ • ๋ฐ ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ===ย +==== 1) ์ดˆ๊ธฐ ์„ค์ • ๋ฐ ๋ชจ๋“ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ====
-์„œ๋ฒ„ ๊ตฌ๋™์— ํ•„์š”ํ•œ ''Express'', ''HTTP'', ''Socket.IO'' ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.+
  
-<code>javascript+์„œ๋ฒ„ ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.ย 
 +ย 
 +<file javascript>
 const express = require('express'); // ์›น ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ const express = require('express'); // ์›น ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ
 const http = require('http');     // HTTP ์„œ๋ฒ„ ๋ชจ๋“ˆ const http = require('http');     // HTTP ์„œ๋ฒ„ ๋ชจ๋“ˆ
 const socketIo = require('socket.io'); // ์‹ค์‹œ๊ฐ„ ์›น ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ const socketIo = require('socket.io'); // ์‹ค์‹œ๊ฐ„ ์›น ์†Œ์ผ“ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
 const path = require('path');     // ํŒŒ์ผ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ const path = require('path');     // ํŒŒ์ผ ๊ฒฝ๋กœ ์ฒ˜๋ฆฌ ์œ ํ‹ธ๋ฆฌํ‹ฐ
 +</file>
  
 +**๊ฐ ๋ชจ๋“ˆ์˜ ์—ญํ• :**
 +  * ''express'' - ์›น ์„œ๋ฒ„๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
 +  * ''http'' - ''HTTP'' ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋ชจ๋“ˆ
 +  * ''socket.io'' - ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
 +  * ''path'' - ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ
 +
 +==== 2) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ====
 +
 +<file javascript>
 const app = express(); // Express ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ const app = express(); // Express ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ
 const server = http.createServer(app); // HTTP ์„œ๋ฒ„ ์ƒ์„ฑ (Express ์•ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ) const server = http.createServer(app); // HTTP ์„œ๋ฒ„ ์ƒ์„ฑ (Express ์•ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ)
 const io = socketIo(server); // Socket.IO ์„œ๋ฒ„ ์ƒ์„ฑ (HTTP ์„œ๋ฒ„์— ์—ฐ๊ฒฐ) const io = socketIo(server); // Socket.IO ์„œ๋ฒ„ ์ƒ์„ฑ (HTTP ์„œ๋ฒ„์— ์—ฐ๊ฒฐ)
-</code>+</file>
  
-=== 2) ์ •์  ํŒŒ์ผ ์„œ๋น™ ๋ฐ ๋ผ์šฐํŒ… ===ย +**์„ค๋ช…:**ย 
-ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ)์— ์ œ๊ณต๋  ์ •์  ํŒŒ์ผ(HTML, CSS, JS, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ์„ค์ •ํ•˜๊ณ , ๊ธฐ๋ณธ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ผ์šฐํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.+  * ''app'' - ''Express'' ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์ฒดย 
 +  * ''server'' - ''HTTP'' ์„œ๋ฒ„ ๊ฐ์ฒด (''Express'' ์•ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ)ย 
 +  * ''io'' - ''Socket.IO'' ์„œ๋ฒ„ ๊ฐ์ฒด (''HTTP'' ์„œ๋ฒ„์— ์—ฐ๊ฒฐ)
  
-<code>javascriptย +==== 3) ์ •์  ํŒŒ์ผ ์„œ๋น™ ๋ฐ ๋ผ์šฐํŒ… ====ย 
-// 'public' ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์ •์  ํŒŒ์ผ๋“ค์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณต (์˜ˆ: index.html, style.css)ย +ย 
-app.use(express.static(path.join(__dirname, 'public')));+ํด๋ผ์ด์–ธํŠธ(ํ”„๋ก ํŠธ์—”๋“œ)์— ์ œ๊ณต๋  ์ •์  ํŒŒ์ผ(''HTML'', ''CSS'', ''JS'', ์ด๋ฏธ์ง€ ๋“ฑ)์„ ์„ค์ •ํ•˜๊ณ , ๊ธฐ๋ณธ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ผ์šฐํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.ย 
 +ย 
 +<file javascript>ย 
 +// 'public' ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์ •์  ํŒŒ์ผ๋“ค์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตย 
 +app.use(express.static(path.join(dirname, 'public')));
  
 // ๋ฃจํŠธ ๊ฒฝ๋กœ('/')๋กœ ์ ‘๊ทผ ์‹œ 'public' ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ 'index.html' ํŒŒ์ผ ์ „์†ก // ๋ฃจํŠธ ๊ฒฝ๋กœ('/')๋กœ ์ ‘๊ทผ ์‹œ 'public' ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ 'index.html' ํŒŒ์ผ ์ „์†ก
 app.get('/', (req, res) => { app.get('/', (req, res) => {
-    res.sendFile(path.join(__dirname, 'public', 'index.html'));+    res.sendFile(path.join(dirname, 'public', 'index.html'));
 }); });
-</code>+</file>
  
-=== 3) Socket.IO ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ===ย +**์„ค๋ช…:**ย 
-ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ''Socket.IO'' ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ๋ฐ ๊ฒŒ์ž„ ์ฐธ์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.+  ''express.static()'' ์ •์  ํŒŒ์ผ์„ ์›น์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.ย 
 +  * ''path.join(dirname, 'public')'' - ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ''public'' ํด๋” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.ย 
 +  * ''app.get('/')'' - ๋ฃจํŠธ ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  
-<code>javascript+==== 4) Socket.IO ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ====ย 
 +ย 
 +ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ''Socket.IO'' ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.ย 
 +ย 
 +<file javascript>
 // Socket.IO ์—ฐ๊ฒฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ // Socket.IO ์—ฐ๊ฒฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
 io.on('connection', (socket) => { io.on('connection', (socket) => {
์ค„ 58: ์ค„ 99:
     });     });
 }); });
-</code>+</file>ย 
 +ย 
 +**์„ค๋ช…:**ย 
 +  * ''io.on('connection')'' - ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.ย 
 +  * ''socket.on('join-game')'' - ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฒŒ์ž„ ์ฐธ๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.ย 
 +  * ''socket.join(gameId)'' - ํŠน์ • ๊ฒŒ์ž„๋ฐฉ์— ์†Œ์ผ“์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.ย 
 +  * ''socket.on('disconnect')'' - ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์ด ๋Š์–ด์งˆ ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.ย 
 +ย 
 +==== 5) ์„œ๋ฒ„ ํฌํŠธ ์„ค์ • ๋ฐ ์‹คํ–‰ ====
  
-=== 4) ์„œ๋ฒ„ ํฌํŠธ ์„ค์ • ๋ฐ ์‹คํ–‰ === 
 ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’(3000)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ง€์ •๋œ ํฌํŠธ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’(3000)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ง€์ •๋œ ํฌํŠธ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  
-<code>javascript+<file javascript>
 // ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ PORT๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’ 3000 ์‚ฌ์šฉ // ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ PORT๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’ 3000 ์‚ฌ์šฉ
 const PORT = process.env.PORT || 3000; const PORT = process.env.PORT || 3000;
์ค„ 70: ์ค„ 118:
 server.listen(PORT, () => { server.listen(PORT, () => {
     console.log(`์„œ๋ฒ„๊ฐ€ ํฌํŠธ ${PORT}์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.`);     console.log(`์„œ๋ฒ„๊ฐ€ ํฌํŠธ ${PORT}์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.`);
 +    console.log(`http://localhost:${PORT}์—์„œ ์ ‘์†ํ•˜์„ธ์š”.`);
 }); });
-</code>+</file>ย 
 +ย 
 +**์„ค๋ช…:**ย 
 +  * ''process.env.PORT'' - ํ™˜๊ฒฝ ๋ณ€์ˆ˜์—์„œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.ย 
 +  * ''|| 3000'' - ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ 3000์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.ย 
 +  * ''server.listen()'' - ์„œ๋ฒ„๋ฅผ ์ง€์ •๋œ ํฌํŠธ์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.ย 
 +  * ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์„œ๋ฒ„ ์‹œ์ž‘ ์„ฑ๊ณต ์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  
 ---- ----
-==== 3. ์˜์กด์„ฑ ๊ด€๋ฆฌ (package.json) ====+===== 4. ์˜์กด์„ฑ ๊ด€๋ฆฌ (package.json) =====ย 
 ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ''package.json'' ํŒŒ์ผ์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ''package.json'' ํŒŒ์ผ์˜ ์ฃผ์š” ๋‚ด์šฉ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
  
-=== 1) ํ”„๋กœ์ ํŠธ ์ •๋ณด ===+==== 1) ํ”„๋กœ์ ํŠธ ์ •๋ณด ====ย 
 ^ ํ‚ค ^ ์„ค๋ช… ^ ^ ํ‚ค ^ ์„ค๋ช… ^
 | name | ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ | | name | ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ |
์ค„ 84: ์ค„ 141:
 | main | ํ”„๋กœ์ ํŠธ์˜ ์ง„์ž…์  ํŒŒ์ผ (์—ฌ๊ธฐ์„œ๋Š” ''server.js'') | | main | ํ”„๋กœ์ ํŠธ์˜ ์ง„์ž…์  ํŒŒ์ผ (์—ฌ๊ธฐ์„œ๋Š” ''server.js'') |
  
-=== 2) ์Šคํฌ๋ฆฝํŠธ ===+==== 2) ์Šคํฌ๋ฆฝํŠธ ====ย 
 ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋‹จ์ถ•ํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋‹จ์ถ•ํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
 +
 ^ ์Šคํฌ๋ฆฝํŠธ ^ ์„ค๋ช… ^ ๋ช…๋ น์–ด ^ ^ ์Šคํฌ๋ฆฝํŠธ ^ ์„ค๋ช… ^ ๋ช…๋ น์–ด ^
 | start | ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. | ''node server.js'' | | start | ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. | ''node server.js'' |
์ค„ 91: ์ค„ 150:
 | pm2 | ''PM2''๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. (ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์šฉ) | ''pm2 start server.js'' | | pm2 | ''PM2''๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. (ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์šฉ) | ''pm2 start server.js'' |
  
-=== 3) ์˜์กด์„ฑ ๋ชฉ๋ก ===+==== 3) ์˜์กด์„ฑ ๋ชฉ๋ก ====ย 
 ^ ์˜์กด์„ฑ ^ ๋ฒ„์ „ ^ ์„ค๋ช… ^ ^ ์˜์กด์„ฑ ^ ๋ฒ„์ „ ^ ์„ค๋ช… ^
 | express | 4.18.2 | Node.js ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ | | express | 4.18.2 | Node.js ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ |
 | socket.io | 4.7.2 | ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ์›น ์†Œ์ผ“ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | | socket.io | 4.7.2 | ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ์›น ์†Œ์ผ“ ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ |
 | cors | 2.8.5 | ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  (CORS) ๋ฏธ๋“ค์›จ์–ด | | cors | 2.8.5 | ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  (CORS) ๋ฏธ๋“ค์›จ์–ด |
 +| helmet | 7.0.0 | ๋ณด์•ˆ ํ—ค๋” ์„ค์ • ๋ฏธ๋“ค์›จ์–ด |
 +| compression | 1.7.4 | ์‘๋‹ต ์••์ถ• ๋ฏธ๋“ค์›จ์–ด |
 +| express-rate-limit | 6.7.0 | ์š”์ฒญ ์ œํ•œ ๋ฏธ๋“ค์›จ์–ด |
 +
 +==== 4) ๊ฐœ๋ฐœ ์˜์กด์„ฑ ๋ชฉ๋ก ====
  
-=== 4) ๊ฐœ๋ฐœ ์˜์กด์„ฑ ๋ชฉ๋ก === 
 ^ ์˜์กด์„ฑ ^ ๋ฒ„์ „ ^ ์„ค๋ช… ^ ^ ์˜์กด์„ฑ ^ ๋ฒ„์ „ ^ ์„ค๋ช… ^
-| nodemon | 3.0.| ๊ฐœ๋ฐœ ์ค‘ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ |+| nodemon | 2.0.22 | ๊ฐœ๋ฐœ ์‹œ ์ฝ”๋“œ ๋ณ€๊ฒฝ ๊ฐ์ง€ํ•˜์—ฌ ์„œ๋ฒ„ ์ž๋™ ์žฌ์‹œ์ž‘ |ย 
 +| jest | 29.5.0 | JavaScript ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ |ย 
 +| supertest | 6.3.3 | HTTP ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ |ย 
 +ย 
 +----ย 
 +===== 5. ํ™˜๊ฒฝ ์„ค์ • =====ย 
 +ย 
 +==== 1) ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • ====ย 
 +ย 
 +ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ''.env'' ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:ย 
 +ย 
 +<file bash>ย 
 +# ์„œ๋ฒ„ ํฌํŠธ ์„ค์ •ย 
 +PORT=3000ย 
 +ย 
 +# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณดย 
 +MONGODB_URI=mongodb://localhost:27017/baduk_metaverseย 
 +ย 
 +# JWT ์‹œํฌ๋ฆฟ ํ‚คย 
 +JWT_SECRET=your-secret-key-hereย 
 +ย 
 +# ํ™˜๊ฒฝ ์„ค์ •ย 
 +NODE_ENV=developmentย 
 +</file>ย 
 +ย 
 +**์ฃผ์š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜:**ย 
 +  * ''PORT'' - ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋  ํฌํŠธ ๋ฒˆํ˜ธย 
 +  * ''MONGODB_URI'' - ''MongoDB'' ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฌธ์ž์—ดย 
 +  * ''JWT_SECRET'' - ''JWT'' ํ† ํฐ ์•”ํ˜ธํ™”์— ์‚ฌ์šฉํ•  ์‹œํฌ๋ฆฟ ํ‚คย 
 +  * ''NODE_ENV'' - ํ˜„์žฌ ํ™˜๊ฒฝ (''development''/''production'')ย 
 +ย 
 +==== 2) ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ๋ฒ• ====ย 
 +ย 
 +<file javascript>ย 
 +// dotenv ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ .env ํŒŒ์ผ ๋กœ๋“œย 
 +require('dotenv').config();ย 
 +ย 
 +// ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉย 
 +const PORT = process.env.PORT || 3000;ย 
 +const MONGODB_URI = process.env.MONGODB_URI;ย 
 +const JWT_SECRET = process.env.JWT_SECRET;ย 
 +</file>ย 
 +ย 
 +**์„ค๋ช…:**ย 
 +  * ''require('dotenv').config()'' - ''.env'' ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.ย 
 +  * ''process.env.๋ณ€์ˆ˜๋ช…'' - ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.ย 
 +  * ''|| ๊ธฐ๋ณธ๊ฐ’'' - ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.ย 
 +ย 
 +----ย 
 +===== 6. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ =====ย 
 +ย 
 +**๊ถŒ์žฅํ•˜๋Š” ํ”„๋กœ์ ํŠธ ํด๋” ๊ตฌ์กฐ:**ย 
 +ย 
 +<file>ย 
 +baduk-metaverse/ย 
 +โ”œโ”€โ”€ server.js              # ๋ฉ”์ธ ์„œ๋ฒ„ ํŒŒ์ผย 
 +โ”œโ”€โ”€ package.json           # ํ”„๋กœ์ ํŠธ ์„ค์ • ํŒŒ์ผย 
 +โ”œโ”€โ”€ .env                   # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผย 
 +โ”œโ”€โ”€ .gitignore            # Git ๋ฌด์‹œ ํŒŒ์ผ ๋ชฉ๋กย 
 +โ”œโ”€โ”€ public/               # ์ •์  ํŒŒ์ผ ํด๋”ย 
 +โ”‚   โ”œโ”€โ”€ index.html        # ๋ฉ”์ธ HTML ํŒŒ์ผย 
 +โ”‚   โ”œโ”€โ”€ css/              # CSS ํŒŒ์ผ๋“คย 
 +โ”‚   โ”œโ”€โ”€ js/               # ํด๋ผ์ด์–ธํŠธ JavaScript ํŒŒ์ผ๋“คย 
 +โ”‚   โ””โ”€โ”€ images/           # ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“คย 
 +โ”œโ”€โ”€ routes/               # ๋ผ์šฐํŠธ ํŒŒ์ผ๋“คย 
 +โ”‚   โ”œโ”€โ”€ games.js          # ๊ฒŒ์ž„ ๊ด€๋ จ ๋ผ์šฐํŠธย 
 +โ”‚   โ”œโ”€โ”€ users.js          # ์‚ฌ์šฉ์ž ๊ด€๋ จ ๋ผ์šฐํŠธย 
 +โ”‚   โ””โ”€โ”€ statistics.js     # ํ†ต๊ณ„ ๊ด€๋ จ ๋ผ์šฐํŠธย 
 +โ”œโ”€โ”€ controllers/          # ์ปจํŠธ๋กค๋Ÿฌ ํŒŒ์ผ๋“คย 
 +โ”‚   โ”œโ”€โ”€ BadukGameController.jsย 
 +โ”‚   โ”œโ”€โ”€ UserController.jsย 
 +โ”‚   โ””โ”€โ”€ StatisticsController.jsย 
 +โ”œโ”€โ”€ models/               # ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ํŒŒ์ผ๋“คย 
 +โ”‚   โ”œโ”€โ”€ BadukGame.jsย 
 +โ”‚   โ”œโ”€โ”€ User.jsย 
 +โ”‚   โ””โ”€โ”€ BadukGameState.jsย 
 +โ”œโ”€โ”€ middleware/           # ๋ฏธ๋“ค์›จ์–ด ํŒŒ์ผ๋“คย 
 +โ”‚   โ”œโ”€โ”€ auth.js           # ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ดย 
 +โ”‚   โ””โ”€โ”€ errorHandler.js   # ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฏธ๋“ค์›จ์–ดย 
 +โ”œโ”€โ”€ utils/                # ์œ ํ‹ธ๋ฆฌํ‹ฐ ํŒŒ์ผ๋“คย 
 +โ”‚   โ”œโ”€โ”€ BadukMoveValidator.jsย 
 +โ”‚   โ””โ”€โ”€ helpers.jsย 
 +โ””โ”€โ”€ tests/                # ํ…Œ์ŠคํŠธ ํŒŒ์ผ๋“คย 
 +    โ”œโ”€โ”€ server.test.jsย 
 +    โ””โ”€โ”€ game.test.jsย 
 +</file>ย 
 +ย 
 +**๊ฐ ํด๋”์˜ ์—ญํ• :**ย 
 +  * ''public/'' - ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ œ๊ณตํ•  ํŒŒ์ผ๋“คย 
 +  * ''routes/'' - ''URL'' ๊ฒฝ๋กœ๋ณ„ ์ฒ˜๋ฆฌ ๋กœ์งย 
 +  * ''controllers/'' - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌย 
 +  * ''models/'' - ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ •์˜ย 
 +  * ''middleware/'' - ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘๊ฐ„ ๋‹จ๊ณ„ย 
 +  * ''utils/'' - ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋“คย 
 +  * ''tests/'' - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋“คย 
 +ย 
 +----ย 
 +===== 7. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • =====ย 
 +ย 
 +==== 1) Node.js ์„ค์น˜ ====ย 
 +ย 
 +**Windows์—์„œ Node.js ์„ค์น˜:**ย 
 +  * ''Node.js'' ๊ณต์‹ ์›น์‚ฌ์ดํŠธ (''https://nodejs.org'') ๋ฐฉ๋ฌธย 
 +  * ''LTS'' ๋ฒ„์ „ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์„ค์น˜ย 
 +  * ์„ค์น˜ ์™„๋ฃŒ ํ›„ ํ„ฐ๋ฏธ๋„์—์„œ ํ™•์ธ:ย 
 +<file bash>ย 
 +node --versionย 
 +npm --versionย 
 +</file>ย 
 +ย 
 +==== 2) ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™” ====ย 
 +ย 
 +<file bash>ย 
 +# ์ƒˆ ํด๋” ์ƒ์„ฑ ๋ฐ ์ด๋™ย 
 +mkdir baduk-metaverseย 
 +cd baduk-metaverseย 
 +ย 
 +# npm ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”ย 
 +npm init -yย 
 +ย 
 +# ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ย 
 +npm install express socket.io cors helmet compression express-rate-limitย 
 +ย 
 +# ๊ฐœ๋ฐœ์šฉ ํŒจํ‚ค์ง€ ์„ค์น˜ย 
 +npm install --save-dev nodemonย 
 +</file>ย 
 +ย 
 +==== 3) ๊ธฐ๋ณธ ์„œ๋ฒ„ ํŒŒ์ผ ์ƒ์„ฑ ====ย 
 +ย 
 +''server.js'' ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ธฐ๋ณธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค:ย 
 +ย 
 +<file javascript>ย 
 +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('disconnect', () => {ย 
 +        console.log('ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ํ•ด์ œ:', socket.id);ย 
 +    });ย 
 +});ย 
 +ย 
 +// ์„œ๋ฒ„ ์‹œ์ž‘ย 
 +const PORT = process.env.PORT || 3000;ย 
 +server.listen(PORT, () => {ย 
 +    console.log(`์„œ๋ฒ„๊ฐ€ ํฌํŠธ ${PORT}์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.`);ย 
 +});ย 
 +</file>ย 
 +ย 
 +==== 4) package.json ์Šคํฌ๋ฆฝํŠธ ์„ค์ • ====
  
 <file json> <file json>
 { {
-  "name": "phaser-baduk-metaverse",+  "name": "baduk-metaverse",
   "version": "1.0.0",   "version": "1.0.0",
-  "description": "Phaser.js ๊ธฐ๋ฐ˜ ๋ฐ”๋‘‘ ๋ฉ”ํƒ€๋ฒ„์Šค ๊ฒŒ์ž„",+  "description": "Phaser Baduk Metaverse ํ”„๋กœ์ ํŠธ",
   "main": "server.js",   "main": "server.js",
   "scripts": {   "scripts": {
     "start": "node server.js",     "start": "node server.js",
     "dev": "nodemon server.js",     "dev": "nodemon server.js",
-    "pm2": "pm2 start server.js"+    "test": "jest"
   },   },
   "dependencies": {   "dependencies": {
     "express": "^4.18.2",     "express": "^4.18.2",
     "socket.io": "^4.7.2",     "socket.io": "^4.7.2",
-    "cors": "^2.8.5"+    "cors": "^2.8.5",ย 
 +    "helmet": "^7.0.0",ย 
 +    "compression": "^1.7.4",ย 
 +    "express-rate-limit": "^6.7.0"
   },   },
   "devDependencies": {   "devDependencies": {
-    "nodemon": "^3.0.1"+    "nodemon": "^2.0.22",ย 
 +    "jest": "^29.5.0"
   }   }
 } }
์ค„ 124: ์ค„ 357:
  
 ---- ----
-==== 4. ํ™˜๊ฒฝ ์„ค์ • ====ย +===== 8. ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐ ํ…Œ์ŠคํŠธ =====
-์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ œ์–ดํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • ๋ฐ ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.+
  
-=== 1) ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ (.env) ===ย +==== 1) ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์„œ๋ฒ„ ์‹คํ–‰ ====
-๋ฏผ๊ฐํ•œ ์ •๋ณด๋‚˜ ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ์„ค์ •๊ฐ’์€ '''.env''' ํŒŒ์ผ์— ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.+
  
 <file bash> <file bash>
-# .env ํŒŒ์ผ ์˜ˆ์‹œย +npm run dev
-NODE_ENV=development // ํ˜„์žฌ ์‹คํ–‰ ํ™˜๊ฒฝ (development, production ๋“ฑ)ย +
-PORT=3000            // ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•  ํฌํŠธ ๋ฒˆํ˜ธย +
-DB_PATH=./db.json    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ ๊ฒฝ๋กœ+
 </file> </file>
  
-=== 2) ์„œ๋ฒ„ ์‹คํ–‰ ๋ช…๋ น์–ด ===ย +**์„ค๋ช…:**ย 
-๊ฐœ๋ฐœ ๋ฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.ย +  * ''nodemon''์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.ย 
-  * ๊ฐœ๋ฐœ ๋ชจ๋“œ: ''nodemon''์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์„œ๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.ย +  * ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ž๋™์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.ย 
-    <code>bashย +  * ๊ฐœ๋ฐœ ์ค‘์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
-    npm run devย +
-    </code>ย +
-  * ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ: ''node'' ๋ช…๋ น์–ด๋กœ ์ง์ ‘ ์‹คํ–‰ํ•˜๋ฉฐ, ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.ย +
-    <code>bashย +
-    npm startย +
-    </code>+
  
-----ย +==== 2) ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ๋กœ ์„œ๋ฒ„ ์‹คํ–‰ ====
-==== 5. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ====ย +
-๊ฒŒ์ž„ ๋ฐ ์‚ฌ์šฉ์ž ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ''db.json'' ํŒŒ์ผ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.+
  
-=== 1) ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ (db.json) ===ย +<file bash>ย 
-๊ฒŒ์ž„์˜ ์ƒํƒœ, ์‚ฌ์šฉ์ž ์ •๋ณด, ๋ฐฉ ์ •๋ณด, ํ†ต๊ณ„ ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” JSON ํŒŒ์ผ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(์˜ˆ: MongoDB, PostgreSQL)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.+npm startย 
 +</file>
  
-<file json>ย +**์„ค๋ช…:**ย 
-{ย +  * ''node''๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.ย 
-  "games": {}, // ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์™„๋ฃŒ๋œ ๊ฒŒ์ž„ ์ •๋ณดย +  * ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ˆ˜๋™์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.ย 
-  "users": {}, // ์‚ฌ์šฉ์ž ๊ณ„์ • ๋ฐ ํ”„๋กœํ•„ ์ •๋ณดย +  * ์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.ย 
-  "rooms"{}, // ์ƒ์„ฑ๋œ ๊ฒŒ์ž„ ๋ฐฉ ์ •๋ณดย +ย 
-  "statistics": { // ์ „๋ฐ˜์ ์ธ ๊ฒŒ์ž„ ํ†ต๊ณ„ย +==== 3) ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ ====ย 
-    "totalGames"0, // ์ด ๊ฒŒ์ž„ ์ˆ˜ย +ย 
-    "activePlayers"// ํ˜„์žฌ ์ ‘์† ์ค‘์ธ ํ”Œ๋ ˆ์ด์–ด ์ˆ˜ย +**๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธ:**ย 
-  }ย +  * ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐย 
-}+  * ''http://localhost:3000'' ์ ‘์†ย 
 +  * ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ตํ•˜๋Š”์ง€ ํ™•์ธย 
 +ย 
 +**ํ„ฐ๋ฏธ๋„์—์„œ ํ…Œ์ŠคํŠธ:**ย 
 +<file bash>ย 
 +curl http://localhost:3000
 </file> </file>
  
 ---- ----
-==== 6. ๋””๋ฒ„๊น… ๋ฐ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ====ย +===== 9. ๋””๋ฒ„๊น… ๋ฐ ๋กœ๊น… =====
-์„œ๋ฒ„์˜ ๋””๋ฒ„๊น…์„ ๋•๊ณ , ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์•ˆ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.+
  
-=== 1) ๋กœ๊ทธ ๋ ˆ๋ฒจ ์„ค์ • ===ย +==== 1) ์ฝ˜์†” ๋กœ๊น… ====
-๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ƒ์„ธํ•œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ ๋””๋ฒ„๊น…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.+
  
-<code>javascriptย +<file javascript>ย 
-// Node.js ํ™˜๊ฒฝ ๋ณ€์ˆ˜ 'NODE_ENV'๊ฐ€ 'development'์ผ ๊ฒฝ์šฐ ์ƒ์„ธ ๋กœ๊ทธ ์ถœ๋ ฅย +// ๊ธฐ๋ณธ ๋กœ๊น…ย 
-if (process.env.NODE_ENV === 'development'{ย +console.log('์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€');ย 
-    console.log('๐Ÿ”ง ๊ฐœ๋ฐœ ๋ชจ๋“œ๋กœ ์‹คํ–‰ ์ค‘');ย +console.error('์—๋Ÿฌ ๋ฉ”์‹œ์ง€');ย 
-    // ํ˜„์žฌ Node.js ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ถœ๋ ฅย +console.warn('๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€');
-    console.log('๐Ÿ“Š ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰:', process.memoryUsage());ย +
-}ย +
-</code>+
  
-=== 2) ์ „์—ญ ์—๋Ÿฌ ํ•ธ๋“ค๋ง ===ย +// ๊ฐ์ฒด ๋กœ๊น…ย 
-์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ(Exception)๋‚˜ Promise ๊ฑฐ๋ถ€(Rejection)๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ ์—๋Ÿฌ๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.+const gameData { id: 1, name: '๋ฐ”๋‘‘ ๊ฒŒ์ž„' };ย 
 +console.log('๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ:'gameData);
  
-<code>javascriptย +// ์‹œ๊ฐ„๊ณผ ํ•จ๊ป˜ ๋กœ๊น…ย 
-// ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ๋™๊ธฐ ์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ํ˜ธ์ถœย +console.log(`${new Date().toISOString()} - ์„œ๋ฒ„ ์‹œ์ž‘๋จ`);ย 
-process.on('uncaughtException', (err) => {ย +</file>ย 
-    console.error('โŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ์˜ˆ์™ธ:', err);ย +ย 
-    process.exit(1); // ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ (์ƒํƒœ ์ฝ”๋“œ 1: ์˜ค๋ฅ˜)+==== 2) ๋กœ๊น… ๋ฏธ๋“ค์›จ์–ด ====ย 
 +ย 
 +<file javascript>ย 
 +// ์š”์ฒญ ๋กœ๊น… ๋ฏธ๋“ค์›จ์–ดย 
 +app.use((req, res, next) => {ย 
 +    console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);ย 
 +    next();
 }); });
  
-// ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ Promise ๊ฑฐ๋ถ€(reject) ๋ฐœ์ƒ ์‹œ ํ˜ธ์ถœย +// ์—๋Ÿฌ ๋กœ๊น… ๋ฏธ๋“ค์›จ์–ดย 
-process.on('unhandledRejection', (reasonpromise) => {ย +app.use((err, req, resnext) => {ย 
-    console.error('โŒ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ Promise ๊ฑฐ๋ถ€:', reason);ย +    console.error('์„œ๋ฒ„ ์—๋Ÿฌ:', err);ย 
-    // ์ด ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ข…๋ฃŒํ• ์ง€ ์—ฌ๋ถ€๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.+    res.status(500).json({ error: '์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.' });
 }); });
-</code>+</file>ย 
 +ย 
 +==== 3) ๋””๋ฒ„๊น… ๋„๊ตฌ ====ย 
 +ย 
 +**Node.js ๋‚ด์žฅ ๋””๋ฒ„๊ฑฐ ์‚ฌ์šฉ:**ย 
 +<file bash>ย 
 +node --inspect server.jsย 
 +</file>ย 
 +ย 
 +**Chrome DevTools์—์„œ ๋””๋ฒ„๊น…:**ย 
 +  * Chrome ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐย 
 +  * %%chrome://inspect%% ์ ‘์†ย 
 +  * "Open dedicated DevTools for Node" ํด๋ฆญ
  
 ---- ----
-==== 7. ์„ฑ๋Šฅ ์ตœ์ ํ™” ====ย +===== 10. ์„ฑ๋Šฅ ์ตœ์ ํ™” =====
-Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•๋“ค์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.+
  
-=== 1) ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ (๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜) ===ย +==== 1) ์••์ถ• ์„ค์ • ====ย 
-์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์˜์‹ฌ๋  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.+ย 
 +<file javascript>ย 
 +const compression = require('compression');ย 
 +ย 
 +// ์‘๋‹ต ์••์ถ• ๋ฏธ๋“ค์›จ์–ดย 
 +app.use(compression());ย 
 +</file>ย 
 +ย 
 +==== 2) ์บ์‹ฑ ์„ค์ • ====ย 
 +ย 
 +<file javascript>ย 
 +// ์ •์  ํŒŒ์ผ ์บ์‹ฑย 
 +app.use(express.static(path.join(dirname, 'public'), {ย 
 +    maxAge: '1d', // 1์ผ๊ฐ„ ์บ์‹œย 
 +    etag: true    // ETag ์‚ฌ์šฉย 
 +}));ย 
 +</file>ย 
 +ย 
 +==== 3) ์š”์ฒญ ์ œํ•œ ====ย 
 +ย 
 +<file javascript>ย 
 +const rateLimit = require('express-rate-limit');ย 
 +ย 
 +// API ์š”์ฒญ ์ œํ•œย 
 +const limiter = rateLimit({ย 
 +    windowMs: 15 * 60 * 1000, // 15๋ถ„ย 
 +    max: 100, // IP๋‹น ์ตœ๋Œ€ 100๊ฐœ ์š”์ฒญย 
 +    message: '๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฒญ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.'ย 
 +});ย 
 +ย 
 +app.use('/api/', limiter);ย 
 +</file>ย 
 +ย 
 +----ย 
 +===== 11. ๋ณด์•ˆ ์„ค์ • =====ย 
 +ย 
 +==== 1) Helmet ๋ฏธ๋“ค์›จ์–ด ====ย 
 +ย 
 +<file javascript>ย 
 +const helmet = require('helmet');
  
-<code>javascriptย +// ๋ณด์•ˆ ํ—ค๋” ์„ค์ •ย 
-// 30์ดˆ๋งˆ๋‹ค ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์„ ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ย +app.use(helmet({ย 
-setInterval(() => {ย +    contentSecurityPolicy: {ย 
-    // Node.js์—์„œ 'global.gc'๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด 'node --expose-gc์˜ต์…˜์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.ย +        directives: {ย 
-    if (global.gc) {ย +            defaultSrc: ["'self'"],ย 
-        global.gc(); // ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๊ฐ•์ œ ์‹คํ–‰ย +            styleSrc: ["'self'", "'unsafe-inline'"],ย 
-        console.log('๐Ÿงน ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์‹คํ–‰');+            scriptSrc: ["'self'", "'unsafe-inline'"],ย 
 +            imgSrc: ["'self'", "data:", "https:"],ย 
 +            connectSrc: ["'self'", "ws:", "wss:"]ย 
 +        }
     }     }
-}, 30000); // 30000 ๋ฐ€๋ฆฌ์ดˆ = 30์ดˆย +}));ย 
-</code>+</file>
  
-=== 2) ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ ===ย +==== 2) CORS ์„ค์ • ====
-Node.js๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์ด์ง€๋งŒ, ''cluster'' ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ CPU ์ฝ”์–ด ์ˆ˜๋งŒํผ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU์˜ ์ด์ ์„ ํ™œ์šฉํ•˜๊ณ , ์„œ๋ฒ„์˜ ์•ˆ์ •์„ฑ๊ณผ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.+
  
 <file javascript> <file javascript>
-const cluster = require('cluster'); // Node.js ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“ˆย +const cors = require('cors');
-const numCPUs = require('os').cpus().length; // ์‹œ์Šคํ…œ์˜ CPU ์ฝ”์–ด ์ˆ˜+
  
-// ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค์ธ์ง€ ํ™•์ธย +// CORS ์„ค์ •ย 
-if (cluster.isMaster) {ย +app.use(cors({ย 
-    console.log(`๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค ${process.pid์‹คํ–‰ ์ค‘`);+    origin: process.env.NODE_ENV === 'production' ย 
 +        ? ['https://yourdomain.com'] ย 
 +        : ['http://localhost:3000'],ย 
 +    credentials: trueย 
 +}));ย 
 +</file>ย 
 +ย 
 +==== 3) ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ====ย 
 +ย 
 +<file javascript>ย 
 +// ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์˜ˆ์ œย 
 +app.post('/api/games', (req, res) => {ย 
 +    const { gameType, settings } = req.body;
          
-    // CPU ์ฝ”์–ด ์ˆ˜๋งŒํผ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑย +    // ํ•„์ˆ˜ ํ•„๋“œ ๊ฒ€์ฆย 
-    for (let i = 0; i < numCPUs; i++) {ย +    if (!gameType) {ย 
-        cluster.fork(); // ์ƒˆ๋กœ์šด ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ+        return res.status(400).json({ error: '๊ฒŒ์ž„ ํƒ€์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.' });
     }     }
          
-    // ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ (์˜ˆ: ์˜ˆ์™ธ ๋ฐœ์ƒ ๋˜๋Š” ์ˆ˜๋™ ์ข…๋ฃŒ)ย +    // ๋ฐ์ดํ„ฐ ํƒ€์ž… ๊ฒ€์ฆย 
-    cluster.on('exit', (worker, code, signal=> {ย +    if (typeof gameType !== 'string') {ย 
-        console.log(`์›Œ์ปค ${worker.process.pid} ์ข…๋ฃŒ (์ฝ”๋“œ: ${code}, ์‹œ๊ทธ๋„${signal})`);ย +        return res.status(400).json({ error'๊ฒŒ์ž„ ํƒ€์ž…์€ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.' });ย 
-        cluster.fork(); // ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์›Œ์ปค ์žฌ์‹œ์ž‘ย +    }ย 
-    });ย +    ย 
-} else {ย +    // ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ...ย 
-    // ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋Š” ์‹ค์ œ ์„œ๋ฒ„ ๋กœ์ง์„ ์‹คํ–‰ย +});
-    // ์ด ๊ฒฝ์šฐ 'server.js' ํŒŒ์ผ์ด ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋‹ค์‹œ ๋กœ๋“œ๋˜์–ด ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.ย +
-    require('./server.js');ย +
-}+
 </file> </file>
  
 ---- ----
-==== 8๊ด€๋ จ ๋ฌธ์„œ ====ย +===== 12๋‹ค์Œ ๋‹จ๊ณ„ =====ย 
-  * [[wiki:it:dream_of_enc:metaverse:express|Express.js ์›น ํ”„๋ ˆ์ž„์›Œํฌ]]ย +ย 
-  [[wiki:it:dream_of_enc:metaverse:socketio|Socket.IO ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ]]ย +''Node.js'' ๊ธฐ๋ณธ์„ ๋ฐฐ์› ๋‹ค๋ฉด ๋‹ค์Œ์„ ํ•™์Šตํ•ด๋ณด์„ธ์š”:ย 
-  [[wiki:it:dream_of_enc:metaverse:pm2|PM2 ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ]]+ย 
 +  * **''Express.js''** - ์›น ํ”„๋ ˆ์ž„์›Œํฌ ์‹ฌํ™” ํ•™์Šตย 
 +  * **''Socket.IO''** - ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ตฌํ˜„ย 
 +  * **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™** - ''MongoDB'', ''MySQL'' ๋“ฑย 
 +  * **์ธ์ฆ ์‹œ์Šคํ…œ** - ''JWT'', ''Passport.js'' ๋“ฑย 
 +  * **ํ…Œ์ŠคํŠธ ์ž‘์„ฑ** - ''Jest'', ''Mocha'' ๋“ฑย 
 +ย 
 +**์ถ”์ฒœ ํ•™์Šต ์ˆœ์„œ:**ย 
 +  - [[wiki:it:dream_of_enc:metaverse:express|๐Ÿš€ Express.js ์›น ํ”„๋ ˆ์ž„์›Œํฌ]]ย 
 +  [[wiki:it:dream_of_enc:metaverse:socketio|๐Ÿ”Œ Socket.IO ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ]]ย 
 +  [[wiki:it:dream_of_enc:metaverse:pm2|โšก PM2 ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ]]
  
 --- ---
 //์ด ํŽ˜์ด์ง€๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.// //์ด ํŽ˜์ด์ง€๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.//
 --- ---
 +
wiki/it/dream_of_enc/metaverse/nodejs.1753769599.txt.gz ยท ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋จ: ์ €์ž syjang0803

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki