๊ธฐ๋ณธ์ผ๋ก ์๋ฒ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
const express = require('express');
const app = express();
app.listen(8081,(res,req)=>{ //app.listen์ผ๋ก ์๋ฒ ์ด๊ธฐ
console.log('์๋ฒ ์คํ ์') // ๋ช๋ฒ์งธ ํฌํธ ์ด๊ฑด์ง, ์ด๊ณ ์ด๋ค ์คํ ํ ๊ฒ์ธ์ง
})
app.get('/pet',(res,req)=>{ // app.get(์ด ์ฃผ์๋ก, ์ ์์ฒญ์ ํ ๊ฒ)
req.send('ํซ์ฉํ ์ผํํ ์ ์๋ ํ์ด์ง ์
๋๋ค.')
})
์ด์ ์ ์๋ฒ์/pet์ผ๋ก ์ ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ ๋ณด๋ด์ค๋ค.
HTML ํ์ผ์ ๋ณด๋ด๊ธฐ ์ํด์๋ sendFile
์ ์ฌ์ฉํ๋ค.
// ํ ๊ฒฝ๋ก๋ก ์ ์์ HTML ํ์ผ์ ๋ณด์ฌ์ค!
app.get('/',(res,req)=>{
req.sendFile(__dirname + '/index.html')
})
app.get('/write',(res,req)=>{ // app.get(์ด ์ฃผ์๋ก, ์ ์์ฒญ์ ํ ๊ฒ)
req.sendFile(__dirname + '/write.html')
})
์ด์ /write๋ก ์ ์ํ๋ฉด ์๋์ ๊ฐ์ด ์์ฑ ํ์ด์ง๋ฅผ ํจ๊ป ๋ณด์ฌ์ค๋ค.
<form>
ํ๊ทธ ๊ธฐ๋ฅ ๊ฐ๋ฐsubmit ๋ฒํผ์ ๋๋ฅด๋ฉด form์ ์
๋ ฅํ ์ ๋ชฉ๊ณผ ๋ ์ง๋ฅผ ์๋ฒ๋ก ์ ๋ฌํด๋ณด์.
form์ ์๋ฒ๋ก ์ ๋ฌํ๊ธฐ ์ํด์๋ action
, method
๊ฐ ๋ฐ๋์ ํ์ํ๋ค.
input ํ๊ทธ๋ค์๋ name
์ ์ ์ด์ค๋ค.
<div class="container mt-3">
// ๊ธ ๋ฐํ์ ์ํด์๋ POST ์์ฒญ
// ์ด๋ ๊ฒฝ๋ก๋ก ์ ๋ฌํด์ค์ง?
<form action="/add" method="POST">
<div class="form-group">
<label>์ค๋์ ํ ์ผ</label>
<input type="text" class="form-control" name="title"> // input์ name์ ์ ์ด์ฃผ๊ธฐ
</div>
<div class="form-group">
<label>๋ ์ง</label>
<input type="text" class="form-control" name="date">
</div>
<button type="submit" class="btn btn-outline-secondary">Submit</button>
</form>
</div>
๊ทธ๋ฆฌ๊ณ ์์ฑํ ์์ฒญ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ด์ ์ฒ๋ฆฌํ๋ค.
๊ทธ๋ผ ์๋ฌธ์ ์ด ๋ ๋ค. ์ฐ๋ฆฌ๊ฐ input ํ๊ทธ ์์ ์ ์ ๋ด์ฉ์ ์ด๋์ ์ ์ฅ๋๋ ๊ฑฐ์ง?
๋ฐ๋ก res์ ์ ์ฅ๋์ด ์๋ค.
์ด ์ ์ฅ๋ ๊ฒ์ ๊บผ๋ด ์ฐ๊ธฐ ์ํด์๋ body-parser๊ฐ ํ์ํ๋ค.
body-parser๋ ์์ฒญ ๋ฐ์ดํฐ(body) ํด์์ ์ฝ๊ฒ ๋์์ค๋ค.
body-parser๋ฅผ ์ค์นํด์ฃผ์.
npm install body-parser
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
...
app.post('/add',(res,req)=>{
req.send('์ ์ก์๋ฃ');
console.log(res.body.title);
})
res.body
๋ผ๊ณ ์ ์ผ๋ฉด ์์ฒญํ๋ form์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์์ ๊ฐ๋ฅํ๋ค.
์ฐ๋ฆฌ๋ ์์ inputํ๊ทธ์ name = title
๋ก ์ ์ ๊ฐ์ ์ถ๋ ฅํ๊ณ ์ถ์ผ๋ฉด ์์ ๊ฐ์ด ์์ฑํ๋ฉด ๋๋ค.
์๋ฒ ์ฝ์์ฐฝ์ ์ ๋ฌ๋ค.
์ด์ ์ ๋ฐ์ดํฐ๋ฅผ DB์ ์๊ตฌ๋ก ์ ์ฅ์์ผ๋ณด์.
.txt ํ์ผ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ์ ๋ถ์ถฉ๋ถํ๋ฏ๋ก ์ฌ์ฉํ์ง ์๋๋ค.
Mongo DB
๊ด๊ณํ DB
: MySQL,Oracle,MariaDB
-> SQL์ธ์ด๋ฅผ ์ฌ์ฉํด์ผํ๋ฉฐ, 3์ฐจ์ ๋ฐ์ดํฐ์ ์ ์ฅ์ด ์ด๋ ต๋ค.NoSQL
: MongoDB, Dynamo, Redis, Cassandra ๋ฑ
-> Object ์๋ฃํ์ผ๋ก ์ ์ถ๋ ฅ ๊ฐ๋ฅ
๋ฌด๋ฃ ํธ์คํ ์ ๋ฐ์์ ์จ๋ณด์!
mongoDB์ ์ ์ํด์ ํ์ํ ์ ๋ณด๋ฅผ ๋ชจ๋ ์ ๋ ฅํ๋ฉด ๋๋ค.
connect > connect your application > ๋ฒ์ ๋ง์ถฐ์ ์ ํํ๊ธฐ
์๋์๋ db๋ฅผ ์ฐ๊ฒฐํด์ค code๊ฐ ๋์จ๋ค. ์ ์ฝ๋๋ฅผ ์ด์ฉํด์ ์ฐ๋์์ผ๋ณด์.
์ฐ์ mongodb๋ฅผ ์ค์นํด์ค๋ค.
์ํ๋ ๋ฒ์ ์ ์์ฑํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ค๋ค.
npm install mongodb@3.6.4
์๋ฒ์ ์ฐ๊ฒฐํด์ฃผ๊ธฐ ์ํด์๋ mongodb๋ฅผ ๋ถ๋ฌ์จ๋ค์,
MongoClient.connect(๋์ url,์ฝ๋ฐฑํจ์)
์ด๋ ๊ฒ ์์ฑํด์ค๋ค.
url์์ password๋ ๋ด๊ฐ ์ค์ ํ admin์ pw๊ฐ์ผ๋ก ์์ ํด์ค๋ค.
const MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb+srv://admin:qwer1234@cluster0.qwx5x01.mongodb.net/?retryWrites=true&w=majority',
function(error,client){})
์๋ฒ๊ฐ ์ ๋จ๋์ง ํ์ธํ๊ธฐ ์ํด์ ์ด์ ์ ๋ง๋ค์ด๋ app.listen ํจ์๋ฅผ ์ ์์ผ๋ก ์ฎ๊ฒจ๋ณด์.
const MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb+srv://admin:qwer1234@cluster0.qwx5x01.mongodb.net/?retryWrites=true&w=majority',
function(error,client){
app.listen(8081,(res,req)=>{
console.log('์๋ฒ ์คํ ์')
})
})
์๋ฒ๊ฐ ์ ์์ ์ผ๋ก ์ ์คํ๋ ๋ฏํ๋ค.!
๋๋ฒ์งธ ์ธ์๋ก ์ฝ๋ฐฑํจ์๋ฅผ ์ฃผ์๋๋ฐ,
์ฝ๋ฐฑํจ์์ error๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ ์ด๋ค ์๋ฌ์ธ์ง ์๋ ค์ฃผ๋ ์ญํ ์ ์ํํ๋ค.
MongoClient.connect('mongodb+srv://admin:qwer1234@cluster0.qwx5x01.mongodb.net/?retryWrites=true&w=majority',
function(error,client){
if(error){
return console.log(error)
}
browse collection > collection ์ด๋ฆ ์ค์
collection์ ์ผ์ข ์ ์์ ํ์ผ๋ค์ด๋ค.
collection ์์ ํ์ผ๋ค์ ์์ฑํ๋ค.
์ด๊ณณ์ ๋ฐ์ดํฐ๋ค์ ์ญ ์ ์ฅ๊ฐ๋ฅํ๋ค.
collection ํ์ผ๋ ์์ฑํ์ผ๋, ์ด์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋ณด์.
(1) ์ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ์ํฌ ๋ณ์๋ฅผ ํ๋ ์ง์ ํด์ค๋ค. ->
db
(2) ์ด๋ค ๋ฐ์ดํฐ ๋ฒ ์ด์ค ํด๋๋ฅผ ์ฐ๊ฒฐํ ์ง ์ค์ ํ๋ค. ->db = client.db('todoapp');
(3) ์ด๋ค collection์ ์ด๋ค ๊ฐ์ ์ ์ฅํ ์ง๊ฐ์ฒด ํํ
๋ก ์ ์ฅํด์ค๋ค.
var db; // ์ด๋ค ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅ์ํฌ์ง
const MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb+srv://admin:qwer1234@cluster0.qwx5x01.mongodb.net/?retryWrites=true&w=majority',
function(error,client){
if(error) return console.log(error);
db = client.db('todoapp'); // todoapp ์ด๋ผ๋ db ํด๋์ ์ฐ๊ฒฐํด
db.collection('database').insertOne({์ด๋ฆ:'su',๋์ด:'20'},function(์๋ฌ, ๊ฒฐ๊ณผ){
console.log('์ ์ฅ์๋ฃ');
});
app.listen(8081,(res,req)=>{
console.log('์๋ฒ ์คํ ์')
})
})
์ด์ mongoDB ํ๋ฉด์ ์๋ก๊ณ ์นจํด๋ณด๋ฉด...!? ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ด ๋ฌ๋ค.
objectId๋ ๋ญ๊น?
์๋ฃ ์ ์ฅ์
_id
๋ฅผ ๊ผญ ์ ์ด์ผ ํ๋ค.
์๊ทธ๋ฌ๋ฉด ์๋์ผ๋ก ๋ถ์ฌํด์ค๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด์ ์ ๋ ๊ฒ!
์ค๋ณต id๊ฐ์ผ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ฉด, db์๋ ๊ธฐ์กด id์ ๊ฐ๋ง ๋จ์์๋ค.
์ด์ ์ ์ฃผ์ํ์.
์ด๋ ๊ฒ ์์ฑํ๋ฉด ํผ์์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๋ฉด,
์๋ฒ์์ ์ ์ก์๋ฃ ํ์ด์ง๊ฐ ๋จ๊ณ , db์ ๋ด์ฉ์ด ์ ๋๋ก ์ ์ฅ๋๋ค
app.post('/add',(res,req)=>{
req.send('์ ์ก์๋ฃ');
db.collection('database').insertOne({ํ ์ผ:res.body.title,๋ ์ง:res.body.date,_id:3},function(์๋ฌ, ๊ฒฐ๊ณผ){
console.log('์ ์ฅ์๋ฃ');
})
})
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
var db; // ์ด๋ค ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅ์ํฌ์ง
const MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb+srv://admin:qwer1234@cluster0.qwx5x01.mongodb.net/?retryWrites=true&w=majority',
function(error,client){
if(error) return console.log(error);
db = client.db('todoapp'); // todoapp ์ด๋ผ๋ db ํด๋์ ์ฐ๊ฒฐํด
app.listen(8081,(res,req)=>{
console.log('์๋ฒ ์คํ ์')
})
app.post('/add',(res,req)=>{
req.send('์ ์ก์๋ฃ');
db.collection('database').insertOne({ํ ์ผ:res.body.title,๋ ์ง:res.body.date,_id:1},function(์๋ฌ, ๊ฒฐ๊ณผ){
console.log('์ ์ฅ์๋ฃ');
})
})
//HTML ํ์ผ์ ๋ณด๋ด๊ธฐ ์ํด์๋ sendFile์ ์ฌ์ฉํ๋ค.
app.get('/',(res,req)=>{
req.sendFile(__dirname + '/index.html')
})
app.get('/write',(res,req)=>{ // app.get(์ด ์ฃผ์๋ก, ์ ์์ฒญ์ ํ ๊ฒ)
req.sendFile(__dirname + '/write.html')
})
})
GET ์์ฒญ์ ์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ชฉ๋ก๋ค์ ์์๊ฒ ๊พธ๋ฏผ HTML ํ์ด์ง์ ๋ฐ์์๋ณด์.
์ฐ์ ๊ธฐ์กด index.html ํ์ผ๋ค์ ์ ๋ถ ๋ณต์ฌํด์ list.html ํ์ผ์ ์๋ก ์์ฑ ํ ๋ถ์ฌ๋ฃ๊ธฐ ํด์ฃผ์๋ค.
ejs ์ค์น ํ๊ธฐ!
npm install ejs
server.js์ ejs๋ฅผ ์ฌ์ฉํ ๊ฒ์์ ๋ช ์ํด์ฃผ์.
app.set('view engine','ejs')
๊ทธ๋ฆฌ๊ณ list.html -> list.ejs์ ๊ฐ์ด .html ํ์ฅ์๋ช
์ .ejs
๋ก ๋ฐ๊ฟ์ค๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ejs ๋ฌธ๋ฒ์ ์ด์ฉํด์ ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ ์ ์๋ค.
(๋ฆฌ์กํธ, ๋ทฐ ๋ฑ์ ์ฌ์ฉํ๋ค๋ฉด ๊ทธ๋ฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ํ๋ฉด ๋๋ ๋ฏ ํ๋ค.)
๊ธฐ๋ณธ ํํ๋ <%= %>
์ด๋ ๊ฒ ์๊ฒผ๋ค!
์ค์ํ ์ ์ ejs ํ์ผ๋ค์ views ํด๋๋ฅผ ์์ฑํด์ ๊ทธ ์์ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ค.
๋ฐ์ดํฐ๋ฅผ for๋ฌธ์ ์ด์ฉํด์ ๊บผ๋ด๋ณด์!
์๋ ์ฝ๋๋ /list
ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ฉด,
db์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์ฝ๋์ด๋ค.
๋ ๋๋งํ๊ณ ์ถ์ ๊ฐ์ req.render
์ ๋ด์์, ๊ฒฝ๋ก๋ฅผ ์ ๊ณ ์ํ๋ ๊ฒฐ๊ณผ
๋ฅผ ๋๋ฒ์งธ ์ธ์๋ก ์ ๋๋ค.
app.get('/list',(res,req)=>{
db.collection('database').find().toArray(function(error,๊ฒฐ๊ณผ){
console.log(๊ฒฐ๊ณผ);
req.render('list.ejs',{posts:๊ฒฐ๊ณผ});
});
})
<h2>์๋ฒ์์ ๊ฐ์ ธ์จ ํ ์ผ ๋ฆฌ์คํธ๐</h2>
<% for(let i=0;i<posts.length;i++){ %>
<h4>ํ ์ผ์ ๋ชฉ:<%= posts[i].์ ๋ชฉ %></h4>
<p>ํ ์ผ ๋ง๊ฐ๋ ์ง: <%= posts[i].๋ ์ง %></p> %>
<% } %>
์ด ๊ฒ์๋ฌผ + 1์ํ๋ฉด id์ ๋ง๊ฒ ์์ฑ๋ ๋ฏ .. ํ์ผ๋
์๊ฐํด๋ณด๋ฉด ๊ฒ์๋ฌผ์ด ์ญ์ / ์์ ๋๋ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฑฐ๊ฐ๋ค!
๋ฐ๋ฅธ ํ์ผ์ ๋ง๋ค์ด์ ๊ด๋ฆฌํ์
collections์์ ์๋กญ๊ฒ counter๋ฅผ ์ถ๊ฐํ๋ค.
์๋์ ๊ฐ์ด ์ค์ ํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์์ฑํด์ค๋ค.
mongodb ๊ธฐ๋ณธ ๋ช
๋ น์ด๋ค์ด ์ฌ๋ฌ๊ฐ ๋์จ๋ค.
๋๋ฌด ์ง๊ด์ ์ด๋ผ ํ์ํ ๋๋ง๋ค ์ฐพ์๋ณด๋ฉด ๋ ๊ฑฐ๊ฐ๋ค.
findOne -> ํ๋์ ๊ฐ๋ง ์ฐพ๊ธฐ
insertOne -> ํ๋์ ๊ฐ์ ์ฝ์
updateOne -> ํ๋์ ๊ฐ์ ์์
updateMany -> ์ฌ๋ฌ๊ฐ์ ๊ฐ์ ์์
๋ค์ํ ์ฟผ๋ฆฌ operator๋ค์ด ์๋ค.
์ฐพ์๋ณด๋ฉด์ ๊ณต๋ถํ์.
https://blog.naver.com/PostView.naver?blogId=shino1025&logNo=221294664013&redirect=Dlog&widgetTypeCall=true&topReferer=https%3A%2F%2Fwww.google.com%2F&directAccess=false
app.post('/add',(res,req)=>{
req.send('์ ์ก์๋ฃ');
db.collection('counter').findOne({name:'๊ฒ์๋ฌผ๊ฐฏ์'},function(error,๊ฒฐ๊ณผ){
console.log(๊ฒฐ๊ณผ.totalPost);
db.collection('database').insertOne({_id: ๊ฒฐ๊ณผ.totalPost+1 ,ํ ์ผ: res.body.title, ๋ ์ง: res.body.date},function(์๋ฌ, ๊ฒฐ๊ณผ){
console.log('์ ์ฅ์๋ฃ');
db.collection('counter').updateOne({name:'๊ฒ์๋ฌผ๊ฐฏ์'},{$inc:{totalPost:1}},function(error,๊ฒฐ๊ณผ){
if(error) {return console.log(error)}
})
});
})
})
์ด๋ ๊ฒ ํ๋ฉด ๋๊ฐ id ์์ฑ์ ์ ๋ฌ์์ค ์ ์๋ค.
๋๊ตฐ๊ฐ add๋ก post ์์ฒญ์ ํ๋ฉด
counter collection์์ name์ด ๊ฒ์๋ฌผ๊ฐฏ์์ธ ๊ฒ์ ์ด๋ฆ์ ์ฐพ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ณ ,
๊ทธ ๊ฒฐ๊ณผ๊ฐ์ database collection์ id๋ก ์
๋ฐ์ดํธ ํด์ฃผ์.
๊ทธ๋ฆฌ๊ณ ๊ฒ์๋ฌผ์ ๊ฐฏ์๋ฅผ ํ๋ ๋ ์ฆ๊ฐ์์ผ์ฃผ๋ฉด ์๋ฃ!
๊ธ ๋ชฉ๋ก๋ง๋ค ์ญ์ ๋ฒํผ์ ๋ง๋ค์ด์ ์ญ์ ๋ฅผ ํด๋ณด์!
์ญ์ ๋ Delete ์์ฒญ์ ํ๋๋ฐ,
html์์์๋ delete
๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
form ์์ method๋ก ์ค ์ ์๋ ๊ฐ์ 'POST'
,'GET'
์์ฒญ ๋ฟ์ด๋ค.
์ด ์ ์ ํด๊ฒฐํ๋ ค๋ฉด
(1) method-override ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉ
(2) JS AJAX๋ฅผ ์ด์ฉ
AJAX๋ ์๋ก๊ณ ์นจ ์์ด ์๋ฒ์ ์์ฒญํ๋ ๊ฒ์ ๋์์ฃผ๋ JS ๋ฌธ๋ฒ
์ด๋ JQuery ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ ๋ฐ์ผ๋ฉด AJAX๋ฅผ ํ์ฉํ๊ธฐ ๋ ์ฌ์์ง๋ค.
-> ๋น์ฐํ JQuery ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ํ์!
๋ถํธ์คํธ๋ฉ์ ์ค์นํ๋ค๋ฉด ์๋ ์์ฑ๋์ด์๋ค.
// ๋ถํธ์คํธ๋ฉ ์ค์น
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
// ajax ๊ธฐ๋ณธ ๋ฌธ๋ฒ
<script>
$.ajax({
method:'DELETE', // DELETE ์์ฒญ์ ํ ๊ฒ์ด๋ค.
url: '/delete', // ์ด๋ค ๊ฒฝ๋ก๋ก ์์ฒญํ ๊ฒ์ธ์ง
date : '๊ฒ์๋ฌผ๋ฒํธ' // ์ด๋ค ๊ฒ์๋ฌผ ๋ฒํธ๋ฅผ ์ญ์ ํ ์ง ์ ๋ฌํด์ฃผ๊ธฐ ์ํด์
}).done(function(๊ฒฐ๊ณผ){ // ajax ์์ฒญ ์ฑ๊ณต์ ์คํํ ์ฝ๋
})
</script>