๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒŒ | WEB DEV/NodeJS

[NodeJS+Express] 12. ๊ธ€ ์ˆ˜์ •๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

by KASSID 2023. 10. 15.

๋ชฉ์ฐจ

    728x90

    ์ด๋ฒˆ์—๋Š” ๊ธ€์„ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž.

     

    0. ๋“ค์–ด๊ฐ€๊ธฐ์ „

    ๊ธ€์„ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •์„ ์š”์•ฝํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    1) ๊ธ€ ๋งˆ๋‹ค ์กด์žฌํ•˜๋Š” ์ˆ˜์ •๋ฒ„ํŠผ ํด๋ฆญ
    2) ์ˆ˜์ •ํŽ˜์ด์ง€์—์„œ ๊ธ€ ์ˆ˜์ • (์ˆ˜์ • ๋Œ€์ƒ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์ด ๊ธฐ์ž…๋˜์–ด์žˆ์Œ)
    3) ์ˆ˜์ •์™„๋ฃŒ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด DB์— ๋ฐ์ดํ„ฐ ์ „์†ก ํ›„ ์ˆ˜์ • ์™„๋ฃŒ

     

    ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ ๊ตฌํ˜„์„ ํ•ด๋ณด์ž!

     

     


    1. ์ˆ˜์ • ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

    1) ์ˆ˜์ • ํŽ˜์ด์ง€

    (1) ์„œ๋ฒ„ํŒŒ์ผ ์„ธํŒ…

    ์ˆ˜์ • ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด ์ˆ˜์ • ๋Œ€์ƒ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ์ž…๋˜์–ด์žˆ๋‹ค.

     

    //server.js
    app.get('/edit/:num', async(request, response) => {
      try {
        let result = await db.collection('post').findOne({_id : new ObjectId(request.params.num)})
        response.render('edit.ejs', {result:result});
      } catch (err) {
        response.send("์˜ค๋ฅ˜!")
      }
    })

    ์ด๋ฅผ ์œ„ํ•ด์„œ /edit์˜ ์ž์‹path๋กœ URLํŒŒ๋ผ๋ฏธํ„ฐ num์„ ๋“ฑ๋กํ•˜๊ณ 

    num์œผ๋กœ ๋ฐ›์€ id๋ฅผ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ DB์—์„œ ๊ฐ€์ ธ์™€์ค€๋‹ค.

     

    findOne() ํ•จ์ˆ˜์— request.params.num์„ value๋กœ ๊ฐ–๋Š” ๊ฐ์ฒด๋ฅผ ์ „์†กํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๊ณ 

    try, catch๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์–ด์„œ ์•ˆ์ •์„ฑ์„ ๋†’์ธ๋‹ค!

    ์ดํ›„ edit.ejs ํŒŒ์ผ๋กœ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‚ด์ค€๋‹ค.

     

     

    (2) ์ˆ˜์ • ๋ฒ„ํŠผ & EJS ํŒŒ์ผ ์ƒ์„ฑ

    ๊ฐ ๊ธ€์˜ detail ํŽ˜์ด์ง€์— ์ˆ˜์ • ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•ด์ค€๋‹ค.

     

    ์˜ˆ์‹œ

    //detail.ejs
    ...
    <a class="edit-btn" href="/edit/<%= result._id %>">์ˆ˜์ •</a>

    <% result._id %>๋ฅผ URLํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „์†กํ•ด์ฃผ๋Š” ๋ฒ„ํŠผ์„ ์ œ์ž‘ํ•ด์ฃผ์—ˆ๋‹ค.

     

     

     

     

    ๊ธ€ ์ˆ˜์ • ๊ธฐ๋Šฅ์€ ๊ธ€ ์“ฐ๊ธฐ ๊ธฐ๋Šฅ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— write.ejs ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•ด ๋งŒ๋“ค์–ด์ค€๋‹ค.

    //edit.ejs
    ...
    <form action="/editpost/<%=result._id%>" method="POST">
      <textarea name="title"><%=result.title%></textarea>
      <textarea name="content"><%=result.content%></textarea>
    </form>

    ์œ„์ฒ˜๋Ÿผ db์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ค€๋‹ค.

    ๋˜ํ•œ ๊ธ€์„ ์ˆ˜์ •ํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ  form ํƒœ๊ทธ์˜ action ์†์„ฑ์—

    /editpost/๊ธ€id ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋Š”๋ฐ ์ด์— ๋Œ€ํ•œ ์„œ๋ฒ„ํŒŒ์ผ ์ž‘์—…์„ ์ง„ํ–‰ํ•ด๋ณด์ž.

     

    โ€ป <form> ํƒœ๊ทธ์—์„œ๋Š” GET, POST ์š”์ฒญ๋งŒ ๊ฐ€๋Šฅํ•จ.. method-override ๋“ฑ์„ ํ™œ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅ!

     

    (3) ๊ธ€ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„

    updateOne({๋ฐ์ดํ„ฐ ์ •๋ณด}, {$set : {์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ} })

    ๊ธ€์„ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” updateOne ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    //server.js
    app.post('/editpost/:num', async(request, response)=>{
      try{
        await db.collection('post').updateOne({_id : new ObjectId(request.params.num)}, 
        {$set: {title:request.body.title, content:request.body.content}})
        response.redirect(`/detail/${request.params.num}`);
      }
      catch(err){
        response.send("์˜ค๋ฅ˜!")
      }
    })

    /editpost์˜ ํ•˜์œ„๋กœ ๋“ค์–ด์˜จ URLํŒŒ๋ผ๋ฏธํ„ฐ num์— ๋“ค์–ด์žˆ๋Š” ๊ธ€id๋ฅผ

    updateOne({๋ฐ์ดํ„ฐ ์ •๋ณด}, {$set : {์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ}}) ํ˜•ํƒœ์— ์ ์šฉํ•ด์ฃผ๋ฉด ์œ„์™€ ๊ฐ™๋‹ค.

    ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ ์ •๋ณด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ๋‘๋ฒˆ์งธ ์ธ์ž์˜ ์ •๋ณด๋กœ ๋ฎ์–ด์”Œ์›Œ์ค€๋‹ค.

    ์ดํ›„ ํ•ด๋‹น ๊ธ€์˜ ์ˆ˜์ •์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ธํŽ˜์ด์ง€๋กœ redirectํ•ด์ฃผ์—ˆ๋‹ค!

     

     

     

    (4) ์•ˆ์ „ํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์œ„ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

    //server.js
    app.post('/editpost/:num', async(request, response)=>{
      try{
        if(request.body.title == ""){
          response.send("์ œ๋ชฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”");
        }
        else if(request.body.title.length > 30){
          response.send("์ œ๋ชฉ์„ 30์ž ์ด๋‚ด๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
        }
        await db.collection('post').updateOne({_id : new ObjectId(request.params.num)}, 
        {$set: {title:request.body.title, content:request.body.content}})
        response.redirect(`/detail/${request.params.num}`);
      }
      catch(err){
        response.status(500).send("DB์—๋Ÿฌ");
      }
    })

    ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ 30์ž ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ๋ฅผ ์ถ”๊ฐ€๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ด์ฃผ์—ˆ๋‹ค!

    ๋Œ“๊ธ€