ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Node.js/Node.js ๊ณต๋ถ€

5. ํ…œํ”Œ๋ฆฟ ์—”์ง„ pug

๋Œ•๋Œ•์ด๋ฐœ๐Ÿพ 2018. 4. 12. 23:42



์ด๋ฒˆ์—” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋ผ๋Š” ๊ฑธ ์†Œ๊ฐœํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์—”์ง„์€ pug(ํ˜„)  jade(๊ณผ๊ฑฐ) ๋ผ ๋ถˆ๋ ธ๋˜ ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์ค‘์— ํ•˜๋‚˜์ด๋‹ค. ํ˜„ ์‹œ์ ์—์„œ ๋‹ค์šด๋ฐ›์œผ๋ ค๋ฉด pug๋ฅผ ์จ์•ผํ•œ๋‹ค. ์ผ๋‹จ ๋Š˜ ๊ทธ๋ ‡๋“ฏ์ด npm install์„ ํ•ด์•ผํ•œ๋‹ค.


$ npm install pug --save


๋’ค์— --save์™€ ๊ฐ™์€ ์˜ต์…˜๋ถ€๋ถ„์€ ์„ ํƒ์‚ฌํ•ญ์ด์ง€๋งŒ ์ผ๋‹จ ๋ชจ๋ฅด๋ฉด --save๋ฅผ ๊ธฐ๋ณธ ์˜ต์…˜์œผ๋กœ ๋‘๊ณ  ์‚ฌ์šฉํ•ด๋„ ๋ฌด๊ด€ํ•˜๋‹ค. ์•„๋งˆ ํ˜„์žฌ init ํ•˜๊ณ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— ํ•œํ•ด์„œ๋งŒ npm์„ installํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ฆ‰ ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ๋Š” ๊ทธ ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ์‚ฌ์šฉ ๋ชปํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  -g๋ผ๊ณ ํ•ด์„œ ์ „์—ญ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ์˜ต์…˜๋„ ์žˆ๋Š”๋ฐ npm์„ ํฌ์ŠคํŒ…ํ•˜๋Š”๊ฑด ์•„๋‹ˆ๋‹ˆ ์ผ๋‹จ ์—ฌ๊ธฐ๊นŒ์ง€..


์ผ๋‹จ ์›นํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ html ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. html์–ธ์–ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์•Œ๋“ฏ์ด <html> ํƒœ๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด </html> ์™€ ๊ฐ™์ด ๋ฐ˜๋“œ์‹œ ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•œ๋‹ค. (๋ฌผ๋ก  ์ž๋™์™„์„ฑ์œผ๋กœ ํ•ด์ฃผ๊ธด ํ•˜์ง€๋งŒ..)


pug์™€ ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ์ด๋Ÿฌํ•œ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์—ฌ์ค€๋‹ค. ๋‹ซ๋Š” ํƒœ๊ทธ๋“ค๋งŒ ์‚ฌ๋ผ์ ธ๋„ ์ผ๋‹จ ์ฝ”๋“œ๊ธธ์ด๊ฐ€ ์งง์•„์ง€๋Š” ๊ฒƒ๋„ ์žˆ๊ณ , html ํŒŒ์ผ์ด ์ผ๋‹จ ๋ถ„๋ฆฌ๊ฐ€ ๋˜๋‹ˆ ๊ทธ๊ฒƒ ๋˜ํ•œ ๊ฐ•์ ์ด๋‹ค.


์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋™์ , ์ •์  ํŒŒ์ผ ์„œ๋น„์Šค์— ๊ด€ํ•˜์—ฌ ๊ธ€์„ ์ผ์—ˆ๋Š”๋ฐ ๋‘˜ ๋‹ค ์žฅ๋‹จ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐ๊ฐ์˜ ์žฅ์ ๋งŒ ์ทจํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 


๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ pug ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๊ฒ ๋‹ค.


1)  ์ˆœ์ˆ˜ html ์ฝ”๋“œ๋งŒ ์žˆ๋Š” ํ˜•ํƒœ

1
2
3
4
5
6
7
8
9
10
11
html
    head
        meta(charset='utf-8')
    body
        form(action='/form_receiver' method='post')
            p
                input(type="text" name="title")
            p
                textarea(name='description')
            p
                input(type="submit" value="์ „์†ก")

cs


๋ญ”๊ฐ€ html ๊ฐ™๊ธดํ•œ๋ฐ ์ฝ”๋“œ๋„ ์งง๊ณ .. ์ด๊ฒŒ ๋ญ”๊ฐ€ ์‹ถ์€๋ฐ pug์—์„œ๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ํ•˜์œ„ํƒœ๊ทธ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์ด ํŽ˜์ด์ง€๋ฅผ ์†Œ์Šค๋ณด๊ธฐ๋กœ ํ•˜๋ฉด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <form action="/form_receiver" method="post">
      <p>
        <input type="text" name="title">
      </p>
      <p>
        <textarea name="description"></textarea>
      </p>
      <p>
        <input type="submit" value="์ „์†ก">
      </p>
    </form>
  </body>
</html>
cs

