์ค๋์ ์ค์๊ฐ ๊ฐ์๊ฐ ์๋๋ผ ์ฝ๋๋ผ์ด์ธ์ '์ผ๋จ ๋ง๋๋ node.js'๋ฅผ ์๊ฐํ๋ ๋ ์ด์๋ค!! ํ๋ฃจ๋ง์ ๋ ธ๋๋ฅผ ๋ค ๋ฃ๋๋ค๊ณ ..? ๋ฐฑ์๋์ ใ ๋ ๋ชจ๋ฅด๋๋ฐ..? ์ถ์์ง๋ง, ๊ฐ์๋ฅผ ๋ฃ๋ค๋ณด๋ ์กฐ๊ธ์ ๊ฐ์ด ์๋ค. ์ด ๊ฐ์ ๋์น์ง ์๊ณ ๋ณต์ตํด์ผํ ๊ฒ ๊ฐ์์, ํซ ํ๋ก์ ํธ ๋ถ๋ถ์ ๋ณต์ต ๋๋๊ณ ์ด์ด์ ๋ฃ๊ธฐ๋ก ํ๊ณ ์ค๋ ๋ค์ CRUD ์๋ฒ ๋ง๋ค๊ธฐ๋ฅผ ๋ณต์ตํด๋ณด๋ ค๊ณ ํ๋ค.
Node.js๋ JavaScript ๋ฐํ์ (์คํํ ์ ์๋ ํ๊ฒฝ)์ด๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ
- Non-blocking I/O
- Single Thread
-> ์ด ํค์๋์ ๋ํด์ ์ ๋๋ก ์ค๋ช ํ ์ ์์ผ๋ฉด ์ ๋๋ก ์ดํดํ๊ณ ์๋ ๊ฒ์ด๋ค!! ์์ธํ ๋ด์ฉ์ #40 node.js ์ node.js์ ํน์ง๊ณผ ์ฅ๋จ์ ์ ์ถ๊ฐ๋ก ์ ๋ฆฌํ๋ค.
์ฝ๋ฐฑ ์ง์ฅ์์ ๋น ์ ธ๋์ค๊ธฐ ์ํ ๋ฌธ๋ฒ๋ค! #29 ๋น๋๊ธฐ ์ฒซ๊ฑธ์ ์์ ์ ๋ค์์์ง๋ง, ์์ง ๊ฐ๋ฐ์ ํ๋ฉด์ ์ฌ์ฉํด ๋ณผ ๊ธฐํ๋ ์์์ด์ ๋ค์ ์ ๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค.
Promise์ ์ํ
function sayHello() {
return new Promise((resolve, reject) => {
const hello = "Hello Hello";
resolve(hello);
// reject(new Error());
});
}
sayHello()
.then((resolvedData) => {
console.log(resolvedData);
// ์์์ return ํ๋ฉด ๋ค์ then์ ์ธ์๋ก ๋๊ฒจ์ง.
return resolvedData;
})
.then((resolvedData) => {
console.log(resolvedData);
return resolvedData;
})
.then((resolvedData) => {
console.log(resolvedData);
})
.catch((error) => {
console.log(error)
});
์ ์ ๋ค๋ค๋ ๊ฒ์ฒ๋ผ Promise๋ฅผ ์์ฑํ๊ณ then, catch, finally ๋ก ๋ค์์ ํ ์์ ์ ์ ์ด์ ์ํํ๋ค. ๊ทธ๋ฌ๋ then์ ๋๋ฌด ๋ง์ด ์ฐ๋ ๊ฒ๋ ์ฝ๊ธฐ ์ด๋ ต๊ณ ์ด๋ค ๋์์ ํ ์ง ์์ธกํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ async, await๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
async function test() { // await : ํด๋น ํจ์์ ์คํ์ด ๋๋ ๋ค์์ ๋ฐ์ ์๋ ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋ค. (๋๊ธฐ) // await๋ฅผ ์ฐ๋ ค๋ฉด ํจ์์ async๋ฅผ ๋ช ์ํด์ผ ํ๋ค. const hello1 = await sayHello(); console.log(hello1); } test();
- ์๋ฒ : ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ ์๋ต์ ํด์ฃผ๋ ์ฅ์น. literally server (์์ฒญ์ ๋ง๋ ์ ๋ณด๋ฅผ serve ํด ์ค๋ค.)
- localhost : ํ์ฌ ์ปดํจํฐ์ ๋ด๋ถ ์ฃผ์ - ์๋ฒ ๊ฐ๋ฐ ์ ํ ์คํธ ์ฉ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
1ํ๋ ํ๋ก์ ํธ ๊ณผ๋ชฉ ๋ค์๋, ์ํ์น + php๋ก localhost ๋ก๊ทธ์ธ์ฐฝ ๋ง๋ค์์๋๋ฐ ๊ทธ๊ฒ ์๋ฒ๋ฅผ ์ผ๊ณ ์ ์ํ๊ฑด์ง... 4๋ ๋ง์ ์์๋ค....- port : ์๋ฒ ๋ด์ ํ๋ก์ธ์ค ๋ฒํธ - ์๋ฒ์์๋ ๋ค์ํ ์ผ์ ๋ฉํฐ ํ๋ก์ธ์ค๋ก ์ํํ๊ธฐ ๋๋ฌธ์, ํฌํธ ๋ฒํธ๊ฐ ํ์ํ๋ค.
-> ๋ธ๋ผ์ฐ์ ๋ก ์ ๊ทผํ๋ฉด ์๋ฒ์ ์ผ๋ถ๋ถ์๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ Postman์ ์ค์นํด์ ์ฌ์ฉํ๋ค.
method, url, body ๋ฅผ ๋ฃ๊ณ ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ต์ด ์ด๋ป๊ฒ ์ค๋์ง ๋ณด์ฌ์ค๋ค. ์ฒ์์๋ ์ผ๋ ๋ฒ๋ ์ ์๋์ ๋ฐ๋ผ ์ค์นํ๋๋ฐ, UI๊ฐ ๊น๋ํด์ ๋ณด๊ธฐ ํธํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์์ฒญ์ ๋ํ ์๋ต์ ์ฒ๋ฆฌํด์ ๋ณด๋ด๋ ์์ ์๋ฒ์ด๋ค.
const http = require("http");
// http : ์๋ฒ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๊ฒ ํ๋ ๋ชจ๋.
http
// createServer : ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ , callback ํจ์๋ฅผ ํตํด ์์ฒญ, ์๋ต์ ์ฒ๋ฆฌํ๋ ํจ์.
.createServer((request, response) => {
// url์ ๋ฐ๋ฅธ ๋ถ๊ธฐ ์ฒ๋ฆฌ
if(request.url === "/") {
// ์๋ต์ 200๋ฒ(์ ๋ค์ด๊ฐ๋ฉด 200)์ ์จ์ ์ค๋ค.
response.writeHead(200);
// ์๋ต์ด ๋๋ ๋, "main url" ๋ ํจ๊ป ์ค๋ค.
// end์ ๋ด์ฉ์ ์์ฑํ๋ฉด http body์ ์ด ๋ด์ฉ์ด ๋ค์ด๊ฐ๋ค.
response.end("main url");
} else if (request.url === "/upload") {
response.writeHead(200);
response.end("upload url");
} else if (request.url === "/delete") {
response.writeHead(200);
response.end("delete url");
} else {
response.writeHead(404);
response.end("Not found!!");
}
}).listen(3000, () => {
console.log("port 3000 ์ ์ ์๋ฃ");
});
npm
- node.js๋ก ์ด๋ฏธ ๋ง๋ค์ด๋์ ํจํค์ง(ํ๋ก๊ทธ๋จ)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์, ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ํด!
- ํจํค์ง ์ค์๋ ์๋ก ์์กด์ฑ์ ๊ฐ์ง ๊ฒ๋ค๋ ์๊ณ , ๋ฒ์ ผ๋ง๋ค ๊ธฐ๋ฅ์ด ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์, package.json ์ ํตํด ๋ฒ์ ผ, ์์กด์ฑ์ ๊ณ ๋ คํ์ฌ ๊ด๋ฆฌํด์ค๋ค.
npm์ ์ฌ์ฉํด์ ํ๋ก์ ํธ ํด๋๋ฅผ ์ด๊ธฐํํ๊ณ , package์ ๋ํ ์ด๊ธฐ ์ค์ ์ ํด๋ณด์๋ค.
npm init
# ์ ์งํํ๋ฉด, package.json ์ ์ ๋ณด๋ฅผ ๋ฃ๋ ์ฐฝ์ด ๋ฌ๋ค.
# ๋๋ถ๋ถ์ ์ ๋ณด๋ฅผ ์์์ ์ฑ์์ค์ ํ๋ก์ ํธ ์ด๋ฆ๊ณผ ์ ์ ์ด๋ฆ์ ์ ์ธํ๊ณค ๊ทธ๋ฅ ๋น์ฐ๊ณ ์งํํ๋ค.
# ์
๋ ฅํ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก package.json ์ ์์ฑํด์ค๋ค.
// package.json
{
"name": "npm_test", // ์ด๋ฆ
"version": "1.0.0", // ํ๋ก์ ํธ ๋ฒ์ ผ
"description": "", // ์ค๋ช
"main": "index.js", // ์คํํ js ํ์ผ ์ด๋ฆ
"scripts": { // ํ
์คํธ๋ฅผ ํ๊ธฐ ์ํด ์
๋ ฅํ ๋ช
๋ น์ด
"test": "echo \"Error: no test specified\" && exit 1",
"hello": "echo hello"
},
// git repository : ์ฌ์ฉํ ๊น ์ ์ฅ์ ์ฃผ์
// keywords : ๋์ค์ ์ฐพ์ ๋ ์ฌ์ฉํ ํค์๋
"author": "EJ",
"license": "ISC"
}
npm run test # test command ์์ ์ค์ ํ ์ด๋ฆ์ผ๋ก ๋ถ๋ฅด๋ฉด, ํด๋น ๋์์ ํ๋ค.
npm run hello # hello
- express : ๋น ๋ฅด๊ณ ๊ฐํธํ ์น ํ๋ ์์ํฌ.
- framework : ์ฝ๋๋ฅผ ์งค ์ ์๋ 'frame', ๊ธฐ์ด ํ์ ๋ง๋ค์ด์ฃผ๋ ๊ฒ. ์ฝ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ณ , ์ ์ง๋ณด์๊ฐ ์ฝ๋ค. <-> library : ์ฝ๋๋ฅผ ์ด๋ฏธ ๋ง๋ค์ด ๋์ ๊ฒ. ๊ฐ์ ธ๋ค ์ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
- express-generator : express์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ค๋ค.
express ๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
# ์ฒ์์๋ ์ด๊ฒ ๋ฌด์จ ๋ง์ธ๊ฐ ํ๋๋ฐ, ๋ณต์ตํ๋ฉด์ ๋ค์ ๋ณด๋๊น ์ดํด๊ฐ ๊ฐ๋ค. bin/www - ์๋ฒ๋ฅผ ์คํํ๋ ํ์ผ. ์ฌ์ฉํ ํฌํธ ๋ฒํธ๋ฅผ ์ฌ๊ธฐ์ ์ง์ ๊ฐ๋ฅ. public/images js css - ๋ฆฌ์์ค ํ์ผ๋ค routes - ํ์ด์ง ๋ผ์ฐํ ๊ณผ ๊ด๋ จ๋ ํ์ผ ์ ์ฅ, ์ค์ ์๋ฒ ๋ก์ง ์์ฑ # ์ด๋ค url์ ์ ๋ ฅํ์ ๋ ์ด๋ค ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ์ด๋ค ๋์์ ํ ๊ฒ์ธ์ง๋ฅผ ๋งํ๊ณ , ์ค์ ๋ก ์ฐ๋ฆฌ ์ฝ๋๋ ๊ฑฐ์ ์ฌ๊ธฐ์ ์์ฑํ๋ค. views - ํ ํ๋ฆฟ ํ์ผ .jade .ejs : HTML ์์ <% js %> ์ฝ๋๋ฅผ ๋ฃ์ ์ ์๊ฒ ๋ง๋ค์ด์ง ํ์์ ํ์ผ์ด๋ค. #.ejs๊ฐ html๊ณผ ๋ ์ ์ฌํด์ ์ฐ๋ฆฌ๋ .ejs๋ฅผ ์ฌ์ฉํ๋ค. app.js - ํต์ฌ์ ์ธ ์๋ฒ ์ญํ . ๋ผ์ฐํ ์ ์์์ package.json - ์์กด์ฑ/๋ฒ์ ผ ๊ด๋ฆฌ
express ๋ฅผ ์ค์นํ๊ณ , ์๋ฒ๋ฅผ ์คํํด ๋ณด์๋ค.
npm install express
# package-lock.json : ์ค์นํ ๋ชจ๋ ํจํค์ง ํ์ผ ๋ฒ์ ผ ์ ๋ณด ์ ์ฅ
# node-modules : ๋ชจ๋ ์์กด์ฑ ์๋ ํจํค์ง๋ค์ ํด๋น ํด๋์ ๋ฃ์ด์ ๊ด๋ฆฌ
npm install -D nodemon
# -D : ๊ฐ๋ฐ ํ๊ฒฝ์์๋ง ์ฌ์ฉ (์ค์ ๋ฐฐํฌ ํ๊ฒฝ์์๋ ์ฌ์ฉ X)
sudo npm install -g express-generator nodemon
# -g : global ๋ชจ๋ ํจํค์ง์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ. ํ๋ฒ ์ค์นํด์ ์ฌ๋ฌ๊ฐ์ง ํ๋ก์ ํธํด์ ์ฌ์ฉ
sudo npm install -g express-generator
express --ejs first-project # views ํ์ผ์ ejs ํ์์ผ๋ก ์ฌ์ฉํ๊ฒ ๋ค.
cd first-project
npm install # package.json์ ์๋ ๋ชจ๋ ๊ฒ ์ค์น
npm start # express๋ก ๊ตฌ์ฑ๋ ์๋ฒ ์คํ.
index.ejs ๋ฅผ ์์ ํด์ express project ๊ธฐ๋ณธ ๋ฌธ๊ตฌ๋ฅผ ํ์ธํ ์ ์๋ค. ์๋๋ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ ๋ ๋ง๋ค ์๋ฒ๋ฅผ ๊ป๋ค ์ผ์ผ ํ๋๋ฐ, nodemon ./bin/www
์ผ๋ก ์๋ฒ๋ฅผ ์คํํ๋ฉด ์๋ฒ๋ฅผ ๊ป๋ค ์ผ์ง ์์๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋๋ค.
// ์ด๋ ๊ฒ ๋ฐ๊พธ๋ฉด npm start๋ก nodemon์ ์ฌ์ฉํ ์ ์๋ค.
"scripts": {
"start": "nodemon ./bin/www"
},
routing : ์์ฒญ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ. ๊ธธ ์ฐพ๊ธฐ!
express ํ๊ฒฝ์์๋ routing ์ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ์ค๊ณํ ์ ์๋ค.
// app.js
// url์ด / ์ด๋ฉด indexRouter๋ก, /users๋ฉด usersRouter์ ํด๋น ์์ฒญ์ ๋ณด๋ธ๋ค.
// ๋ค๋ก url์ด ๋ ๋ถ์ผ๋ฉด index.js, users.js ์์์ ์ฝ๋๋ฅผ ์์ฑํด์ ์ฒ๋ฆฌํ๋ค. 4์์ ๊ตฌํํ ๊ฒ์!
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
app.use('/', indexRouter);
app.use('/users', usersRouter);
CRUD (์๋ฒ์ ๊ธฐ๋ณธ)
- POST : CREATE - ์์ฒญ๋ ์์์ ์์ฑ
- GET : READ - ์์ฒญ๋ ์์์ ์ฝ์
- PUT : UPDATE - ์์ฒญ๋ ์์์ ์์
- DELETE : DELETE - ์์ฒญ๋ ์์์ ์ญ์
// GET, POST, PUT, DELETE ๋ฉ์๋๋ก data๋ฅผ ๋ณด๋ด๊ณ ๋ฐ์์ ์ฒ๋ฆฌํด๋ณด๋ ๊ฒ!
var express = require('express');
var router = express.Router();
// post, put, delete๋ฅผ ํ ๋ data๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด.
let arr = [];
/* GET home page. */
router.get('/read', (req, res) => {
res.status(200).json({
message: "read ์ฑ๊ณต"
});
});
// POST method
router.post('/create', (req, res) => {
// req.body.data ๋ request์์ ๋ณด๋ด๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
// request์ ๋ณด๋ธ๊ฒ { "key": "123" } ์ด๋ฉด req.body.key๋ก ๋ฝ์์ผํ๋ค.
// const data = req.body.data;
const { data } = req.body; // ๊ตฌ์กฐ๋ถํดํ ๋น์ผ๋ก ํ๋ฒ์ ๋ฝ๊ธฐ
arr.push(data);
res.status(200).json({
message: "create ์ฑ๊ณต",
result: arr // response์ data๋ ๊ฐ์ด ๋ด์์ ๋ณด๋ธ๋ค.
});
});
// PUT method
router.put("/update/:id", (req, res) => {
// update ํ๋ ค๋ฉด ๋ฐฐ์ด ์์ ๋ฐ์ดํฐ๊ฐ ๋ช๋ฒ์งธ์ธ์ง๋ฅผ ์์์ผ ํจ.
// router๋ฅผ ์ด์ฉํด์ ์๋ ค์ฃผ๋ ๊ณผ์ .
const { id } = req.params; // url์ ํฌํจ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ params์์ ๊ฐ์ ธ์จ๋ค. /update/0 ์ด๋ ๊ฒ ๋ ๋ฆฌ๋ฉด id = 0์ด ๋จ.
const { data } = req.body;
arr[id] = data;
res.status(200).json({
message: "update ์ฑ๊ณต",
result: arr
});
});
// DELETE method
router.delete("/delete/:id", (req, res) => {
const { id } = req.params;
arr.splice(id, 1); // ํด๋น id๋ถํฐ ํ๋๋ง ์ญ์ . splice๋ฅผ ์๋ฒ์์๋ ์ธ ์ ์๊ตฌ๋..!!!
res.status(200).json({
message: "delete ์ฑ๊ณต",
result: arr
});
});
module.exports = router;
request์ response ์ค๊ฐ์์ ์ฒ๋ฆฌํด์ฃผ๋ ํจ์๋ค.
ex) ๋ก๊ทธ์ธ ์ฒดํฌ : create, delete, update ๊ฐ์ ๋ก๊ทธ์ธ ํ์ ๋๋ง ์ํํ ์ ์๋ method๋ฅผ ๋ ๋ ธ์ ๋, ๊ฐ๊ฐ์ ๋ํด์ ๋ก๊ทธ์ธ์ ์ฒดํฌํ๋ ํจ์๋ฅผ ๋ง๋ค์ง ์๋๋ค. 3๊ฐ ๋ฉ์๋ ์ ์ฒด์ ๋ํด ํ๋์ ๋ก๊ทธ์ธ ์ฒดํฌํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ๋์ํ๋ค. ๊ทธ ํ๋์ ํจ์๋ฅผ middleware ๋ผ๊ณ ํ๋ค.
// app.js
// ์ด๋ค ์์ฒญ์ด ๋ค์ด์๋ middleware ํจ์๋ ํ๋ฒ์ ์คํ์ด ๋๋ค.
app.use((req, res, next) => {
console.log("middleware");
next();
});
์ด๋ค ์์ฒญ์ ํด๋ ์คํ์ด ๋๋ ๋ชจ์ต!
// middleware ํจ์.
// module ํด๋์ ๋ง๋ค๊ธฐ.
const loginCheck = (req, res, next) => {
const userLogin = true;
if (userLogin) {
next();
} else {
res.status(400).json({
message: "login fail!!",
});
}
};
module.exports = loginCheck;
์ฌ๊ธฐ์ module export ํ๋๊ฑธ export - import๋ก ๋ฐ๊ฟ๋ณด๊ณ ์ถ์๋ฐ ์๋ผ์ ํ์ฐธ ํค๋งธ๋๋ฐ... ๋ด๊ฐ ์๋ชปํ ๊ฒ ์๋์๋ค... package.json์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฑฐ์๋ค...
// index.js
router.get('/', loginCheck, (req, res) => {
res.status(200).json({
message: "login success",
});
});
multer package - form-data ํ์ผ์ ์ ๋ก๋ํ ๋ ์ ์ฉํ ํจํค์ง.
์ด๋ฏธ์ง ์ ๋ก๋ ์๋ฒ ๋ง๋ค๊ธฐ ์ค์ต์ ์งํํ๋ค.
npm install multer
upload.single("image");
// upload : ํ์ผ ์
๋ก๋ ๋ฐฉ์์ upload ์ ์ ์ฅ.
// single("image") : ํ์ผ 1๊ฐ๋ฅผ ์
๋ก๋. image๋ผ๋ form data๋ฅผ ์ ์กํ์ฌ ์
๋ก๋.
// ์
๋ก๋ ๋ ํ์ผ์ req.file๋ก, ๋๋จธ์ง ๋ฐ์ดํฐ๋ req.body ๋ก ๋ฐ์์ค๋ฉด ๋๋ค.
// module/imageUpload.js
const multer = require("multer");
// const upload = multer({ dest : "uploads/" });
// ํ์ผ ์ ์ฅ ๊ฒฝ๋ก, ํ์ผ ์ด๋ฆ์ ์กฐ์ ํ๊ธฐ ์ํ middleware ํจ์.
const storage = multer.diskStorage({
destination : (req, file, cb) => {
// public/images ์ ์ ์ฅ.
cb(null, 'public/images/');
},
filename : (req, file, cb) => {
// file ์ด๋ฆ ์ง์ .
cb(null, file.originalname);
}
});
const upload = multer({ storage : storage });
module.exports = upload;
// index.js
// upload ๋ฅผ ํตํด์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋์ ๋, middleware (multer ํจํค์ง์ ํจ์) ๋ฅผ ์ด์ฉํด์ ์ด๋ฏธ์ง ์
๋ก๋.
router.post("/upload", upload.single('image'), (req, res) => {
// const file = req.file;
// console.log(file);
res.status(200).json({
message : "upload success",
})
});
HTML๋ก ๋ง๋ค๋ ์ ์ ์นํ์ด์ง์์ ๋ฒ์ด๋, JavaScript ๋ณ์๋ฅผ View ํ์ผ์์๋ ์ฌ์ฉํ์ฌ ๋์ ์นํ์ด์ง๋ก ๊ธฐ๋ฅํ๊ฒ ํ๋ ํ์. ๊ฐ์ ํ ํ๋ฆฟ์ ์ฐ๋๋ฐ ๋ด์ฉ๋ง ๋ฐ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๊ธฐ ์ข๋ค. <% %> ์์ js ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.
// routes/template.js
const express = require("express");
const router = express.Router();
router.get('/ejs', (req, res) => {
res.render("template", { data: "test data" });
});
module.exports = router;
// localhost:3000/template/ejs
// app.js
const templateRouter = require('./routes/template');
app.use('/template', templateRouter);
<!-- view/template.ejs-->
<!DOCTYPE html>
<html lang="ko">
<head>
<title></title>
</head>
<body>
<% include ./layout/navbar.ejs %>
<%= data %> <!-- = ๋ถ์ด๋ฉด data๊ฐ ๋ฌธ์์ด์ด ์๋๋ผ js ๋ณ์๊ฐ ๋จ.-->
<% if(false) { %>
<div>ejs working</div>
<% } else { %>
<div>ejs not working</div>
<% } %>
<div>ejs template</div>
</body>
</html>
<!-- view/layout/template.ejs-->
<nav style="height: 30px; background-color: skyblue; width: 100%;">
nav
</nav>
express-session : express ํ๊ฒฝ์์ ์ธ์ ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํจํค์ง
์ธ์ : ๋ก๊ทธ์ธ์ ํ ๋, ์ฌ์ฉ์๊ฐ id์ pw๋ฅผ ๋ณด๋ด๋ฉด ์๋ฒ๊ฐ ์๋ต์ ๋ณด๋. ๊ทธ์น๋ง ํต์ ํน์ฑ์ ์ด ์ํ๋ฅผ ์ ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์, ๋ก๊ทธ์ธ ํ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด ์์ง ์์์ ์ ๋ก๋๋ฅผ ํ ๋๋ง๋ค ๋ก๊ทธ์ธ์ ํด์ผํ๋ค. ๊ทธ๋์ ์ธ์ ์ ์ฌ์ฉํด์ ์๋ฒ๋ ์ธ์ ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ฐ, ํด๋น ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ๋์ด์๋์ง๋ฅผ ํ์ ํ๋ค.
npm install express-session
// app.js
const session = require("express-session");
var app = express();
app.use(session({
secret: "first project", // ์ธ์
์ํธํ๋ฅผ ์ํด ํ์ํ ๊ฐ -> ์ธ์
ํ์ด์ฌํน ๊ณต๊ฒฉ์ ๋๋นํ์ฌ ํด์์ ์ฌ์ฉ๋๋ค๊ณ ํ๋ค! salt๋ก ์ฌ์ฉ๋๋๊ฑธ๊น? -> ์ฐพ์๋ณธ ๊ฒฐ๊ณผ ๋ง๋ค๊ณ ํ๋ค!
resave: false, // ์ธ์
์ด ๋ณ๊ฒฝ๋์ง ์์ผ๋ฉด ์ ์ฅํ์ง ์๋๋ค.
saveUninitialized: true, // ์ธ์
์ด ์ ์ฅ๋๊ธฐ ์ ์ ์ด๊ธฐํ
}));
// localhost:3000/users
// localhost:3000/users/login/lim/asdf ๋ก ๋ก๊ทธ์ธ ํ์
// localhost:3000/users ๋ก ๋ค์ ๋์๊ฐ๋ฉด ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
// routes/user.js : ๋ก๊ทธ์ธ ๊ด๋ จ ๊ธฐ๋ฅ์ด๋ user๋ก!
var express = require('express');
var router = express.Router();
// ๋ก๊ทธ์ธ ์ DB์ user id pw๊ฐ ์๋์ง ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํ๋ค.
const userInfo = {
lim: {
password: "asdf",
},
kim: {
password: "qwer",
},
};
router.get("/", (req, res) => {
const session = req.session;
res.render('index', {
username: session.username,
});
});
/* GET users listing. */
router.get('/login/:username/:password', (req, res) => {
const session = req.session;
const {username, password} = req.params;
if(!userInfo[username]) {
res.status(400).json({
message: "user not found",
});
}
if(userInfo[username]["password"] === password) {
// session์ ์ ์ฅ
session.username = username;
res.status(200).json({
message: "login success",
});
} else {
res.status(400).json({
message: "user pw incorrect!!",
});
}
});
router.get('/logout', (req,res) => {
const session = req.session;
if(session.username) {
req.session.destroy((err) => {
if (err) {
console.log(err);
} else {
res.redirect("/users");
}
});
} else {
res.redirect("/users");
}
})
module.exports = router;
- DB : ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํ์ฌ ์ ์ฅ์์ผ ๋์ ์งํฉ์ฒด
- Query : DB๋ฅผ ๊ด๋ฆฌ ํ๊ฑฐ๋ ์ ๋ณด๋ฅผ ์์ฒญํ๊ธฐ ์ํ ๋ช ๋ น์ด
SQL(Structured Query Language)
- ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์กฐํ ํด๋ ๊ฒ. ์คํค๋ง๊ฐ ์๊ฒฉํ๊ฒ ์กด์ฌํ๋ค.
- schema : ์ด๋ค ๊ตฌ์กฐ๋ก ์ด๋ค ์ ์ฝ์กฐ๊ฑด์ผ๋ก ์ ์ฅ๋์ด์ผ ํ๋์ง ์ ์ํ ๊ฒ.
- ์ฅ์ : ๋ช ํํ๊ฒ ์ ์๋ ์คํค๋ง๋ก ์ธํด ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต ์์ด ์ ์ฅํ ์ ์์.
- ๋จ์ : ์ ์ฐํ์ง ์๋ค. ์คํค๋ง ์์ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
no SQL (Not Only SQL)
- ์คํค๋ง๊ฐ ์๋ค. ๋ฐ๋ผ์ ๊ตฌ์กฐํ๋ ๊ด๊ณ๋ ์๋ค.
- JSON ํํ๋ก ์ ์ฅํ๋ค.
- ์ฅ : ์ ์ฐํ๊ณ ์๋๊ฐ ๋น ๋ฅด๋ค.
- ๋จ : ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ์๋ค.
no SQL์ ๋ํ์ ์ธ DB์ด๋ค. ๋งจ๋ ๋ชฝ๊ณ ๋๋น ๋ชฝ๊ณ ๋๋น ํ ๋ ๊ทธ๊ฒ ๋ญ์ฌ ๋ฐฑ์๋๋ ๊ด๋ จ๋๊ฑด๊ฐ๋ด ํ๊ณ ๋ง์๋๋ฐ, ์ค์ฒด๋ฅผ ์๊ฒ ๋๋๊น ์ฆ๊ฑฐ์ ๋ค.
ํน์ง
- Document Oriented : document ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค. document ์งํฉ์ collection
- schema ์ ์ฝ X : no SQL ์ ๋ํ์ ์ธ DB
- json ํํ : Node.js ํธํ์ฑ์ด ์ข๋ค.
mongoDB ํธ์คํ
์
์ฒด ์ค atlas๋ฅผ ์ด์ฉํด์ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๋ค.
์์ฑ ์ ์ ์ ์ : ๊ฐ๋ฐ ๋จ๊ณ์๋ ์ด๋ค IP ์ฃผ์์์๋ ์ ๊ทผํ ์ ์๊ฒ ํด๋์!
ํด๋ฌ์คํฐ ์์ฑ ํ, DB๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด์ compass GUI ํด๋ก ๋ด ๋ก์ปฌ ์ปดํจํฐ์ atlas ์ชฝ ๋ฐ์ดํฐ์ค์ ์์ฑ๋ ๋์ mongoDB ํด๋ฌ์คํฐ๋ฅผ ์ฐ๊ฒฐํ๋ค. ์ด ๋ username, password๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ ์ํด์ผ ํ๋ค!
mongoose : mongoDB ODM (Object Document Mapping)
- mongoDB๋ฅผ ๋์ฑ ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ ํด์ฃผ๋ ํจํค์ง.
- Document๋ฅผ ์กฐํํ ๋ document๋ฅผ js์ Object๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ ์ ํ๋ค.
npm install mongoose
// bin/www
const dbConfig = require("../config/dbConfig.json"); // ํค๊ด๋ฆฌ
/**
* Get port from environment and store in Express.
*/
const mongoose = require("mongoose");
const db = mongoose.connection;
db.on("error", console.error);
db.once("open", () => {
console.log("Connected to mongodb server");
});
// connect your application์ ํตํด ์ฐ๊ฒฐ.
mongoose.connect(
`mongodb+srv://ddosang:${dbConfig.password}@first-project.7rouh.mongodb.net/${dbConfig.name}?retryWrites=true&w=majority`,
{ useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false }
)
์คํค๋ง๊ฐ ์๋๊ฒ ๋ชฝ๊ณ ๋๋น์ ์ฅ์ ์ด์ง๋ง, ํ์ ์ ํ ๋๋ ์ํ์ฑ์ด ์์ผ๋ฏ๋ก ๋ชฝ๊ตฌ์ค์์๋ ์คํค๋ง๋ฅผ ์์ฑํ๋ค.
// model/post.js
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const postSchema = new Schema({
title: String,
content: String,
create_date: { type: Date, default: new Date() }, // default ์ค์ ๊ฐ๋ฅ.
});
module.exports = mongoose.model("post", postSchema);
// routes/index.js
const postModel = require("../model/post");
router.post('/', async (req, res) => {
const { title, content } = req.body;
const post = new postModel({
title: title,
content: content,
});
try {
// ์๋ต์ ํ๋ ์์ ์ ๋๊ธฐ์ ์ด์ด์ผํ๋ค.
const result = await post.save();
res.status(200).json({
message: "upload success",
data: result,
});
} catch(error) {
res.status(500).json({
message: error,
});
}
});
// ๊ฒ์๋ฌผ ์ ๋ชฉ์ผ๋ก ์กฐํ
router.get('/', async (req, res) => {
try {
const result = await postModel.find({ title : "first" });
res.status(200).json({
message: "read success",
data: result,
});
} catch(error) {
res.status(500).json({
message: error,
});
}
});
// ๊ฒ์๋ฌผ id๋ก ์กฐํ
router.get('/:id', async (req, res) => {
const { id } = req.params;
try {
const result = await postModel.findById(id);
res.status(200).json({
message: "detail success",
data: result,
});
} catch(error) {
res.status(500).json({
message: error,
});
}
});
router.put("/:id", async (req, res) => {
const {id} = req.params;
const {title, content} = req.body;
try {
const result = await postModel.findByIdAndUpdate(id, {
title: title,
content: content,
}, {
// ์
๋ฐ์ดํธ ํ์ ์
๋ฐ์ดํธ ๋ ๊ฒ์๋ฌผ์ ๋ฐํํ ์ง. ์์ผ๋ฉด ์
๋ฐ์ดํธ ์ ๊ฒ์๋ฌผ์ ๋ฐํํจ.
new: true,
});
res.status(200).json({
message: "update success",
data: result,
});
} catch(error) {
res.status(500).json({
message: error,
});
}
});
// delete
router.delete("/:id", (req, res) => {
const { id } = req.params;
try {
await postModel.findByIdAndDelete(id);
res.status(200).json({
message: "delete success"
});
} catch(error) {
res.status(500).json({
message: error
});
}
});
postman์ผ๋ก ์์ฒญ์ ๋ ๋ ค์ mongoDB์ ์์ด๋ ๊ฒ์ ํ์ธํด ๋ณด์๋ค.
์ถ์ฒ
์ฝ๋๋ผ์ด์ธ ์ผ๋จ ๋ง๋๋ node.js - ์ด๋ํ ๊ฐ์ฌ๋