[๐Ÿผ express] ์ฝ”๋”ฉ์• ํ”Œ - mongoDB์—์„œ ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๊ธฐ

dsfasdยท2022๋…„ 12์›” 4์ผ
0

์„œ๋ฒ„ ์—ด๊ณ  GET ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

๊ธฐ๋ณธ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

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 ํ™”๋ฉด ๋ณด๋‚ด๊ธฐ

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์„ ์ ์–ด์ค€๋‹ค.

write.html

<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 

server.js

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์— ์ •๋ณด๋ฅผ ์˜๊ตฌ ์ €์žฅ์‹œํ‚ค๊ธฐ

์ด์ œ ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ 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

server.js

์„œ๋ฒ„์™€ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” 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)
  }

โœ… collection

browse collection > collection ์ด๋ฆ„ ์„ค์ •

collection์€ ์ผ์ข…์˜ ์—‘์…€ ํŒŒ์ผ๋“ค์ด๋‹ค.

collection ์•ˆ์— ํŒŒ์ผ๋“ค์„ ์ƒ์„ฑํ–ˆ๋‹ค.
์ด๊ณณ์— ๋ฐ์ดํ„ฐ๋“ค์„ ์ญ‰ ์ €์žฅ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ… ๋ฐ์ดํ„ฐ ์ €์žฅํ•˜๊ธฐ

collection ํŒŒ์ผ๋„ ์ƒ์„ฑํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋ณด์ž.

(1) ์šฐ์„  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ์‹œํ‚ฌ ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ง€์ •ํ•ด์ค€๋‹ค. -> db
(2) ์–ด๋–ค ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํด๋”๋ฅผ ์—ฐ๊ฒฐํ• ์ง€ ์„ค์ •ํ•œ๋‹ค. -> db = client.db('todoapp');
(3) ์–ด๋–ค collection์— ์–ด๋–ค ๊ฐ’์„ ์ €์žฅํ• ์ง€ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ €์žฅํ•ด์ค€๋‹ค.

server.js

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('์ €์žฅ์™„๋ฃŒ');
  })
  })

server.js ์ฝ”๋“œ ์ค‘๊ฐ„ ์™„์„ฑ๋ณธ

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์š”์ฒญ์„ ํ†ตํ•ด ๋ฐ›์•„์˜ค๊ธฐ (with ejs)

GET ์š”์ฒญ์‹œ ์‹ค์ œ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก๋“ค์„ ์˜ˆ์˜๊ฒŒ ๊พธ๋ฏผ HTML ํŽ˜์ด์ง€์— ๋ฐ›์•„์™€๋ณด์ž.
์šฐ์„  ๊ธฐ์กด index.html ํŒŒ์ผ๋“ค์„ ์ „๋ถ€ ๋ณต์‚ฌํ•ด์„œ list.html ํŒŒ์ผ์— ์ƒˆ๋กœ ์ƒ์„ฑ ํ›„ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•ด์ฃผ์—ˆ๋‹ค.

์„œ๋ฒ„ ๋ฐ์ดํ„ฐ๋ฅผ ํŽธํ•˜๊ฒŒ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” EJS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž.

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์— ๋‹ด์•„์„œ, ๊ฒฝ๋กœ๋ฅผ ์ ๊ณ  ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ ๋Š”๋‹ค.

server.js

  app.get('/list',(res,req)=>{ 
    db.collection('database').find().toArray(function(error,๊ฒฐ๊ณผ){
      console.log(๊ฒฐ๊ณผ);
      req.render('list.ejs',{posts:๊ฒฐ๊ณผ});
    });
  })

list.ejs

<h2>์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ ํ• ์ผ ๋ฆฌ์ŠคํŠธ๐Ÿ’›</h2>
<% for(let i=0;i<posts.length;i++){ %>
  <h4>ํ• ์ผ์ œ๋ชฉ:<%= posts[i].์ œ๋ชฉ %></h4>
  <p>ํ• ์ผ ๋งˆ๊ฐ๋‚ ์งœ: <%= posts[i].๋‚ ์งœ %></p> %>
<% } %> 


id ์†์„ฑ์„ ๋‹ฌ์•„์ฃผ๊ธฐ

์ด ๊ฒŒ์‹œ๋ฌผ + 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

server.js

  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๋ฅผ ์ด์šฉํ•ด์„œ ์‚ญ์ œํ•ด๋ณด์ž!

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>
profile
๊ธฐ๋ก์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„!

0๊ฐœ์˜ ๋Œ“๊ธ€