λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/Node.js MongoDB

[Node.js / MongoDB] κΈ€ μˆ˜μ • κΈ°λŠ₯ λ§Œλ“€κΈ°

by Connecting-the-dots 2022. 3. 12.
728x90
λ°˜μ‘ν˜•

πŸ’‘ μ‹€μŠ΅ 포인트!

  • κΈ€ μˆ˜μ • νŽ˜μ΄μ§€ HTML νŒŒμΌμ„ λ§Œλ“€μ–΄μ„œ, 할일 λ¦¬μŠ€νŠΈμ—μ„œ μˆ˜μ • λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ ν•΄λ‹Ή κ²Œμ‹œκΈ€μ˜ κΈ€ μˆ˜μ • νŽ˜μ΄μ§€λ‘œ μ—°κ²°λ˜λ„λ‘ ν–ˆλ‹€.
  • μ—°κ²°λœ κΈ€ μˆ˜μ • νŽ˜μ΄μ§€μ—μ„œλŠ” ν•΄λ‹Ήν•˜λŠ” κ²Œμ‹œλ¬Όμ˜ 데이터λ₯Ό DB μ—μ„œ 받아와 input 의 λ‚΄μš©μœΌλ‘œ 보여쀄 수 있게 ν–ˆλ‹€.
  • κΈ€ μˆ˜μ • νŽ˜μ΄μ§€μ—μ„œ λ‚΄μš©μ„ μˆ˜μ •ν•œ ν›„ Submit λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ DB 의 ν•΄λ‹Ή κ²Œμ‹œλ¬Ό λ°μ΄ν„°μ˜ λ‚΄μš©μ΄ μˆ˜μ •λ˜κ³ , λΈŒλΌμš°μ €μ—μ„œλŠ” κΈ€ μˆ˜μ • νŽ˜μ΄μ§€μ—μ„œ 할일 리슀트 νŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°€λ„λ‘ ν–ˆλ‹€.

πŸ’œ κΈ€ μˆ˜μ • νŽ˜μ΄μ§€(HTML) λ§Œλ“€κΈ°

<h4 class="container mt-5">
    <strong>κΈ€ μˆ˜μ •ν•˜κΈ°</strong>
    <p class="mt-3" style="font-size: 14px;">κΈ€λ²ˆν˜Έ : <%= edit._id %></p>
</h4>
<div class="container mt-4">
  <form action="/edit?_method=PUT" method="POST">
    <div class="form-group my-4">
      <label class="mb-2">할일</label>
      <input type="text" name="id" style="display: none;" value="<%= edit._id %>">
      <input type="text" class="form-control" name="content" value="<%= edit.할일 %>">
    </div>
    <div class="form-group my-4">
      <label class="mb-2">마감일</label>
      <input type="text" class="form-control" name="date"  value="<%= edit.마감일 %>">
    </div>
    <button type="submit" class="btn btn-danger fw-bold">Submit</button>
  </form>
