๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/Node.js MongoDB

[Node.js / MongoDB] HTML ์— DB ๋ฐ์ดํ„ฐ ๋„ฃ์–ด๋ณด๊ธฐ

by Connecting-the-dots 2022. 3. 11.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ๊ธ€์“ฐ๊ธฐ ํŽ˜์ด์ง€์—์„œ ์ž‘์„ฑํ•œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ Submin ๋ฒ„ํŠผ์„ ํด๋ฆญํ•จ๊ณผ ๋™์‹œ์— ์„œ๋ฒ„์˜ DB ๋กœ ์ „์†กํ•˜๊ณ , ์„œ๋ฒ„์— ์ €์žฅ๋œ DB ์—์„œ ๋ฆฌ์ŠคํŠธ๋ณด๊ธฐ ํŽ˜์ด์ง€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.

๐Ÿ’œ HTML ๋ Œ๋”๋ง ์—”์ง„ EJS ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

  • ์ด์ „์— sendFile() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ HTML ํŒŒ์ผ๋งŒ ์ „์†กํ•ด์ฃผ๋Š” ์‹ค์Šต์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ํ•ด๋‹น ๋ฐฉ๋ฒ•์œผ๋กœ HTML ํŒŒ์ผ๋งŒ ๋ณด๋‚ด์ฃผ๋ฉด ์‹ค์ œ DB ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ๋ณด๋‚ผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Static ํŽ˜์ด์ง€๊ฐ€ ๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ HTML ์— ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ผ์ข…์˜ HTML ๋ Œ๋”๋ง ์—”์ง„์ด ํ•„์š”ํ•œ๋ฐ ๊ทธ ์ค‘ ํ•˜๋‚˜์ธ EJS ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค.
  • ์šฐ์„ , ํ„ฐ๋ฏธ๋„์—์„œ npm install ejs ๋ผ๊ณ  ์ž…๋ ฅํ•˜์—ฌ ejs ๋ฅผ ์„ค์น˜ํ•ด์ค€ ๋‹ค์Œ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ JavaScript ํŒŒ์ผ ์ƒ๋‹จ์— ๋„ฃ์–ด์ค€๋‹ค.
app.set('view engine', 'ejs');
  • ์ด์ œ EJS ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, ํŒŒ์ผ์€ ๊ทธ๋ƒฅ html ํŒŒ์ผ์ฒ˜๋Ÿผ ๋งŒ๋“ค๋˜ ํ™•์žฅ์ž๋งŒ ejs ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
    (์ฃผ์˜ํ•  ์ ์€์€ ejs ํŒŒ์ผ์€ ์ž‘์—…ํด๋” ๋‚ด์— ๋ฌด์กฐ๊ฑด views ๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋”๋ฅผ ๋งŒ๋“  ํ›„ ๊ทธ ํด๋”์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.) 

๐Ÿ’œ EJS ํŒŒ์ผ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

ํ˜„์žฌ ๋ฐฐ์—ดํ˜•ํƒœ์˜ posts 

<p class="mb-2">ํ• ์ผ : <%= posts[0].ํ• ์ผ %></p>
  • HTML ์ค‘๊ฐ„์ค‘๊ฐ„ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์œ„์™€ ๊ฐ™์ด <%= ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜๋ช… %> ์˜ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ฉด HTML ๊ธ€์ž๋กœ ๋ Œ๋”๋ง๋œ๋‹ค.
  • EJS ํŒŒ์ผ์—์„œ 'ํ• ์ผ : ' ๊ธ€์ž ๋’ค์— DB ์—์„œ ๋ฐ›์•„์˜จ ํ• ์ผ ๋‚ด์šฉ์„ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐฐ์—ด์˜ 0๋ฒˆ์งธ ๊ฐ์ฒด์˜ 'ํ• ์ผ' ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผํ•œ๋‹ค. (posts[0].ํ• ์ผ)

  • EJS ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด HTML ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ JavaScript ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
<% for(let i = 0; i < posts.length; i++){ %>
    <div style="background: rgb(247, 247, 247); padding: 10px; margin: 10px 0;">
      <p class="mb-2">ํ• ์ผ : <%= posts[i].ํ• ์ผ %></p>
      <p class="mb-2">๋งˆ๊ฐ์ผ : <%= posts[i].๋งˆ๊ฐ์ผ %></p>
    </div>
<% } %>

 

  • HTML ์— if ๋ฌธ์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ for ๋ฌธ๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ์—๋Š” <% %> ๋‚ด๋ถ€์— JavaScript ๋ฌธ๋ฒ•์„ ๋‹ด์•„์ฃผ๋ฉด ๋œ๋‹ค.

๐Ÿ’œ GET ์š”์ฒญ ์‹œ DB ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ๋ณด์—ฌ์ฃผ๊ธฐ

  • ์ฝ”๋“œ์งœ๋Š” ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    1. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ /list ๊ฒฝ๋กœ๋กœ GET ์š”์ฒญ์„ ํ•˜๋ฉด
    2. MongoDB ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์–ด
    3. list.ejs ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ๋ณด์—ฌ์ค€๋‹ค.
  • MongoDB ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
db.collection('post').find();
db.collection('post').findOne();
  • ๋‚˜์˜ ๊ฒฝ์šฐ, .find().toArray() ๋ฅผ ์ด์šฉํ•˜์—ฌ post collection ์— ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ Array ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์™”๋‹ค.
// ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ /list ๊ฒฝ๋กœ๋กœ GET ์š”์ฒญ์„ ํ•˜๋ฉด
app.get('/list', function(req, res){
	// db.collection ์— ์žˆ๋Š” post ์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
    db.collection('post').find().toArray(function(err, result){
        console.log(result); // console ์ฐฝ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด ํ™•์ธ
        res.render('list.ejs', {posts : result});
    });
  • .render() ํ•จ์ˆ˜์˜ ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ { posts : result } ์™€ ๊ฐ™์ด ์ ์–ด์ฃผ๋ฉด DB ์—์„œ ๊ฐ€์ ธ์˜จ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด์ธ result ๋ฅผ posts ๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด์•„ EJS ํŒŒ์ผ๋กœ ๋ณด๋‚ด์ค€๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด EJS ํŒŒ์ผ์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— EJS ๋ฌธ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ posts ๋ณ€์ˆ˜์— ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
<% for(let i = 0; i < posts.length; i++){ %>
    <div style="background: rgb(247, 247, 247); padding: 10px; margin: 10px 0;">
      <p class="mb-2">ํ• ์ผ : <%= posts[i].ํ• ์ผ %></p>
      <p class="mb-2">๋งˆ๊ฐ์ผ : <%= posts[i].๋งˆ๊ฐ์ผ %></p>
    </div>
<% } %>
  • ๋ชจ๋“  ๊ณผ์ •์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์กŒ๋‹ค๋ฉด ๋ฆฌ์ŠคํŠธ๋ณด๊ธฐ ํŽ˜์ด์ง€์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•