wiki:it:dream_of_enc:metaverse:nodejs
์ฐจ์ด
๋ฌธ์์ ์ ํํ ๋ ํ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ค์ ํ | ์ด์ ํ | ||
wiki:it:dream_of_enc:metaverse:nodejs [2025/07/28 05:57] โ ๋ง๋ฆ - ๋ฐ๊นฅ ํธ์ง 127.0.0.1 | 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. Node.js๋ ๋ฌด์์ธ๊ฐ์? ===== | ||
- | ์ด ํ๋ก์ ํธ๋ | + | '' |
- | ===== ๐๏ธ | + | **์ฃผ์ ํน์ง:**ย |
+ | * '' | ||
+ | * ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ฐ์ ์ด ์์ต๋๋ค.ย | ||
+ | * '' | ||
+ | * ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค. | ||
- | **๋ฉ์ธ ์๋ฒ ํ์ผ (server.js): | + | ----ย |
- | <code javascript> | + | ===== 2. ํ๋ก์ ํธ ๊ฐ์ =====ย |
+ | ย | ||
+ | ์ด ํ๋ก์ ํธ๋ '' | ||
+ | ย | ||
+ | **์ฃผ์ ๊ธฐ์ ์คํ:**ย | ||
+ | * **'' | ||
+ | * **'' | ||
+ | * **'' | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 3. ์๋ฒ ๊ตฌ์กฐ ๋ฐ ์ฃผ์ ํ์ผ =====ย | ||
+ | ย | ||
+ | Phaser Baduk Metaverse ํ๋ก์ ํธ์ ํต์ฌ ์๋ฒ ํ์ผ์ธ '' | ||
+ | ย | ||
+ | ==== 1) ์ด๊ธฐ ์ค์ ๋ฐ ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ ====ย | ||
+ | ย | ||
+ | ์๋ฒ | ||
+ | ย | ||
+ | <file javascript> | ||
+ | const express = require(' | ||
+ | const http = require(' | ||
+ | const socketIo = require(' | ||
+ | const path = require(' | ||
+ | </ | ||
+ | ย | ||
+ | **๊ฐ ๋ชจ๋์ ์ญํ :**ย | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ==== 2) ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค ์์ฑ ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | const app = express(); // Express ์ ํ๋ฆฌ์ผ์ด์ ์์ฑย | ||
+ | const server = http.createServer(app); | ||
+ | const io = socketIo(server); | ||
+ | </ | ||
+ | ย | ||
+ | **์ค๋ช
: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ==== 3) ์ ์ ํ์ผ ์๋น ๋ฐ ๋ผ์ฐํ ====ย | ||
+ | ย | ||
+ | ํด๋ผ์ด์ธํธ(ํ๋ก ํธ์๋)์ ์ ๊ณต๋ ์ ์ ํ์ผ('' | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // ' | ||
+ | app.use(express.static(path.join(dirname, | ||
+ | ย | ||
+ | // ๋ฃจํธ ๊ฒฝ๋ก('/' | ||
+ | app.get('/', | ||
+ | res.sendFile(path.join(dirname, | ||
+ | });ย | ||
+ | </ | ||
+ | ย | ||
+ | **์ค๋ช
: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ==== 4) Socket.IO ์ด๋ฒคํธ ์ฒ๋ฆฌ ====ย | ||
+ | ย | ||
+ | ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ค์๊ฐ ํต์ ์ ๋ด๋นํ๋ '' | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // Socket.IO ์ฐ๊ฒฐ ์ด๋ฒคํธ ์ฒ๋ฆฌย | ||
+ | io.on(' | ||
+ | // ์๋ก์ด ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ๋ ๋๋ง๋ค ์คํย | ||
+ | console.log(' | ||
+ | ย | ||
+ | // ' | ||
+ | socket.on(' | ||
+ | socket.join(gameId); | ||
+ | console.log(`ํ๋ ์ด์ด๊ฐ ๊ฒ์ ${gameId}์ ์ฐธ๊ฐํ์ต๋๋ค.`); | ||
+ | });ย | ||
+ | ย | ||
+ | // ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ํด์ ์ ์คํย | ||
+ | socket.on(' | ||
+ | console.log(' | ||
+ | });ย | ||
+ | });ย | ||
+ | </ | ||
+ | ย | ||
+ | **์ค๋ช
: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ย | ||
+ | ==== 5) ์๋ฒ ํฌํธ ์ค์ ๋ฐ ์คํ ====ย | ||
+ | ย | ||
+ | ํ๊ฒฝ ๋ณ์์์ ํฌํธ ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ(3000)์ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฅผ ์ง์ ๋ ํฌํธ์์ ์คํํฉ๋๋ค.ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // ํ๊ฒฝ ๋ณ์์์ PORT๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๊ธฐ๋ณธ๊ฐ 3000 ์ฌ์ฉย | ||
+ | const PORT = process.env.PORT || 3000;ย | ||
+ | ย | ||
+ | // ์๋ฒ๋ฅผ ์ง์ ๋ ํฌํธ์์ ์คํํ๊ณ , | ||
+ | server.listen(PORT, | ||
+ | console.log(`์๋ฒ๊ฐ ํฌํธ ${PORT}์์ ์คํ ์ค์
๋๋ค.`); | ||
+ | console.log(`http:// | ||
+ | });ย | ||
+ | </ | ||
+ | ย | ||
+ | **์ค๋ช
: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * ์ฝ๋ฐฑ ํจ์๋ ์๋ฒ ์์ ์ฑ๊ณต ์ ์คํ๋๋ ํจ์์ ๋๋ค.ย | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 4. ์์กด์ฑ ๊ด๋ฆฌ (package.json) =====ย | ||
+ | ย | ||
+ | ํ๋ก์ ํธ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ๋ '' | ||
+ | ย | ||
+ | ==== 1) ํ๋ก์ ํธ ์ ๋ณด ====ย | ||
+ | ย | ||
+ | ^ ํค ^ ์ค๋ช ^ย | ||
+ | | name | ํ๋ก์ ํธ ์ด๋ฆ |ย | ||
+ | | version | ํ๋ก์ ํธ ๋ฒ์ |ย | ||
+ | | description | ํ๋ก์ ํธ์ ๋ํ ๊ฐ๋ตํ ์ค๋ช |ย | ||
+ | | main | ํ๋ก์ ํธ์ ์ง์
์ ํ์ผ (์ฌ๊ธฐ์๋ '' | ||
+ | ย | ||
+ | ==== 2) ์คํฌ๋ฆฝํธ ====ย | ||
+ | ย | ||
+ | ์์ฃผ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ฅผ ๋จ์ถํ์ฌ ์ ์ํฉ๋๋ค.ย | ||
+ | ย | ||
+ | ^ ์คํฌ๋ฆฝํธ ^ ์ค๋ช ^ ๋ช ๋ น์ด ^ย | ||
+ | | start | ํ๋ก๋์
ํ๊ฒฝ์์ ์๋ฒ๋ฅผ ์์ํฉ๋๋ค. | '' | ||
+ | | dev | ๊ฐ๋ฐ ํ๊ฒฝ์์ '' | ||
+ | | pm2 | '' | ||
+ | ย | ||
+ | ==== 3) ์์กด์ฑ ๋ชฉ๋ก ====ย | ||
+ | ย | ||
+ | ^ ์์กด์ฑ ^ ๋ฒ์ ^ ์ค๋ช ^ย | ||
+ | | express | 4.18.2 | Node.js ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ |ย | ||
+ | | socket.io | 4.7.2 | ์ค์๊ฐ ์๋ฐฉํฅ ์น ์์ผ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ |ย | ||
+ | | cors | 2.8.5 | ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) ๋ฏธ๋ค์จ์ด |ย | ||
+ | | helmet | 7.0.0 | ๋ณด์ ํค๋ ์ค์ ๋ฏธ๋ค์จ์ด |ย | ||
+ | | compression | 1.7.4 | ์๋ต ์์ถ ๋ฏธ๋ค์จ์ด |ย | ||
+ | | express-rate-limit | 6.7.0 | ์์ฒญ ์ ํ ๋ฏธ๋ค์จ์ด |ย | ||
+ | ย | ||
+ | ==== 4) ๊ฐ๋ฐ ์์กด์ฑ ๋ชฉ๋ก ====ย | ||
+ | ย | ||
+ | ^ ์์กด์ฑ ^ ๋ฒ์ ^ ์ค๋ช ^ย | ||
+ | | 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 express = require(' | ||
const http = require(' | const http = require(' | ||
์ค 21: | ์ค 305: | ||
// ์ ์ ํ์ผ ์๋น | // ์ ์ ํ์ผ ์๋น | ||
- | app.use(express.static(path.join(__dirname, ' | + | app.use(express.static(path.join(dirname, ' |
- | // ๋ผ์ฐํธ | + | // ๊ธฐ๋ณธ |
app.get('/', | app.get('/', | ||
- | res.sendFile(path.join(__dirname, ' | + | res.sendFile(path.join(dirname, ' |
}); | }); | ||
- | // Socket.IO | + | // Socket.IO |
io.on(' | io.on(' | ||
console.log(' | console.log(' | ||
- | | ||
- | socket.on(' | ||
- | socket.join(gameId); | ||
- | console.log(`ํ๋ ์ด์ด๊ฐ ๊ฒ์ ${gameId}์ ์ฐธ๊ฐํ์ต๋๋ค.`); | ||
- | }); | ||
| | ||
socket.on(' | socket.on(' | ||
์ค 42: | ์ค 321: | ||
}); | }); | ||
+ | // ์๋ฒ ์์ | ||
const PORT = process.env.PORT || 3000; | const PORT = process.env.PORT || 3000; | ||
server.listen(PORT, | server.listen(PORT, | ||
console.log(`์๋ฒ๊ฐ ํฌํธ ${PORT}์์ ์คํ ์ค์
๋๋ค.`); | console.log(`์๋ฒ๊ฐ ํฌํธ ${PORT}์์ ์คํ ์ค์
๋๋ค.`); | ||
}); | }); | ||
- | </code> | + | </file> |
- | ===== ๐ฆ ์์กด์ฑ ๊ด๋ฆฌ ===== | + | ==== 4) package.json ์คํฌ๋ฆฝํธ ์ค์ |
- | **package.json ์ฃผ์ ์์กด์ฑ: | + | <file json> |
- | <code json> | + | |
{ | { | ||
- | " | + | " |
" | " | ||
- | " | + | " |
" | " | ||
" | " | ||
" | " | ||
" | " | ||
- | "pm2": "pm2 start server.js" | + | "test": "jest" |
}, | }, | ||
" | " | ||
" | " | ||
" | " | ||
- | " | + | " |
+ | " | ||
+ | " | ||
+ | " | ||
}, | }, | ||
" | " | ||
- | " | + | " |
+ | " | ||
} | } | ||
} | } | ||
- | </code> | + | </file> |
- | ===== ๐ง ํ๊ฒฝ ์ค์ | + | ----ย |
+ | ===== 8. ์๋ฒ ์คํ ๋ฐ ํ
์คํธ | ||
- | **ํ๊ฒฝ ๋ณ์ ์ค์ :**ย | + | ==== 1) ๊ฐ๋ฐ ๋ชจ๋๋ก ์๋ฒ ์คํ ==== |
- | <code bash>ย | + | |
- | # .env ํ์ผย | + | |
- | NODE_ENV=developmentย | + | |
- | PORT=3000ย | + | |
- | DB_PATH=./db.jsonย | + | |
- | </ | + | |
- | **๊ฐ๋ฐ ํ๊ฒฝ ์คํ:**ย | + | <file bash> |
- | <code bash>ย | + | |
- | # ๊ฐ๋ฐ ๋ชจ๋ (nodemon ์ฌ์ฉ) | + | |
npm run dev | npm run dev | ||
+ | </ | ||
- | # ํ๋ก๋์ ๋ชจ๋ | + | **์ค๋ช
: |
+ | * '' | ||
+ | * ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก ์๋ฒ๊ฐ ์ฌ์์๋ฉ๋๋ค.ย | ||
+ | * ๊ฐ๋ฐ ์ค์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.ย | ||
+ | ย | ||
+ | ==== 2) ํ๋ก๋์ ๋ชจ๋๋ก ์๋ฒ ์คํ ====ย | ||
+ | ย | ||
+ | <file bash> | ||
npm start | npm start | ||
- | </code> | + | </file> |
- | ===== ๐๏ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ ===== | + | **์ค๋ช
: |
+ | * '' | ||
+ | * ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก ์๋ฒ๋ฅผ ์ฌ์์ํด์ผ ํฉ๋๋ค.ย | ||
+ | * ์ค์ ์๋น์ค ํ๊ฒฝ์์ ์ฌ์ฉํฉ๋๋ค. | ||
- | **๊ฒ์ ๋ฐ์ดํฐ ์ ์ฅ์ (db.json):**ย | + | ==== 3) ์๋ฒ ํ ์คํธ ==== |
- | <code json>ย | + | |
- | {ย | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | }ย | + | |
- | }ย | + | |
- | </ | + | |
- | ===== ๐ ๋๋ฒ๊น ===== | + | **๋ธ๋ผ์ฐ์ ์์ ํ
์คํธ: |
+ | * ๋ธ๋ผ์ฐ์ ์ด๊ธฐย | ||
+ | * '' | ||
+ | * ์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์๋ตํ๋์ง ํ์ธ | ||
- | **๋ก๊ทธ ๋ ๋ฒจ ์ค์ :**ย | + | **ํฐ๋ฏธ๋์์ ํ ์คํธ:**ย |
- | <code javascript>ย | + | <file bash>ย |
- | // ๊ฐ๋ฐ ํ๊ฒฝ์์ ์์ธ ๋ก๊ทธ ์ถ๋ ฅย | + | curl http://localhost:3000ย |
- | if (process.env.NODE_ENV === ' | + | </file> |
- | console.log(' | + | |
- | console.log(' | + | |
- | }ย | + | |
- | </code> | + | |
- | **์๋ฌ ํธ๋ค๋ง: | + | ----ย |
- | <code javascript> | + | ===== 9. ๋๋ฒ๊น ๋ฐ ๋ก๊น =====ย |
- | process.on('uncaughtException', (err) => {ย | + | ย |
- | console.error('โ ์ฒ๋ฆฌ๋์ง ์์ ์์ธ:', | + | ==== 1) ์ฝ์ ๋ก๊น ====ย |
- | | + | ย |
+ | <file javascript> | ||
+ | // ๊ธฐ๋ณธ ๋ก๊น ย | ||
+ | console.log('์ผ๋ฐ ๋ฉ์์ง');ย | ||
+ | console.error(' | ||
+ | console.warn(' | ||
+ | ย | ||
+ | // ๊ฐ์ฒด ๋ก๊น ย | ||
+ | const gameData | ||
+ | console.log('๊ฒ์ ๋ฐ์ดํฐ:', | ||
+ | ย | ||
+ | // ์๊ฐ๊ณผ ํจ๊ป ๋ก๊น ย | ||
+ | console.log(`${new Date().toISOString()} - ์๋ฒ ์์๋จ`); | ||
+ | </ | ||
+ | ย | ||
+ | ==== 2) ๋ก๊น ๋ฏธ๋ค์จ์ด ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // ์์ฒญ ๋ก๊น ๋ฏธ๋ค์จ์ดย | ||
+ | app.use((req, | ||
+ | | ||
+ | next(); | ||
}); | }); | ||
- | process.on(' | + | // ์๋ฌ ๋ก๊น ๋ฏธ๋ค์จ์ดย |
- | console.error(' | + | app.use((err, req, res, next) => {ย |
+ | console.error(' | ||
+ | res.status(500).json({ error: ' | ||
}); | }); | ||
- | </code> | + | </file>ย |
+ | ย | ||
+ | ==== 3) ๋๋ฒ๊น ๋๊ตฌ ====ย | ||
+ | ย | ||
+ | **Node.js ๋ด์ฅ ๋๋ฒ๊ฑฐ ์ฌ์ฉ:**ย | ||
+ | <file bash>ย | ||
+ | node --inspect server.jsย | ||
+ | </ | ||
+ | ย | ||
+ | **Chrome DevTools์์ ๋๋ฒ๊น
: | ||
+ | * Chrome ๋ธ๋ผ์ฐ์ ์ด๊ธฐย | ||
+ | * %%chrome:// | ||
+ | * "Open dedicated DevTools for Node" ํด๋ฆญย | ||
+ | ย | ||
+ | ----ย | ||
+ | ===== 10. ์ฑ๋ฅ ์ต์ ํ =====ย | ||
+ | ย | ||
+ | ==== 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 | ||
- | **๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ:**ย | + | // ๋ณด์ ํค๋ ์ค์ ย |
- | <code javascript> | + | app.use(helmet({ย |
- | // ์ฃผ๊ธฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ | + | |
- | setInterval(() => {ย | + | |
- | | + | |
- | | + | styleSrc: ["' |
- | | + | scriptSrc: ["' |
+ | imgSrc: ["' | ||
+ | connectSrc: ["' | ||
+ | } | ||
} | } | ||
- | }, 30000); // 30์ด๋ง๋คย | + | }));ย |
- | </code> | + | </file> |
- | **ํด๋ฌ์คํฐ ๋ชจ๋:**ย | + | ==== 2) CORS ์ค์ ==== |
- | <code javascript> | + | |
- | const cluster | + | |
- | const numCPUs | + | |
- | if (cluster.isMaster) {ย | + | <file javascript> |
- | | + | const cors = require(' |
+ | ย | ||
+ | // CORS ์ค์ ย | ||
+ | app.use(cors({ย | ||
+ | origin: | ||
+ | ? [' | ||
+ | : [' | ||
+ | credentials: | ||
+ | }));ย | ||
+ | </ | ||
+ | ย | ||
+ | ==== 3) ์ ๋ ฅ ๋ฐ์ดํฐ ๊ฒ์ฆ ====ย | ||
+ | ย | ||
+ | <file javascript> | ||
+ | // ์ ๋ ฅ ๋ฐ์ดํฐ ๊ฒ์ฆ ์์ ย | ||
+ | app.post('/ | ||
+ | const { gameType, settings } = req.body; | ||
| | ||
- | // ์์ปค ํ๋ก์ธ์ค ์์ฑย | + | // ํ์ ํ๋ ๊ฒ์ฆย |
- | | + | |
- | | + | |
} | } | ||
| | ||
- | | + | |
- | | + | if (typeof gameType !== 'string') {ย |
- | cluster.fork(); | + | |
- | });ย | + | }ย |
- | } else {ย | + | ย |
- | // ์์ปค ํ๋ก์ธ์ค์์ ์๋ฒ ์คํย | + | // ์ถ๊ฐ ์ฒ๋ฆฌ...ย |
- | require(' | + | });ย |
- | }ย | + | </file> |
- | </code> | + | |
- | ===== ๐ ๊ด๋ จ ๋ฌธ์ | + | ----ย |
+ | ===== 12. ๋ค์ ๋จ๊ณ | ||
- | | + | '' |
- | | + | ย |
- | | + | |
+ | * **'' | ||
+ | * **๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋** - '' | ||
+ | * **์ธ์ฆ ์์คํ
** - '' | ||
+ | * **ํ
์คํธ ์์ฑ** - '' | ||
+ | ย | ||
+ | **์ถ์ฒ ํ์ต ์์:**ย | ||
+ | - [[wiki: | ||
+ | | ||
+ | | ||
--- | --- | ||
- | //์ด ํ์ด์ง๋ ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค.// | + | //์ด ํ์ด์ง๋ ์๋์ผ๋ก ์์ฑ๋์์ต๋๋ค.// |
+ | ---ย |
wiki/it/dream_of_enc/metaverse/nodejs.1753682235.txt.gz ยท ๋ง์ง๋ง์ผ๋ก ์์ ๋จ: ์ ์ 127.0.0.1