</div>
  • μˆ˜μ • κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆλŠ” 방법은 λ‹€μ–‘ν•˜μ§€λ§Œ, κ°€μž₯ μ‰¬μš΄ 방법이 μˆ˜μ • νŽ˜μ΄μ§€λ₯Ό λ”°λ‘œ λ§Œλ“œλŠ” 것!
  • λ”°λΌμ„œ, edit.ejs λΌλŠ” κΈ€ μˆ˜μ • νŽ˜μ΄μ§€μ— ν•΄λ‹Ήν•˜λŠ” EJS νŒŒμΌμ„ λ”°λ‘œ λ§Œλ“€μ—ˆλ‹€.
  • μ „λ°˜μ μΈ κ΅¬μ‘°λŠ” κΈ€μ“°κΈ° νŽ˜μ΄μ§€μ™€ λ™μΌν•˜κ²Œ ν•˜λ˜, input νƒœκ·Έμ— value 속성을 λ„£κ³  EJS 문법을 μ‚¬μš©ν•˜μ—¬ 미리 ν•΄λ‹Ή κ²Œμ‹œλ¬Όμ˜ 데이터λ₯Ό λ„£μ–΄μ„œ 보여쀄 수 μžˆλ„λ‘ ν•΄μ£Όμ—ˆλ‹€.
    (μ•„λž˜μ˜ JavaScript μ½”λ“œλ₯Ό 보면 μ•Œκ² μ§€λ§Œ ν•΄λ‹Ή λ°μ΄ν„°λŠ” edit μ΄λΌλŠ” λ³€μˆ˜μ— λ‹΄μ•„μ„œ λ°›μ•„μ˜¨λ‹€.)
  • 이제 edit.ejs μ—μ„œ Submit λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ μˆ˜μ • μš”μ²­μ— ν•΄λ‹Ήν•˜λŠ” PUT μš”μ²­μ„ ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”λ°, form νƒœκ·Έ λ‚΄μ—μ„œλŠ” POST, GET 두 가지 λ°©μ‹λ§Œ μ§€μ›ν•œλ‹€.
  • λ”°λΌμ„œ, DELETE μš”μ²­ λ•Œμ²˜λŸΌ AJAX λ₯Ό ν™œμš©ν•˜λ“ μ§€, method-override 라이브러리λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.
    (method-override 라이브러리 μ„€μΉ˜λ°©λ²•μ€ μ•„λž˜μ— 기재)
  • 라이브러리 μ„€μΉ˜ ν›„μ—λŠ” form νƒœκ·Έμ˜ μˆ˜μ •μ΄ ν•„μš”ν•˜λ‹€.
    • action 속성을 /edit?method=PUT 으둜 λ°”κΎΈμ–΄μ£Όλ©΄ /edit 경둜둜 PUT μš”μ²­μ΄ κ°€λŠ₯해진닀.
    • method 뢀뢄은 μ–΄μ°¨ν”Ό GET, POST 두 가지 λ°©μ‹λ§Œ μ§€μ›ν•˜κ³  μˆ˜μ •ν•˜λŠ” κΈ°λŠ₯은 POST 에 κ°€κΉŒμš°λ―€λ‘œ POST 둜 μž‘μ„±ν•΄μ£Όμ—ˆλ‹€.

🀍 method-override 라이브러리 μ„€μΉ˜ν•˜κΈ°

  • 터미널에 npm install method-override μž…λ ₯ν•˜μ—¬ method-override 라이브러리 μ„€μΉ˜ν•˜κΈ°
  • JavaScript 파일 상단에 μ•„λž˜μ˜ μ½”λ“œ μΆ”κ°€ν•˜κΈ°
const methodeOverride = require('method-override');
app.use(methodeOverride('_method'));

 

 


πŸ’œ GET μš”μ²­ JavaScript μ½”λ“œ 짜기

// λˆ„κ΅°κ°€κ°€ μˆ˜μ • λ²„νŠΌμ„ ν΄λ¦­ν•˜μ—¬ /edit/:id 둜 GET μš”μ²­μ„ ν•˜λ©΄
app.get('/edit/:id', function(req, res){
    // DB μ—μ„œ κ²Œμ‹œκΈ€ 뢈러였기
    req.params.id = parseInt(req.params.id);
    db.collection('post').findOne({_id : req.params.id}, function(err, result){
        res.render('edit.ejs', {edit : result});
    })
})
  • μš°μ„  경둜λ₯Ό /edit/:id 둜 μ„€μ •ν•΄μ„œ λˆ„κ΅°κ°€κ°€ /edit/ 뒀에 κ²Œμ‹œλ¬Όμ˜ _id λ₯Ό μ μ–΄μ„œ GET μš”μ²­μ„ ν•˜λ©΄ ν•΄λ‹Ήν•˜λŠ” κ²Œμ‹œλ¬Όμ˜ edit.ejs νŽ˜μ΄μ§€λ₯Ό λ³Ό 수 μžˆκ²Œλ” ν•΄μ£Όμ—ˆλ‹€.
  • μ΄μ „μ˜ λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€μ—μ„œ μž‘μ„±ν•œ μ½”λ“œμ™€ μ„€λͺ…κ³Ό 거의 μœ μ‚¬ν•΄μ„œ 더 μ΄μƒμ˜ μ„€λͺ…은 μƒλž΅ν•œλ‹€.

πŸ’œ PUT μš”μ²­ JavaScript μ½”λ“œ 짜기

