๐Node.js ์์ฝ ์ด์ ๋ฆฌ ๊น์ง
NODE.JS
๐ npm
Major(์ฃผ ๋ฒ์ ), Minor(๋ถ ๋ฒ์ ), Patch(์ ๋ฒ์ )
- Major๋ ํ์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ ์์ ์ฌํญ์ด ์๊ฒผ์ ๋ ์ฌ๋ฆผ
- Minor๋ ํ์ ๋ฒ์ ๊ณผ ํธํ๋๋ ์์ ์ฌํญ์ด ์๊ฒผ์ ๋ ์ฌ๋ฆผ
- Patch๋ ๊ธฐ๋ฅ์ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ์ ๋ ์ฌ๋ฆผ
๐ os ๋ชจ๋
CPU๋ ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ์ฉ๋์ด ์ผ๋ง๋ ๋จ์๋์ง ํ์ธ์ด ํ์ํ ๋ ์ฌ์ฉ
๐ process ๋ชจ๋
- proces.cwd() : node๋ช ๋ น์ ํธ์ถํ ์์ ๋๋ ํฐ๋ฆฌ์ ์ ๋๊ฒฝ๋ก. ๋ง์ผ C: > node Users/ano/temp/directory.js ์ผ ๊ฒฝ์ฐ C: ๊ฐ ํธ์ถ ๊ฒฝ๋ก
- process.env : ํ๊ฒฝ๋ณ์
- process.nextTick : ๊ฐ์ฅ ๋จผ์ ์คํํ๋ ์ด๋ฒคํธ ์ฝ๋ฐฑ. setTimeout < promise < nextTick
๐ Event ๋ชจ๋
// events ๋ชจ๋ ์ฌ์ฉ
var events = require('events');
// EventEmitter ๊ฐ์ฒด ์์ฑ
var eventEmitter = new events.EventEmitter();
// EventHandler ํจ์ ์์ฑ
var connectHandler = function connected(){
console.log("Connection Successful");
// data_recevied ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๊ธฐ
eventEmitter.emit("data_received");
}
// connection ์ด๋ฒคํธ์ connectHandler ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฐ๋
eventEmitter.on('connection', connectHandler);
// data_received ์ด๋ฒคํธ์ ์ต๋ช
ํจ์์ ์ฐ๋
// ํจ์๋ฅผ ๋ณ์์์ ๋ด๋ ๋์ ์, .on() ๋ฉ์๋์ ์ธ์๋ก ์ง์ ํจ์๋ฅผ ์ ๋ฌ
eventEmitter.on('data_received', function(){
console.log("Data Received");
});
// connection ์ด๋ฒคํธ ๋ฐ์์ํค๊ธฐ
eventEmitter.emit('connection');
console.log("Program has ended");
๐ path ๋ชจ๋
path ๋ชจ๋์ ์ด์์ฒด์ ๋ณ๋ก ๊ฒฝ๋ก ๊ตฌ๋ถ์๊ฐ ๋ฌ๋ผ ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅ
- path.dirname(๊ฒฝ๋ก): ํ์ผ์ด ์์นํ ํด๋ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- path.extname(๊ฒฝ๋ก): ํ์ผ์ ํ์ฅ์๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- path.basename(๊ฒฝ๋ก, ํ์ฅ์): ํ์ผ์ ์ด๋ฆ(ํ์ฅ์ ํฌํจ)์ ๋ณด์ฌ์ค๋๋ค. ํ์ผ์ ์ด๋ฆ๋ง ํ์ํ๊ณ ์ถ๋ค๋ฉด basename์ ๋ ๋ฒ์งธ ์ธ์๋ก ํ์ผ์ ํ์ฅ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
- path.join(๊ฒฝ๋ก, .. .): ์ฌ๋ฌ ์ธ์๋ฅผ ๋ฃ์ผ๋ฉด ํ๋์ ๊ฒฝ๋ก๋ก ํฉ์ณ์ค๋๋ค. ์๋๊ฒฝ๋ก์ธ ..(๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ)๊ณผ .(ํ ์์น)๋ ์์์ ์ฒ๋ฆฌํด์ค๋๋ค.
๐ utility ๋ชจ๋
- util.deprecate: ํจ์๊ฐ deprecated ์ฒ๋ฆฌ๋์์์ ์๋ ค์ค๋๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฃ์ ํจ์๋ฅผ ์ฌ์ฉํ์ ๋ ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๋ ๋ฒ์งธ ์ธ์๋ก ๊ฒฝ๊ณ ๋ฉ์์ง ๋ด์ฉ์ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค. ํจ์๊ฐ ์กฐ๋ง๊ฐ ์ฌ๋ผ์ง๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋ ์๋ ค์ค ์ ์์ด ์ ์ฉํฉ๋๋ค. - util.promisify: ์ฝ๋ฐฑ ํจํด์ ํ๋ก๋ฏธ์ค ํจํด์ผ๋ก ๋ฐ๊ฟ์ค๋๋ค.
๋ฐ๊ฟ ํจ์๋ฅผ ์ธ์๋ก ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋ฐ๊พธ์ด๋๋ฉด async/await ํจํด๊น์ง ์ฌ์ฉํ ์ ์์ด ์ข์ต๋๋ค.
๋จ, ์ฝ๋ฐฑ ํํ๊ฐ (error, data) => { } ํ์์ด์ด์ผ ํฉ๋๋ค. ๋คํํ ๋ ธ๋์ ๋๋ถ๋ถ ๋ฉ์๋๋ ์ ๋ ๊ฒ ๋์ด์์ต๋๋ค.
๐ fs ๋ชจ๋
๐ ๋ฒํผ / ์คํธ๋ฆผ / ํ์ดํ
๋ฒํผ : ์ผ์ ํ ํฌ๊ธฐ๋ก ๋ชจ์๋๋ ๋ฐ์ดํฐ
์คํธ๋ฆผ : ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด ๋ฒํผ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ณด๋ด์ผ ํ๋ค๋ฉด ๊ทธ๊ฒ ์คํธ๋ฆผ
ํ์ดํ : ๋ฒํผ ์ฒ๋ฆฌ๋ฅผ ํ์ดํ ์ฒ๋ผ ์ฐ๊ฒฐ
๐ url ๋ชจ๋
๐ ์์ธก ๋ถ๊ฐ๋ฅํ ์๋ฌ ์ฒ๋ฆฌํ๊ธฐ (์ตํ์ ์๋จ)
// uncaughtException ์ด ๋ชจ๋ ์๋ฌ๋ฅผ ์ก์์ฃผ์ง๋ ์์.
// ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ๋ณต๊ตฌ ์ฝ๋๋ฅผ ๋ฃ๋๊ฑด ๋น์ถ์ฒํจ.
// ๋จ์ํ ์๋ฌ ๋ฐ์ ํ์ธ์ฉ์ผ๋ก๋ง ์ฌ์ฉ
process.on('uncaughtException', err => {
console.error("์๊ธฐ์น ๋ชปํ ์๋ฌ ", err);
})
EXPRESS.JS
๐ morgan ๋ฏธ๋ค์จ์ด
morgan์ ์์ฒญ๊ณผ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ์์ธํ ์ฝ์์ ๊ธฐ๋ก
๐ cookie-parser ๋ฏธ๋ค์จ์ด
- cookie-parser๋ ์์ฒญ๊ณผ ํจ๊ป ๋ค์ด์จ ์ฟ ํค๋ฅผ ํด์ํ์ฌ ๊ณง๋ฐ๋ก req.cookies๊ฐ์ฒด๋ก ๋ง๋ ๋ค.
- ์๋ช ๋ ์ฟ ํค๋ req.cookies ๋์ req.signedCookies ๊ฐ์ฒด์ ๋ค์ด๊ฐ๋ค.
- ์ฟ ํค๋ฅผ ๊ฐ์ธ ์ ์ฅ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ ์๋ ์๋ค. ์ด๋ฅผ ์ด์ฉํด ์ผํ๋ชฐ ์ถ์ฒ ๋ชฉ๋ก, ๊ด๊ณ ํ์ ๋ฑ์ผ๋ก ์ฌ์ฉ๋๋ค.
๐ body-parser ๋ฏธ๋ค์จ์ด
ํผ ๋ฐ์ดํฐ ๋๋ AJAX ์์ฒญ์ผ๋ก ์จ POST ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋ฌ๋ ๋ฉํฐํํธ (์ด๋ฏธ์ง, ๋์์. ํ์ผ) ๋ฐ์ดํฐ๋ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค. ๊ทธ ๊ฒฝ์ฐ multer ๋ชจ๋์ ์ฌ์ฉํ๋ค.
๐ static ๋ฏธ๋ค์จ์ด
๊ธฐ๋ณธ ๊ฒฝ๋ก์ธ / ๋ก ์์ ๋, express๋ public ํด๋ ์์ ์๋ ํด๋น ๊ฒฝ๋ก์ ํ์ผ์ ์ฐพ๋๋ค.
app.use('/', express.static(path.join(__dirname, 'public')));
๐ expression-session ๋ฏธ๋ค์จ์ด
์ธ์ ๊ด๋ฆฌ์ฉ ๋ฏธ๋ค์จ์ด.
๋ก๊ทธ์ธ ๋ฑ์ ์ด์ ๋ก ์ธ์ ์ ๊ตฌํํ๊ฑฐ๋, ํน์ ์ฌ์ฉ์๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฅผ ์์์ ์ผ๋ก ์ ์ฅํด๋ ๋ ๋งค์ฐ ์ ์ฉํ๋ค.
์ธ์ ์ ์ฌ์ฉ์๋ณ๋ก req.session ๊ฐ์ฒด ์์ ์ ์ง๋๋ค.
+ Session Store
์ธ์ ์คํ ์ด๋ ์ธ์ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณณ์ ๋งํ๋ค.
๋ํ์ ์ผ๋ก Memory Store, File Store, Mongo Store ๊ฐ ์๋ค. ๋ณดํต Redis๋ฅผ ์ด์ฉํ๋ค.
๐ multer ๋ฏธ๋ค์จ์ด
์ด๋ฏธ์ง, ๋์์ ๋ฑ์ ๋น๋กฏํ ์ฌ๋ฌ ๊ฐ์ง ํ์ผ๋ค์ ๋ฉํฐํํธ ํ์์ผ๋ก ์ ๋ก๋ํ ๋ ์ฌ์ฉํ๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
๋ฉํฐํํธ ํ์์ด๋ enctype์ด multipart/form-data ์ธ ํผ์ ํตํด ์ ๋ก๋ํ๋ ๋ฐ์ดํฐ์ ํ์์ ์๋ฏธํ๋ค.
const upload = multer({
storage: multer.diskStorage({ // ์ ์ฅํ๊ณต๊ฐ ์ ๋ณด : ํ๋๋์คํฌ์ ์ ์ฅ
destination(req, file, done) { // ์ ์ฅ ์์น
done(null, 'uploads/'); // uploads๋ผ๋ ํด๋ ์์ ์ ์ฅ
},
filename(req, file, done) { // ํ์ผ๋ช
์ ์ด๋ค ์ด๋ฆ์ผ๋ก ์ฌ๋ฆด์ง
const ext = path.extname(file.originalname); // ํ์ผ์ ํ์ฅ์
done(null, path.basename(file.originalname, ext) + Date.now() + ext); // ํ์ผ์ด๋ฆ + ๋ ์ง + ํ์ฅ์ ์ด๋ฆ์ผ๋ก ์ ์ฅ
}
}),
limits: { fileSize: 5 * 1024 * 1024 } // 5๋ฉ๊ฐ๋ก ์ฉ๋ ์ ํ
});
// => ์ด๋ ๊ฒ ์ค์ ํ upload๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ผ์ฐํฐ์ ์ฅ์ฐฉํ๋ฉด ๋๋ค.
- upload.single() : ๋ฏธ๋์ด ํ์ผ ํ๋ ์ ๋ก๋
- upload.array() : ๋ฏธ๋์ด ํ์ผ ์ฌ๋ฌ๊ฐ๋ฅผ ๋์์ ์ ๋ก๋
- upload.field() : ๋ฏธ๋์ด ํ์ผ ํ๋ํ๋์ฉ ์ ๋ก๋ ๋ฐ๋ก๋ฐ๋ก
- upload.none() : ๋ฏธ๋์ด ํ์ ์ด ์๋ ๊ฑฐ
๐ dotenv ๋ฏธ๋ค์จ์ด
dotenv๋ ํ๊ฒฝ๋ณ์๋ฅผ .envํ์ผ์ ์ ์ฅํ๊ณ process.env๋ก ๋ก๋ํ๋ ์์กด์ฑ ๋ชจ๋์ด๋ค.
๐ ๋ผ์ฐํฐ
next('route') ๋ผ๋ ์ฝ๋๋ก ์ฌ์ฉํ๋ฉฐ, ๋ผ์ฐํฐ์ ์ฐ๊ฒฐ๋ ๋๋จธ์ง ๋ฏธ๋ค์จ์ด๋ค์ ๊ฑด๋๋ฐ๊ณ ์ถ์ ๋ ์ฌ์ฉ
req.params.id : ๋ผ์ฐํฐ ๋งค๊ฐ๋ณ์. '/user/:id'
router.route(์ฃผ์).get().post() : ๋ผ์ฐํฐ ๊ทธ๋ฃนํ
๐ req, res ๊ฐ์ฒด ์ ๋ฆฌ
[response]
- res.app: ๋๊ฐ์ด res ๊ฐ์ฒด๋ฅผ ํตํด app ๊ฐ์ฒด์ ์ ๊ทผํ๋ค. res.app.get('')๊ฐ์ด ์ฌ์ฉ ๊ฐ๋ฅ.
- res.cookie(ํค, ๊ฐ, ์ต์ ): ์ฟ ํค๋ฅผ ์๋ต์ ์ค์ ํ๋ ๋ฉ์๋์ด๋ค.
- res.clearCookie(ํค, ๊ฐ, ์ต์ ): ์ฟ ํค๋ฅผ ์๋ต์์ ์ ๊ฑฐํ๋ ๋ฉ์๋์ด๋ค.
- res.end(): ๋ฐ์ดํฐ ์์ด ์๋ต์ ๋ณด๋ธ๋ค.
- res.json(JSON): JSON ํ์์ ์๋ต์ ๋ณด๋ธ๋ค.
- res.redirect(์ฃผ์): ๋ฆฌ๋ค์ด๋ ํธํ ์ฃผ์์ ํจ๊ป ์๋ต์ ๋ณด๋ธ๋ค.
- res.render(๋ทฐ, ๋ฐ์ดํฐ): ํ ํ๋ฆฟ ์์ง์ ๋ ๋๋งํ์ฌ ์๋ตํ ๋ ์ฌ์ฉํ๋ ๋ฉ์๋์ด๋ค.
- res.send(๋ฐ์ดํฐ): ๋ฐ์ดํฐ์ ํจ๊ป ์๋ต์ ๋ณด๋ธ๋ค. ๋ฐ์ดํฐ๋ ๋ฌธ์์ด, HTML, ๋ฒํผ, ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ์ด ๋ ์ ์๋ค.
- res.sendFile(๊ฒฝ๋ก): ๊ฒฝ๋ก์ ์์นํ ํ์ผ์ ์๋ตํ๋ค.
- res.set(ํค๋, ๊ฐ) / res.setHeader(ํค๋, ๊ฐ): ์๋ต์ ํค๋๋ฅผ ์ค์ ํ๋ค. req.get()์ด ํค๋๊ฐ์ ๊ฐ์ ธ์ค๋๊ฑฐ๋ผ๋ฉด ์ด๊ฑด ํค๋ ์ค์
- res.status(์ฝ๋): ์๋ต ์์ HTTP ์ํ ์ฝ๋๋ฅผ ์ง์ ํ๋ค.
res.end()
res.json(JSON)
res.redirect(์ฃผ์)
res.render(๋ทฐ, ๋ฐ์ดํฐ)
res.send(๋ฐ์ดํฐ)
res.sendFile(๊ฒฝ๋ก)
๋ ๊ฐ ๋ผ์ฐํฐ์ ๋ฐ๋์ ํ๋ฒ๋ง ์จ์ผ๋๋๊ฑด ์์ง๋ง์.
[request]
- req.app: req ๊ฐ์ฒด๋ฅผ ํตํ app ๊ฐ์ฒด๋ก์ ์ ๊ทผ์ด๋ค. ์๋ฅผ ๋ค์ด req.app.get('port')์ ๊ฐ์ ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- req.body: body-parser ๋ฏธ๋ค์จ์ด๊ฐ ๋ง๋๋ ์์ฒญ์ ๋ณธ๋ฌธ์ ํด์ํ ๊ฐ์ฒด์ด๋ค.
- req.cookies: cookie-parser ๋ฏธ๋ค์จ์ด๊ฐ ๋ง๋๋ ์์ฒญ์ ์ฟ ํค๋ฅผ ํด์ํ ๊ฐ์ฒด์ด๋ค.
- req.ip: ์์ฒญ์ ip ์ฃผ์๋ฅผ ๋ด๋๋ค.
- req.params: ๋ผ์ฐํธ ๋งค๊ฐ๋ณ์์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด๋ค.
- req.query: ์ฟผ๋ฆฌ์คํธ๋ง์ ์ ๋ณด๊ฐ ๋ด๊ธด๋ค.
- req.signedCookies: ์๋ช ๋ ์ฟ ํค๋ค์ req.cookies ๋์ ์ฌ๊ธฐ์ ๋ด๊ธด๋ค.
- req.get(ํค๋ ์ด๋ฆ): ํค๋์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. req.get('Content-type')