wiki:it:dream_of_enc:metaverse:nodejs
์ฐจ์ด
๋ฌธ์์ ์ ํํ ๋ ํ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์์ชฝ ์ด์ ํ์ด์ ํ๋ค์ ํ | ์ด์ ํ | ||
wiki:it:dream_of_enc:metaverse:nodejs [2025/07/29 06:13] โ syjang0803 | wiki: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 ํ๋ก์ ํธ์ | ||
---- | ---- | ||
- | ==== 1. ํ๋ก์ ํธ ๊ฐ์ ====ย | + | ===== 1. Node.js๋ ๋ฌด์์ธ๊ฐ์? =====ย |
- | * ์ด ํ๋ก์ ํธ๋ | + | ย |
- | * ์ฃผ์ | + | '' |
+ | ย | ||
+ | **์ฃผ์ | ||
+ | * '' | ||
+ | * ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ฐ์ ์ด ์์ต๋๋ค.ย | ||
+ | * '' | ||
+ | * ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค. | ||
---- | ---- | ||
- | ==== 2. ์๋ฒ ๊ตฌ์กฐ ๋ฐ ์ฃผ์ ํ์ผ ==== | + | ===== 2. ํ๋ก์ ํธ ๊ฐ์ =====ย |
+ | ย | ||
+ | ์ด ํ๋ก์ ํธ๋ '' | ||
+ | ย | ||
+ | **์ฃผ์ ๊ธฐ์ ์คํ:**ย | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 3. ์๋ฒ ๊ตฌ์กฐ ๋ฐ ์ฃผ์ ํ์ผ =====ย | ||
Phaser Baduk Metaverse ํ๋ก์ ํธ์ ํต์ฌ ์๋ฒ ํ์ผ์ธ '' | Phaser Baduk Metaverse ํ๋ก์ ํธ์ ํต์ฌ ์๋ฒ ํ์ผ์ธ '' | ||
- | === 1) ์ด๊ธฐ ์ค์ ๋ฐ ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ ===ย | + | ==== 1) ์ด๊ธฐ ์ค์ ๋ฐ ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ ==== |
- | ์๋ฒ ๊ตฌ๋์ ํ์ํ '' | + | |
- | <code>javascript | + | ์๋ฒ ๊ตฌ๋์ ํ์ํ ๋ชจ๋๋ค์ ๋ถ๋ฌ์ค๊ณ , |
+ | ย | ||
+ | <file javascript> | ||
const express = require(' | const express = require(' | ||
const http = require(' | const http = require(' | ||
const socketIo = require(' | const socketIo = require(' | ||
const path = require(' | const path = require(' | ||
+ | </ | ||
+ | **๊ฐ ๋ชจ๋์ ์ญํ :** | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ==== 2) ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค ์์ฑ ==== | ||
+ | |||
+ | <file javascript> | ||
const app = express(); // Express ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ | const app = express(); // Express ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ | ||
const server = http.createServer(app); | const server = http.createServer(app); | ||
const io = socketIo(server); | const io = socketIo(server); | ||
- | </code> | + | </file> |
- | === 2) ์ ์ ํ์ผ ์๋น ๋ฐ ๋ผ์ฐํ ===ย | + | **์ค๋ช :**ย |
- | ํด๋ผ์ด์ธํธ(ํ๋ก ํธ์๋)์ ์ ๊ณต๋ ์ ์ ํ์ผ(HTML, | + | * '' |
+ | * '' | ||
+ | * '' | ||
- | <code>javascriptย | + | ==== 3) ์ ์ ํ์ผ ์๋น ๋ฐ ๋ผ์ฐํ ====ย |
- | // ' | + | ย |
- | app.use(express.static(path.join(__dirname, ' | + | ํด๋ผ์ด์ธํธ(ํ๋ก ํธ์๋)์ ์ ๊ณต๋ ์ ์ ํ์ผ('' |
+ | ย | ||
+ | <file javascript>ย | ||
+ | // ' | ||
+ | app.use(express.static(path.join(dirname, ' | ||
// ๋ฃจํธ ๊ฒฝ๋ก('/' | // ๋ฃจํธ ๊ฒฝ๋ก('/' | ||
app.get('/', | app.get('/', | ||
- | res.sendFile(path.join(__dirname, ' | + | res.sendFile(path.join(dirname, ' |
}); | }); | ||
- | </code> | + | </file> |
- | === 3) Socket.IO ์ด๋ฒคํธ ์ฒ๋ฆฌ ===ย | + | **์ค๋ช :**ย |
- | ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ค์๊ฐ ํต์ ์ ๋ด๋นํ๋ | + | |
+ | * '' | ||
+ | * '' | ||
- | <code>javascript | + | ==== 4) Socket.IO ์ด๋ฒคํธ ์ฒ๋ฆฌ ====ย |
+ | ย | ||
+ | ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ค์๊ฐ ํต์ ์ ๋ด๋นํ๋ '' | ||
+ | ย | ||
+ | <file javascript> | ||
// Socket.IO ์ฐ๊ฒฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ | // Socket.IO ์ฐ๊ฒฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ | ||
io.on(' | io.on(' | ||
์ค 58: | ์ค 99: | ||
}); | }); | ||
}); | }); | ||
- | </code> | + | </file>ย |
+ | ย | ||
+ | **์ค๋ช
: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ==== 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:// | ||
}); | }); | ||
- | </code> | + | </file>ย |
+ | ย | ||
+ | **์ค๋ช
: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * ์ฝ๋ฐฑ ํจ์๋ ์๋ฒ ์์ ์ฑ๊ณต ์ ์คํ๋๋ ํจ์์ ๋๋ค. | ||
---- | ---- | ||
- | ==== 3. ์์กด์ฑ ๊ด๋ฆฌ (package.json) ==== | + | ===== 4. ์์กด์ฑ ๊ด๋ฆฌ (package.json) =====ย |
ํ๋ก์ ํธ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ๋ '' | ํ๋ก์ ํธ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ๋ '' | ||
- | === 1) ํ๋ก์ ํธ ์ ๋ณด === | + | ==== 1) ํ๋ก์ ํธ ์ ๋ณด ====ย |
^ ํค ^ ์ค๋ช ^ | ^ ํค ^ ์ค๋ช ^ | ||
| name | ํ๋ก์ ํธ ์ด๋ฆ | | | name | ํ๋ก์ ํธ ์ด๋ฆ | | ||
์ค 84: | ์ค 141: | ||
| main | ํ๋ก์ ํธ์ ์ง์
์ ํ์ผ (์ฌ๊ธฐ์๋ '' | | main | ํ๋ก์ ํธ์ ์ง์
์ ํ์ผ (์ฌ๊ธฐ์๋ '' | ||
- | === 2) ์คํฌ๋ฆฝํธ === | + | ==== 2) ์คํฌ๋ฆฝํธ ====ย |
์์ฃผ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ฅผ ๋จ์ถํ์ฌ ์ ์ํฉ๋๋ค. | ์์ฃผ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ฅผ ๋จ์ถํ์ฌ ์ ์ํฉ๋๋ค. | ||
+ | |||
^ ์คํฌ๋ฆฝํธ ^ ์ค๋ช ^ ๋ช ๋ น์ด ^ | ^ ์คํฌ๋ฆฝํธ ^ ์ค๋ช ^ ๋ช ๋ น์ด ^ | ||
| start | ํ๋ก๋์
ํ๊ฒฝ์์ ์๋ฒ๋ฅผ ์์ํฉ๋๋ค. | '' | | start | ํ๋ก๋์
ํ๊ฒฝ์์ ์๋ฒ๋ฅผ ์์ํฉ๋๋ค. | '' | ||
์ค 91: | ์ค 150: | ||
| pm2 | '' | | pm2 | '' | ||
- | === 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.1 | ๊ฐ๋ฐ | + | | nodemon | 2.0.22 | ๊ฐ๋ฐ |
+ | | jest | 29.5.0 | JavaScript ํ ์คํธ ํ๋ ์์ํฌ |ย | ||
+ | | supertest | 6.3.3 | HTTP ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |ย | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 5. ํ๊ฒฝ ์ค์ =====ย | ||
+ | ย | ||
+ | ==== 1) ํ๊ฒฝ ๋ณ์ ์ค์ ====ย | ||
+ | ย | ||
+ | ํ๋ก์ ํธ ๋ฃจํธ์ '' | ||
+ | ย | ||
+ | <file bash>ย | ||
+ | # ์๋ฒ ํฌํธ ์ค์ ย | ||
+ | PORT=3000ย | ||
+ | ย | ||
+ | # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณดย | ||
+ | MONGODB_URI=mongodb:// | ||
+ | ย | ||
+ | # JWT ์ํฌ๋ฆฟ ํคย | ||
+ | JWT_SECRET=your-secret-key-hereย | ||
+ | ย | ||
+ | # ํ๊ฒฝ ์ค์ ย | ||
+ | NODE_ENV=developmentย | ||
+ | </ | ||
+ | ย | ||
+ | **์ฃผ์ ํ๊ฒฝ ๋ณ์:**ย | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ==== 2) ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ๋ฒ ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // dotenv ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ .env ํ์ผ ๋ก๋ย | ||
+ | require(' | ||
+ | ย | ||
+ | // ํ๊ฒฝ ๋ณ์ ์ฌ์ฉย | ||
+ | const PORT = process.env.PORT || 3000;ย | ||
+ | const MONGODB_URI = process.env.MONGODB_URI; | ||
+ | const JWT_SECRET = process.env.JWT_SECRET; | ||
+ | </ | ||
+ | ย | ||
+ | **์ค๋ช
: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 6. ํ๋ก์ ํธ ๊ตฌ์กฐ =====ย | ||
+ | ย | ||
+ | **๊ถ์ฅํ๋ | ||
+ | ย | ||
+ | < | ||
+ | baduk-metaverse/ | ||
+ | โโโ server.js | ||
+ | โโโ package.json | ||
+ | โโโ .env # ํ๊ฒฝ ๋ณ์ ํ์ผย | ||
+ | โโโ .gitignore | ||
+ | โโโ public/ | ||
+ | โ | ||
+ | โ | ||
+ | โ | ||
+ | โ | ||
+ | โโโ routes/ | ||
+ | โ | ||
+ | โ | ||
+ | โ | ||
+ | โโโ controllers/ | ||
+ | โ | ||
+ | โ | ||
+ | โ | ||
+ | โโโ models/ | ||
+ | โ | ||
+ | โ | ||
+ | โ | ||
+ | โโโ middleware/ | ||
+ | โ | ||
+ | โ | ||
+ | โโโ utils/ | ||
+ | โ | ||
+ | โ | ||
+ | โโโ tests/ | ||
+ | โโโ server.test.jsย | ||
+ | โโโ game.test.jsย | ||
+ | </ | ||
+ | ย | ||
+ | **๊ฐ ํด๋์ ์ญํ :**ย | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 7. ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ =====ย | ||
+ | ย | ||
+ | ==== 1) Node.js ์ค์น ====ย | ||
+ | ย | ||
+ | **Windows์์ Node.js ์ค์น:**ย | ||
+ | * '' | ||
+ | * '' | ||
+ | * ์ค์น ์๋ฃ ํ ํฐ๋ฏธ๋์์ ํ์ธ:ย | ||
+ | <file bash>ย | ||
+ | node --versionย | ||
+ | npm --versionย | ||
+ | </ | ||
+ | ย | ||
+ | ==== 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ย | ||
+ | </ | ||
+ | ย | ||
+ | ==== 3) ๊ธฐ๋ณธ ์๋ฒ ํ์ผ ์์ฑ ====ย | ||
+ | ย | ||
+ | '' | ||
+ | ย | ||
+ | <file javascript> | ||
+ | const express = require(' | ||
+ | const http = require(' | ||
+ | const socketIo = require(' | ||
+ | const path = require(' | ||
+ | ย | ||
+ | const app = express(); | ||
+ | const server = http.createServer(app); | ||
+ | const io = socketIo(server); | ||
+ | ย | ||
+ | // ์ ์ ํ์ผ ์๋นย | ||
+ | app.use(express.static(path.join(dirname, | ||
+ | ย | ||
+ | // ๊ธฐ๋ณธ ๋ผ์ฐํธย | ||
+ | app.get('/', | ||
+ | res.sendFile(path.join(dirname, | ||
+ | });ย | ||
+ | ย | ||
+ | // Socket.IO ์ฐ๊ฒฐ ์ฒ๋ฆฌย | ||
+ | io.on(' | ||
+ | console.log(' | ||
+ | ย | ||
+ | socket.on(' | ||
+ | console.log(' | ||
+ | });ย | ||
+ | });ย | ||
+ | ย | ||
+ | // ์๋ฒ ์์ย | ||
+ | const PORT = process.env.PORT | ||
+ | server.listen(PORT, | ||
+ | console.log(`์๋ฒ๊ฐ ํฌํธ ${PORT}์์ ์คํ ์ค์
๋๋ค.`); | ||
+ | });ย | ||
+ | </ | ||
+ | ย | ||
+ | ==== 4) package.json ์คํฌ๋ฆฝํธ ์ค์ ==== | ||
<file json> | <file json> | ||
{ | { | ||
- | " | + | " |
" | " | ||
- | " | + | " |
" | " | ||
" | " | ||
" | " | ||
" | " | ||
- | "pm2": "pm2 start server.js" | + | "test": "jest" |
}, | }, | ||
" | " | ||
" | " | ||
" | " | ||
- | " | + | " |
+ | " | ||
+ | " | ||
+ | " | ||
}, | }, | ||
" | " | ||
- | " | + | " |
+ | " | ||
} | } | ||
} | } | ||
์ค 124: | ์ค 357: | ||
---- | ---- | ||
- | ==== 4. ํ๊ฒฝ ์ค์ | + | ===== 8. ์๋ฒ ์คํ |
- | ์ ํ๋ฆฌ์ผ์ด์
์ ๋์ ๋ฐฉ์์ ์ ์ดํ๋ ํ๊ฒฝ ๋ณ์ ์ค์ ๋ฐ ์๋ฒ ์คํ | + | |
- | === 1) ํ๊ฒฝ ๋ณ์ ํ์ผ (.env) | + | ==== 1) ๊ฐ๋ฐ ๋ชจ๋๋ก ์๋ฒ ์คํ ==== |
- | ๋ฏผ๊ฐํ ์ ๋ณด๋ ํ๊ฒฝ๋ณ๋ก ๋ฌ๋ผ์ง๋ ์ค์ ๊ฐ์ ''' | + | |
<file bash> | <file bash> | ||
- | # .env ํ์ผ ์์ย | + | npm run dev |
- | NODE_ENV=development // ํ์ฌ ์คํ ํ๊ฒฝ (development, | + | |
- | PORT=3000 | + | |
- | DB_PATH=./ | + | |
</ | </ | ||
- | === 2) ์๋ฒ ์คํ ๋ช ๋ น์ด ===ย | + | **์ค๋ช :**ย |
- | ๊ฐ๋ฐ ๋ฐ ํ๋ก๋์
ํ๊ฒฝ์์ ์๋ฒ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ | + | * '' |
- | * ๊ฐ๋ฐ ๋ชจ๋: | + | * ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก |
- | < | + | * ๊ฐ๋ฐ ์ค์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. |
- | npm run devย | + | |
- | </ | + | |
- | * ํ๋ก๋์
๋ชจ๋: '' | + | |
- | < | + | |
- | npm startย | + | |
- | </ | + | |
- | ----ย | + | ==== 2) ํ๋ก๋์
๋ชจ๋๋ก ์๋ฒ ์คํ |
- | ==== 5. ๋ฐ์ดํฐ ๊ด๋ฆฌ | + | |
- | ๊ฒ์ ๋ฐ ์ฌ์ฉ์ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ '' | + | |
- | === 1) ๊ฒ์ ๋ฐ์ดํฐ ์ ์ฅ์ (db.json) ===ย | + | <file bash>ย |
- | ๊ฒ์์ ์ํ, ์ฌ์ฉ์ ์ ๋ณด, ๋ฐฉ ์ ๋ณด, ํต๊ณ ๋ฑ์ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์๋ JSON ํ์ผ ๊ตฌ์กฐ์
๋๋ค. ์ค์ ํ๋ก์ ํธ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: | + | npm startย |
+ | </ | ||
- | <file json>ย | + | **์ค๋ช :**ย |
- | {ย | + | * '' |
- | | + | |
- | | + | |
- | | + | ย |
- | | + | ==== 3) ์๋ฒ ํ ์คํธ ====ย |
- | " | + | ย |
- | " | + | **๋ธ๋ผ์ฐ์ ์์ ํ
์คํธ: |
- | }ย | + | * ๋ธ๋ผ์ฐ์ ์ด๊ธฐย |
- | } | + | |
+ | | ||
+ | ย | ||
+ | **ํฐ๋ฏธ๋์์ ํ ์คํธ:**ย | ||
+ | <file bash>ย | ||
+ | curl http://localhost: | ||
</ | </ | ||
---- | ---- | ||
- | ==== 6. ๋๋ฒ๊น
๋ฐ ์๋ฌ ํธ๋ค๋ง | + | ===== 9. ๋๋ฒ๊น ๋ฐ ๋ก๊น ===== |
- | ์๋ฒ์ ๋๋ฒ๊น ์ ๋๊ณ , ์์์น ๋ชปํ ์๋ฌ ๋ฐ์ ์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค. | + | |
- | === 1) ๋ก๊ทธ ๋ ๋ฒจ ์ค์ | + | ==== 1) ์ฝ์ |
- | ๊ฐ๋ฐ ํ๊ฒฝ์์ ์์ธํ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ์ฌ ๋๋ฒ๊น ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. | + | |
- | <code>javascriptย | + | <file javascript>ย |
- | // Node.js ํ๊ฒฝ ๋ณ์ ' | + | // ๊ธฐ๋ณธ |
- | if (process.env.NODE_ENV === 'development' | + | console.log('์ผ๋ฐ ๋ฉ์์ง');ย |
- | console.log('๐ง ๊ฐ๋ฐ ๋ชจ๋๋ก ์คํ ์ค');ย | + | console.error('์๋ฌ ๋ฉ์์ง');ย |
- | // ํ์ฌ Node.js ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ถ๋ ฅย | + | console.warn('๊ฒฝ๊ณ |
- | | + | |
- | }ย | + | |
- | </ | + | |
- | === 2) ์ ์ญ ์๋ฌ ํธ๋ค๋ง ===ย | + | // ๊ฐ์ฒด ๋ก๊น ย |
- | ์ฒ๋ฆฌ๋์ง ์์ ์์ธ(Exception)๋ Promise ๊ฑฐ๋ถ(Rejection)๊ฐ ๋ฐ์ํ์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ , ์๋ฌ๋ฅผ ๊ธฐ๋กํฉ๋๋ค. | + | const gameData |
+ | console.log(' | ||
- | <code> | + | // ์๊ฐ๊ณผ ํจ๊ป ๋ก๊น ย |
- | // ์ฒ๋ฆฌ๋์ง ์์ ๋๊ธฐ ์์ธ ๋ฐ์ ์ ํธ์ถย | + | console.log(`${new Date().toISOString()} - ์๋ฒ ์์๋จ`); |
- | process.on(' | + | </file>ย |
- | console.error('โ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ:', | + | ย |
- | process.exit(1); // ์ ํ๋ฆฌ์ผ์ด์
์ข
๋ฃ | + | ==== 2) ๋ก๊น ๋ฏธ๋ค์จ์ด ====ย |
+ | ย | ||
+ | < | ||
+ | // ์์ฒญ ๋ก๊น ๋ฏธ๋ค์จ์ดย | ||
+ | app.use((req, res, next) => {ย | ||
+ | console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);ย | ||
+ | next(); | ||
}); | }); | ||
- | // ์ฒ๋ฆฌ๋์ง ์์ Promise ๊ฑฐ๋ถ(reject) ๋ฐ์ ์ ํธ์ถย | + | // ์๋ฌ ๋ก๊น ๋ฏธ๋ค์จ์ดย |
- | process.on(' | + | app.use((err, req, res, next) => {ย |
- | console.error(' | + | console.error(' |
- | | + | |
}); | }); | ||
- | </code> | + | </file>ย |
+ | ย | ||
+ | ==== 3) ๋๋ฒ๊น ๋๊ตฌ ====ย | ||
+ | ย | ||
+ | **Node.js ๋ด์ฅ ๋๋ฒ๊ฑฐ ์ฌ์ฉ:**ย | ||
+ | <file bash>ย | ||
+ | node --inspect server.jsย | ||
+ | </ | ||
+ | ย | ||
+ | **Chrome DevTools์์ ๋๋ฒ๊น
: | ||
+ | * Chrome ๋ธ๋ผ์ฐ์ ์ด๊ธฐย | ||
+ | * %%chrome:// | ||
+ | * "Open dedicated DevTools for Node" ํด๋ฆญ | ||
---- | ---- | ||
- | ==== 7. ์ฑ๋ฅ ์ต์ ํ ====ย | + | ===== 10. ์ฑ๋ฅ ์ต์ ํ ===== |
- | Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ ๊ธฐ๋ฒ๋ค์ ์ค๋ช ํฉ๋๋ค. | + | |
- | === 1) ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ | + | ==== 1) ์์ถ ์ค์ ====ย |
- | ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์
์ ๋ช
์์ ์ผ๋ก ์คํํ์ฌ ๋ฉ๋ชจ๋ฆฌ | + | ย |
+ | <file javascript> | ||
+ | const compression = require(' | ||
+ | ย | ||
+ | // ์๋ต ์์ถ ๋ฏธ๋ค์จ์ดย | ||
+ | app.use(compression()); | ||
+ | </ | ||
+ | ย | ||
+ | ==== 2) ์บ์ฑ ์ค์ ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // ์ ์ ํ์ผ ์บ์ฑย | ||
+ | app.use(express.static(path.join(dirname, | ||
+ | maxAge: ' | ||
+ | etag: true // ETag ์ฌ์ฉย | ||
+ | }));ย | ||
+ | </ | ||
+ | ย | ||
+ | ==== 3) ์์ฒญ ์ ํ ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | const rateLimit = require(' | ||
+ | ย | ||
+ | // API ์์ฒญ ์ ํย | ||
+ | const limiter = rateLimit({ย | ||
+ | windowMs: 15 * 60 * 1000, // 15๋ถย | ||
+ | max: 100, // IP๋น ์ต๋ 100๊ฐ ์์ฒญย | ||
+ | message: ' | ||
+ | });ย | ||
+ | ย | ||
+ | app.use('/ | ||
+ | </ | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 11. ๋ณด์ ์ค์ =====ย | ||
+ | ย | ||
+ | ==== 1) Helmet ๋ฏธ๋ค์จ์ด ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | const helmet = require(' | ||
- | < | + | // ๋ณด์ ํค๋ ์ค์ ย |
- | // 30์ด๋ง๋ค ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ๋ช ์์ ์ผ๋ก ์คํย | + | app.use(helmet({ย |
- | setInterval(() => {ย | + | |
- | | + | directives: {ย |
- | if (global.gc) {ย | + | defaultSrc: ["'self'"],ย |
- | | + | styleSrc: ["'self'", |
- | | + | scriptSrc: ["' |
+ | | ||
+ | | ||
+ | | ||
} | } | ||
- | }, 30000); // 30000 ๋ฐ๋ฆฌ์ด = 30์ดย | + | }));ย |
- | </code> | + | </file> |
- | === 2) ํด๋ฌ์คํฐ ๋ชจ๋ | + | ==== 2) CORS ์ค์ ==== |
- | Node.js๋ ๋จ์ผ ์ค๋ ๋ ๊ธฐ๋ฐ์ด์ง๋ง, | + | |
<file javascript> | <file javascript> | ||
- | const cluster | + | const cors = require(' |
- | const numCPUs = require(' | + | |
- | // ํ์ฌ ํ๋ก์ธ์ค๊ฐ ๋ง์คํฐ ํ๋ก์ธ์ค์ธ์ง ํ์ธย | + | // CORS ์ค์ ย |
- | if (cluster.isMaster) | + | app.use(cors({ย |
- | | + | |
+ | ? [' | ||
+ | : [' | ||
+ | credentials: | ||
+ | }));ย | ||
+ | </ | ||
+ | ย | ||
+ | ==== 3) ์ ๋ ฅ ๋ฐ์ดํฐ ๊ฒ์ฆ ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // ์ ๋ ฅ ๋ฐ์ดํฐ ๊ฒ์ฆ ์์ ย | ||
+ | app.post('/ | ||
+ | const { gameType, settings } = req.body; | ||
| | ||
- | // CPU ์ฝ์ด | + | // ํ์ ํ๋ ๊ฒ์ฆย |
- | | + | |
- | | + | |
} | } | ||
| | ||
- | // ์์ปค ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋ (์: ์์ธ ๋ฐ์ ๋๋ ์๋ ์ข ๋ฃ)ย | + | // ๋ฐ์ดํฐ ํ์ ๊ฒ์ฆย |
- | | + | |
- | | + | |
- | cluster.fork(); | + | }ย |
- | });ย | + | ย |
- | } else {ย | + | // ์ถ๊ฐ ์ฒ๋ฆฌ...ย |
- | | + | }); |
- | // ์ด ๊ฒฝ์ฐ ' | + | |
- | require(' | + | |
- | } | + | |
</ | </ | ||
---- | ---- | ||
- | ==== 8. ๊ด๋ จ ๋ฌธ์ | + | ===== 12. ๋ค์ ๋จ๊ณ |
- | * [[wiki: | + | ย |
- | | + | '' |
- | | + | ย |
+ | * **'' | ||
+ | * **'' | ||
+ | * **๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋** - '' | ||
+ | * **์ธ์ฆ ์์คํ
** - '' | ||
+ | * **ํ
์คํธ ์์ฑ** - '' | ||
+ | ย | ||
+ | **์ถ์ฒ ํ์ต ์์:**ย | ||
+ | - [[wiki: | ||
+ | | ||
+ | | ||
--- | --- | ||
//์ด ํ์ด์ง๋ ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค.// | //์ด ํ์ด์ง๋ ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค.// | ||
--- | --- | ||
+ |
wiki/it/dream_of_enc/metaverse/nodejs.1753769599.txt.gz ยท ๋ง์ง๋ง์ผ๋ก ์์ ๋จ: ์ ์ syjang0803