// λˆ„κ΅°κ°€κ°€ νΌμ—μ„œ /edit 으둜 PUT μš”μ²­μ„ ν•˜λ©΄
app.put('/edit', function(req, res){
    // 폼에 기재된 데이터λ₯Ό db.collection 에 μ—…λ°μ΄νŠΈν•˜κΈ°
    req.body.id = parseInt(req.body.id);
    db.collection('post').updateOne({_id : req.body.id}, {$set : {할일: req.body.content, 마감일 : req.body.date}}, function(){
        console.log('κ²Œμ‹œλ¬Ό μˆ˜μ • μ™„λ£Œ');
        res.redirect('/list') 
    })
})
  • DB 의 데이터λ₯Ό μˆ˜μ •ν•˜λ €λ©΄ .updateOne() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
  • .updateOne() ν•¨μˆ˜λŠ” 3개의 νŒŒλΌλ―Έν„°λ₯Ό ν•„μš”λ‘œ ν•œλ‹€.
    • μ—…λ°μ΄νŠΈν•  κ²Œμ‹œλ¬Ό : μ—¬κΈ°μ„œλŠ” κΈ°μ‘΄ κ²Œμ‹œλ¬Όμ˜ _id λ₯Ό μž‘μ„±
    • μˆ˜μ •ν•  λ‚΄μš©: κΈ°μ‘΄ 값을 μˆ˜μ •ν•  κ²ƒμ΄λ―€λ‘œ $set μ΄λΌλŠ” operator λ₯Ό μ‚¬μš©
    • 콜백 ν•¨μˆ˜ : μ—…λ°μ΄νŠΈκ°€ μ™„λ£Œλ˜λ©΄ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό μž‘μ„±
  • 첫번째 νŒŒλΌλ―Έν„°μ—λŠ” κΈ°μ‘΄ κ²Œμ‹œλ¬Όμ˜ _id κ°€ λ“€μ–΄κ°€μ•Ό ν•˜λ―€λ‘œ, κ²Œμ‹œλ¬Ό μˆ˜μ • μš”μ²­ν•  λ•Œ _id λ₯Ό 같이 보낼 수 μžˆλ„λ‘ HTML νŒŒμΌμ„ μˆ˜μ •ν•΄μ€€λ‹€.
    • κΈ€ μˆ˜μ • νŽ˜μ΄μ§€μ—μ„œ Submit λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ λͺ¨λ“  input λ“€μ˜ value κ°€ μ „μ†‘λœλ‹€λŠ” 점을 μ΄μš©ν•˜μ—¬, κ²Œμ‹œλ¬Όμ˜ _id 도 input 에 λ‹΄μ•„ μ„œλ²„λ‘œ 전솑해쀀닀.
    • 단, 이 input 은 μ‚¬μš©μžλ₯Ό μœ„ν•œ 뢀뢄이 μ•„λ‹ˆλ―€λ‘œ display : none 처리λ₯Ό ν•˜μ—¬ μˆ¨κ²¨μ£Όμ—ˆλ‹€.
    • 이제 Submit λ²„νŠΌμ„ 톡해 form 을 전솑할 λ•Œ, 총 3가지 데이터(id, content, date) κ°€ μ „μ†‘λœλ‹€.
<input type="text" name="id" style="display: none;" value="<%= edit._id %>">
  • JavaScript νŒŒμΌμ—μ„œλŠ” 전솑받은 데이터듀(req.body 에 λ‹΄κΈ΄ 데이터듀)을 가지고 .updateOne() ν•¨μˆ˜λ₯Ό ꡬ성해주어야 ν•œλ‹€.
  • 단, μ΄λ•Œμ—λ„ req.body.id λŠ” μˆ«μžμž„μ—λ„ λ¬Έμžμ—΄λ‘œ λ°”λ€Œμ–΄μžˆμ„ 수 μžˆμœΌλ―€λ‘œ parseInt() ν•¨μˆ˜λ₯Ό 톡해 숫자둜 λ³€ν™˜ν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€.
  • λ§ˆμ§€λ§‰μœΌλ‘œ, res.redirect('/list') μ½”λ“œλ₯Ό 톡해 μ—…λ°μ΄νŠΈκ°€ μ™„λ£Œλ˜μ—ˆμœΌλ©΄ 할일 리슀트 νŽ˜μ΄μ§€λ‘œ κ°•μ œμ΄λ™μ‹œμΌœμ€€λ‹€.
728x90
λ°˜μ‘ν˜•