์ด๋ ‡๊ฒŒ ๋ณ€ํ™˜๋˜์–ด์„œ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. pug ํŒŒ์ผ์ด ๊บฝ์‡ ๊ฐ€ ์—†์–ด์ง€๊ณ  ๋‹ซ๋Š”ํƒœ๊ทธ๊ฐ€ ์ฃ„๋‹ค ์ƒ๋žต๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ์—” ๋˜‘๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ์ด๊ฑธ๋กœ pug์˜ ๋ชจ๋“  ๋ฌธ๋ฒ•์„ ์„ค๋ช…ํ•  ์ˆœ ์—†๊ณ  ๋‚˜ ๋˜ํ•œ ๊ทธ ๋ฌธ๋ฒ•์„ ๋‹ค ๊ณต๋ถ€ํ•˜์ง„ ์•Š์•˜๋‹ค.. 
๊ทผ๋ฐ html ํŒŒ์ผ์—์„  js ์ฝ”๋“œ๋ฅผ ๋ชป์“ด๋‹ค๊ณ  ํ–ˆ๋˜๊ฒŒ ํฌ๋‚˜ํฐ ์•ฝ์ ์ด ์•„๋‹ˆ์—ˆ๋˜๊ฐ€? ํ•˜์ง€๋งŒ pug ์—”์ง„์—์„œ๋Š” ๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.


2) javascript ๋ฌธ๋ฒ• ํฌํ•จ
1
2
3
4
5
6
7
8
9
html
    head
        title=title
    body
        Written by JooHyeong Lee 
        ul
            -for(var i = 0; i<5; i++)
                li coding
        div=time
cs

๋ณด๋ฉด ๋ฐ˜๋ณต๋ฌธ๊ณผ ์‹œ์Šคํ…œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” time์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‹จ ์•ž์— - ๋ฅผ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋‹ˆ ์ฃผ์˜. ํ•ด๋‹น ์†Œ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด html ์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
  <head>
    <title>Pug</title>
  </head>
  <body>
    <Written>by JooHyeong Lee </Written>
    <ul>
      <li>coding</li>
      <li>coding</li>
      <li>coding</li>
      <li>coding</li>
      <li>coding</li>
    </ul>
    <div>Thu Apr 12 2018 23:26:41 GMT+0900 (JST)</div>
  </body>
</html>
cs



์ง€๊ธˆ๊นŒ์ง€ ์ญ‰ pug ํŒŒ์ผ๋งŒ ์„ค๋ช…์„ ํ•ด์คฌ์œผ๋‚˜ ๊ฒฐ๊ตญ์—” ์ด๊ฑธ node js์—์„œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ช‡๊ฐ€์ง€ ์„ ์–ธ์ด ํ•„์š”ํ•˜๋‹ค.


1
2
app.set('view engine','pug');
app.set('views','./views');



cs


์ด ๋‘์ค„์ด ๊ธฐ์กด app.js ํŒŒ์ผ์— ํ•„์š”ํ•˜๋‹ค. ๋ฌผ๋ก  app. ์„ ์“ฐ๋ ค๋ฉด require('express')๋ฅผ ํ•ด์•ผํ•˜๋Š”๊ฑด ๋‹น์—ฐํ•˜๋‹ค.
์ฒซ ๋ฒˆ์งธ ์ค„์€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ pug ๋ผ๋Š” ์—”์ง„์„ ์“ฐ๊ฒ ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๊ณ , ๋‘๋ฒˆ์งธ ์ค„์€ pug ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์ด๊ฒƒ๋˜ํ•œ ๊ด€์Šต์ ์œผ๋กœ views ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. 

์ฒซ๋ฒˆ์งธ pug๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์ž. (๋‚˜๋Š” 3000๋ฒˆ ํฌํŠธ ์‚ฌ์šฉ ์ค‘)

1
2
3
app.get('/form',function(req,res) {
    res.render('form');
});
cs

localhost:3000/form ์˜ ๊ฒฝ๋กœ๋กœ ๋ผ์šฐํ„ฐ๋ฅผ ์„ค์ •ํ•ด์ค€ ๊ฒƒ์ธ๋ฐ ๊ธฐ์กด์˜ send์™€๋Š” ๋‹ฌ๋ฆฌ ์—ฌ๊ธฐ์„  render๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ pugํŒŒ์ผ๋ช…์„ ๋„ฃ๋Š”๋‹ค. ์ฆ‰ views ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” form.pug ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.



๋‘๋ฒˆ์งธ pug๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ผ์šฐํ„ฐ.

1
2
3
app.get('/temp',function(req,res){
    res.render('temp',{time:Date(),title:"Pug"});
});
cs

localhost:3000/temp ์˜ ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•˜๋ฉด ๋˜๋Š”๋ฐ ์•„๊นŒ์™€ ๋‹ค๋ฅด๊ฒŒ ๋’ค์— ๋‚˜์˜ค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋”์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

์ด๋Š” pug์—์„œ ์ž‘์„ฑํ•œ javascript ์ฝ”๋“œ์—์„œ ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ์—ฌ๊ธฐ์„œ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ 


title=title

div=time

์ด ๋‘ ๋ถ€๋ถ„์˜ ๊ฐ’์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ˆœ์„œ ์ƒ๊ด€์—†์ด { } ์•ˆ์— ํ•„์š”๋กœ ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒํผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.


๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2024/11   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
๊ธ€ ๋ณด๊ด€ํ•จ