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

[Node.js / MongoDB] AJAX 둜 μ‚­μ œμš”μ²­ν•˜κΈ°

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

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

πŸ’œ λΈŒλΌμš°μ €


πŸ’œ MongoDB

 

  • AJAX 둜 μ‚­μ œ μš”μ²­μ„ ν–ˆμ„ λ•Œ, μ„±κ³΅ν•˜λ©΄ DB μ—μ„œ 데이터가 μ‚­μ œλ  뿐만 μ•„λ‹ˆλΌ ν™”λ©΄μƒμ—μ„œλ„ 보이지 μ•Šκ²Œ μ²˜λ¦¬ν–ˆλ‹€.

 


πŸ’œ λ“€μ–΄κ°€κΈ° 전에

  • μš”μ²­μ—λŠ” GET, POST, PUT, DELETE μ΄λ ‡κ²Œ 4가지가 μžˆλ‹€.
  • ν•˜μ§€λ§Œ HTML νΌμ—μ„œλŠ” 일반적으둜 PUT, DELETE μš”μ²­μ€ λΆˆκ°€ν•˜λ―€λ‘œ λ‹€λ₯Έ 방법을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    1. method-override 라이브러리λ₯Ό μ‚¬μš©ν•œλ‹€.
    2. AJAX 둜 DELETE μš”μ²­μ„ ν•œλ‹€.
    3. POST μš”μ²­μœΌλ‘œ DELETE μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
      (κ°€μž₯ νŽΈν•œ λ°©λ²•μ΄μ§€λ§Œ REST ν•œ API λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ§€μ–‘ν•œλ‹€.)

πŸ’œ AJAX κ°œλ… 및 μ‚¬μš©

  • AJAX λž€ ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ JavaScript λ₯Ό μ΄μš©ν•΄ μ„œλ²„μ— λ‹€μ–‘ν•œ μš”μ²­μ„ ν•  수 μžˆλŠ” 문법같은 κ²ƒμœΌλ‘œ μƒˆλ‘œκ³ μΉ¨μ„ ν•˜μ§€ μ•Šκ³ λ„ μ„œλ²„μ— μš”μ²­μ΄ κ°€λŠ₯ν•˜λ‹€λŠ” μž₯점이 μžˆλ‹€.
  • JavaScript λ§ŒμœΌλ‘œλ„ AJAX κ°€ κ°€λŠ₯ν•˜μ§€λ§Œ μ½”λ“œκ°€ κΈΈμ–΄μ§€λ―€λ‘œ jQuery λ₯Ό μ„€μΉ˜λ₯Ό ꢌμž₯ν•œλ‹€.

🀍 HTML

<ul class="list-group">
    <% for(let i = 0; i < posts.length; i++){ %>
        <li class="list-group-item mb-2" style="border-top-width: 1px">
          <p class="mb-2">할일 : <%= posts[i].할일 %></p>
          <p class="mb-2">마감일 : <%= posts[i].마감일 %></p>
          <button class="btn btn-danger delete" data-id="<%= posts[i]._id %>">μ‚­μ œ</button>
        </li>
    <% } %>
</ul>
  • μš°μ„  λ¦¬μŠ€νŠΈνŽ˜μ΄μ§€μ— μ‚­μ œ λ²„νŠΌμ„ ν•˜λ‚˜ μΆ”κ°€ν•΄μ€€λ‹€.
  • λ‚˜μ€‘μ— 이 λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ μ‚­μ œ λ²„νŠΌμ΄ λ“€μ–΄μžˆλŠ” 데이터 ν•˜λ‚˜λ₯Ό λ¦¬μŠ€νŠΈνŽ˜μ΄μ§€μ™€ DB μ—μ„œ μ‚­μ œν•΄μ•Ό ν•œλ‹€.
  • λ”°λΌμ„œ button νƒœκ·Έμ— data-id λΌλŠ” 속성을 μΆ”κ°€ν•˜μ—¬ ν˜„μž¬μ˜ κ²Œμ‹œλ¬Όμ΄ μ–΄λ–€ _id 에 ν•΄λ‹Ήν•˜λŠ”μ§€ ꡬ별할 수 μžˆλ„λ‘ ν•΄μ£Όμ—ˆλ‹€.
  • 그리고 _id 값은 DB 에 μ €μž₯된 데이터λ₯Ό κ°€μ Έμ˜€λŠ” κ²ƒμ΄λ―€λ‘œ EJS 문법을 μ‚¬μš©ν–ˆλ‹€.

🀍 HTML 파일 λ‚΄ JavaScript

    // jQuery CDN μ—μ„œ λ³΅μ‚¬ν•΄μ˜¨ μ½”λ“œ
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    
    
    // DELETE μš”μ²­
    <script>
	  // class κ°€ delete 인 λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄
      $('.delete').click(function(e){

        let postNum = e.target.dataset.id;
        let clicked = $(this);
        
		// DELETE μš”μ²­μ„ ν•œλ‹€.
        $.ajax({
          method : 'DELETE',
          url : '/delete',
          data : {_id : postNum}
        }).done(function(result){
          // AJAX 성곡할 경우 μ‹€ν–‰ν•  μ½”λ“œ
          console.log('μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.');
          clicked.parent('li').fadeOut();
        }).fail(function(err){
          // AJAX μ‹€νŒ¨ν•  경우 μ‹€ν–‰ν•  μ½”λ“œ
          console.log('μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.');
        })

      })

    </script>
  • DELETE μš”μ²­μ€ μ‚­μ œ λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œμ—λ§Œ λ°œμƒν•΄μ•Ό ν•˜κ³ , μ½”λ“œκ°€ 길어짐을 λ°©μ§€ν•˜κΈ° μœ„ν•΄  jQuery 문법을 μ΄μš©ν•΄μ„œ μœ„μ™€ 같이 μž‘μ„±ν–ˆλ‹€.
  • data λΆ€λΆ„μ—λŠ” μ‚­μ œν•˜λ €λŠ” κ²Œμ‹œλ¬Όμ΄ μ–΄λ–€ κ²Œμ‹œλ¬ΌμΈμ§€ 정보가 ν•„μš”ν•˜λ‹€. DB 에 μ €μž₯된 κ²Œμ‹œλ¬Ό λ°μ΄ν„°μ—μ„œλŠ” _id κ°€ μœ μΌν•œ κ°’μ΄λ―€λ‘œ 이 값을 data 둜 λ„˜κ²¨μ£Όλ©΄ λœλ‹€.
  • κ²Œμ‹œλ¬Όμ˜ _id λŠ” HTML μƒμ˜ data-id μ—μ„œ λ°›μ•„μ˜¬ 수 μžˆλŠ”λ°, .dataset.id λ₯Ό 톡해 정보λ₯Ό λ°›μ•„μ˜€λ©΄ λœλ‹€.
  • κ·Έλž˜μ„œ ν΄λ¦­ν•œ μš”μ†Œλ₯Ό e.target 으둜 λ°›μ•„μ„œ e.target.dataset.id 라고 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ κ·Έ μ½”λ“œκ°€ ν΄λ¦­ν•œ κ²Œμ‹œλ¬Όμ˜ id κ°€ λ˜λŠ” 것이닀.
    (참고둜 λ‚˜λŠ” 이 뢀뢄을 postNum 이라고 λ³€μˆ˜μ— λ‹΄μ•„μ£Όμ—ˆλ‹€.)
  • .done() ν•¨μˆ˜ 내에 별닀λ₯Έ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠμœΌλ©΄, μ‚­μ œ λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ AJAX μš”μ²­μ΄ μ„±κ³΅ν–ˆμŒμ—λ„ λΈŒλΌμš°μ €μƒ ν™”λ©΄μ˜ λ³€ν™”κ°€ μ—†κ³  DB λ°μ΄ν„°λ§Œ μ‚­μ œλœλ‹€. (AJAX κ°€ μƒˆλ‘œκ³ μΉ¨ 없이 μš”μ²­μ„ μ²˜λ¦¬ν•œλ‹€λŠ” νŠΉμ„±μ΄ μžˆμœΌλ―€λ‘œ!)
  • λ”°λΌμ„œ, μ‚¬μš©μžλŠ” μƒˆλ‘œκ³ μΉ¨μ„ ν•˜μ§€ μ•Šκ³ μ„œλŠ” μ‚­μ œκ°€ μ œλŒ€λ‘œ λ˜μ—ˆλŠ”μ§€ 확인할 μˆ˜κ°€ μ—†λŠ”λ° 이λ₯Ό μ‹œκ°μ μœΌλ‘œ 보여주기 μœ„ν•΄ AJAX κ°€ 성곡할 경우 fadeOut() 을 μ‚¬μš©ν•˜μ—¬ μ•ˆ λ³΄μ΄κ²Œλ” μ²˜λ¦¬ν•΄μ£Όμ—ˆλ‹€.
    • $(this) λŠ” ν˜„μž¬ ν΄λ¦­μ΄λ²€νŠΈκ°€ λ™μž‘ν•˜λŠ” μš”μ†Œλ₯Ό μ˜λ―Έν•˜λ©° $(e.target) μœΌλ‘œλ„ λŒ€μ²΄ κ°€λŠ₯ν•˜λ‹€.
    • $() 둜 κ°μ‹ΈλŠ” μ΄μœ λŠ” jQuery 문법을 μ‚¬μš©ν•˜κΈ° μœ„ν•œ 것이며 JavaScript λ¬Έλ²•μœΌλ‘œ μ‚¬μš©ν•  거라면 ꡳ이 μ΄λ ‡κ²Œ μž‘μ„±ν•  ν•„μš”κ°€ μ—†λ‹€.
    • $(this) λ₯Ό μ’€ 더 λͺ…ν™•ν•˜κ²Œ 의미λ₯Ό 보여주기 μœ„ν•΄ clicked λΌλŠ” λ³€μˆ˜μ— λ‹΄μ•˜λ‹€.
    • button νƒœκ·Έκ°€ λ‹΄κ²¨μžˆλŠ” li νƒœκ·Έ 전체λ₯Ό μ—†μ• μ•Ό ν•˜λ―€λ‘œ clicked.parent('li').fadeOut(); 이라 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.

🀍 JavaScript

// * delete
// λˆ„κ΅°κ°€κ°€ μ‚­μ œ λ²„νŠΌμ„ ν΄λ¦­ν•˜μ—¬ /delete 둜 DELETE μš”μ²­μ„ ν•˜λ©΄
app.delete('/delete', function(req, res){
    // DB μ—μ„œ κ²Œμ‹œκΈ€ μ‚­μ œν•˜κΈ°
    req.body._id = parseInt(req.body._id);
    db.collection('post').deleteOne(req.body, function(err, result){
        console.log('κ²Œμ‹œλ¬Ό μ‚­μ œ μ™„λ£Œ');
        res.status(200).send({message : 'μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€.'});
    })
})
  • AJAX μš”μ²­ μ‹œμ— data 에 λ‹΄κΈ΄ μ •λ³΄λŠ” req.body 에 λ‹΄κ²¨μ„œ μ „λ‹¬λœλ‹€.
  • deleteOne() ν•¨μˆ˜λŠ” μ‚­μ œν•˜λ €λŠ” 데이터와 μ½œλ°±ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ 가진닀.
  • λ”°λΌμ„œ, db.collection('post').deleteOne(req.body, function( ){ }) κ³Ό 같이 μž‘μ„±ν•˜κ²Œ 되면 db.collection 의 post 에 μžˆλŠ” 데이터 쀑 req.body 에 ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό μ‚­μ œν•΄λ‹¬λΌλŠ” μ˜λ―Έκ°€ λœλ‹€.
  • μ—¬κΈ°μ„œ ν¬μΈνŠΈλŠ”, req.body 에 λ‹΄κ²¨μ˜¨ μ •λ³΄λŠ” 데이터 νƒ€μž…μ΄ 문자둜 λ°”λ€ŒλŠ” κ²½μš°κ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— ν•„μš”ν•˜λ‹€λ©΄ 숫자둜 λ³€ν™˜ν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€.
    κ·Έλž˜μ„œ req.body._id = parseInt(req.body._id) λΌλŠ” μ½”λ“œλ₯Ό 톡해 숫자둜 λ³€ν™˜ν•΄μ£Όμ—ˆλ‹€.
728x90
λ°˜μ‘ν˜•