๐ŸŒฑ → ๐ŸŒณ

[node.js] View Engine(ejs, pug, nunjucks) ๋ณธ๋ฌธ

Server/Node.js

[node.js] View Engine(ejs, pug, nunjucks)

BAY 2022. 9. 24. 09:45
728x90

๐Ÿ“Œ view engine

โœ… EJS

  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” view engine
  • HTML ๋ฌธ๋ฒ• ์‚ฌ์šฉ
  • ๋ ˆ์ด์•„์›ƒ ๊ธฐ๋Šฅ X

โœ… pug

  • HTML ๋ฌธ๋ฒ•์„ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ์‚ฌ์šฉ 
  • ๋ ˆ์ด์•„์›ƒ ๊ธฐ๋Šฅ O

โœ… nunjucks

  • HTML ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ 
  • ๋ ˆ์ด์•„์›ƒ ๊ธฐ๋Šฅ O

 

โœ”๏ธ EJS ์‚ฌ์šฉํ•˜๊ธฐ

npm i -d ejs

express์— ์–ด๋–ค view engine ์‚ฌ์šฉํ• ์ง€ ์•Œ๋ฆฌ๊ธฐ (์„œ๋ฒ„์ฝ”๋“œ)

app.set('view engine', 'ejs');

ํด๋” ๊ฐ€์žฅ ์™ธ๋ถ€์— views ํด๋” ๋งŒ๋“ค๊ณ  ๋‚ด๋ถ€์— index.ejx ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ 

 

localhost:port๋ฒˆํ˜ธ/users ๊ธฐ๋ณธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด index.js ํŒŒ์ผ ๋„์šฐ๊ธฐ

userRouter.get('/', (req, res) => {
  res.render('index');
});

 

๐Ÿ“ ejs ๋™์  ์›น ์‹œ์ž‘

- ์„œ๋ฒ„ ์ฝ”๋“œ

userRouter.get('/', (req, res) => {
  const userLen = USER.length;
  res.render('index', { USER, userCounts: userLen });
});

- ๋ทฐ ์ฝ”๋“œ

<body>
    <h1>ํšŒ์› ๋ชฉ๋ก</h1>
    <h2>
        ์ด ํšŒ์› ์ˆ˜ <%= userCounts %>
    </h2>
    <ul>
        <li>
            <p>ID: <%= USER[0].id%>
            </p>
            <p>์ด๋ฆ„: <%= USER[0].name%>
            </p>
        </li>
    </ul>
</body>

 

โœ… ejs ๋ฌธ๋ฒ• 

  • ๋ฐ์ดํ„ฐ ๋ฐ›์„ ๋•Œ : <%= %>
  • JS ๋ฌธ๋ฒ•์„ html์— ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ : <% %>

ex) if์™€ for๋ฌธ์„ ์กฐํ•ฉํ•ด์„œ ํšŒ์› ๋ชฉ๋ก ์ „๋ถ€ ๋„์šฐ๋Š” ํŽ˜์ด์ง€ 

<body>
    <h1>ํšŒ์› ๋ชฉ๋ก</h1>
    <h2>
        ์ด ํšŒ์› ์ˆ˜ <%= userCounts %>
    </h2>
    <ul>
        <% if(userCounts> 0) { %>
            <% for(let i=0; i < userCounts; i++) { %>
                <li>
                    <p>ID: <%= USER[i].id %>
                    </p>
                    <p>์ด๋ฆ„: <%= USER[i].name %>
                    </p>
                </li>
                <% } %>
                    <% } else { %>
                        <li>
                            ํšŒ์› ์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค!
                        </li>
                        <% } %>
    </ul>
</body>

 

โœ… css ์ ์šฉํ•˜๊ธฐ 

views ํด๋”์— css ํด๋” ์ƒ์„ฑ ํ›„ style.css ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

css๋กœ index.ejs ๊พธ๋ฏผ ํ›„ index.ejs์—์„œ css ํŒŒ์ผ link ์‹œํ‚ค๊ธฐ

<link rel="stylesheet" href="./views/css/style.css">

...?

์—๋Ÿฌ ๋ฐœ์ƒ

๐Ÿ‘Š๐Ÿป ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ™•์ธ 

css ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ localhost:4000/css/style.css์—์„œ ์ฐพ๊ณ  ์žˆ์Œ 

 

์•ˆ๋˜๋Š” ๊ฒŒ ๋งž์Œ 

-> url๊ณผ back-end ํด๋” ๊ตฌ์กฐ๊ฐ€ ๋™์ผํ•˜๋ฉด ํŽ˜์ด์ง€ ์ ‘์† ์ฃผ์†Œ ๋˜๋Š” api ์ฃผ์†Œ๋งŒ ๋ณด๊ณ ๋„ ์„œ๋ฒ„์˜ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Œ

๋งŒ์•ฝ, ์„œ๋น„์Šค๊ฐ€ ์ค‘์š”ํ•œ ํšŒ์› ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค๋ฉด ํ•ดํ‚น ์œ„ํ—˜ ๋ฐœ์ƒ 

 

๋”ฐ๋ผ์„œ, express ๊ฐ™์€ ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ๋Š” url ์ฃผ์†Œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ back-endํด๋”์˜ ๊ตฌ์กฐ๋ฅผ ์•Œ ์ˆ˜ ์—†๋„๋ก static์ด๋ผ๋Š” ๋ฏธ๋“ค์›จ์–ด ์ œ๊ณต

 

๐Ÿ“static ์‚ฌ์šฉํ•˜๊ธฐ

static์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ํด๋”์˜ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•จ 

์‚ฌ์šฉ๋ฒ•: app.use(express('ํด๋”์œ„์น˜'));

app.use(express.static('views'));

์œ„์˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํด๋” ๊ฒฝ๋กœ์˜ ์‹œ์ž‘์ ์€ localhost:4000/views๊ฐ€ ๋จ

๋”ฐ๋ผ์„œ, ./์˜ ์ƒ๋Œ€ ๊ฒฝ๋กœ -> localhost:4000/views/ ์™€ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง

 

์ด์ œ, index.ejs ํŒŒ์ผ css ๋งํฌ ๊ฒฝ๋กœ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ฉด css๊ฐ€ ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

<link rel="stylesheet" href="./css/style.css">

 

์ฐธ๊ณ , ํ•˜๋‚˜์˜ ํด๋”๋งŒ ๋“ฑ๋ก๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ์•„๋‹˜ ! 

app.use(express.static('js'));
app.use(express.static('views'));

์—ฌ๋Ÿฌ ํด๋”๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ํด๋”๋ฅผ ๊ฐ๊ฐ ์ฐพ์•„ ๋‹ค๋‹ˆ๋ฉด์„œ ํŒŒ์ผ์„ ์ฐพ์Œ(ํŒŒ์ผ ์—†์œผ๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ)

but, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ํด๋”๋ฅผ ์„ค์ •ํ•˜๋Š” ๋งŒํผ ๋„ˆ๋ฌด ๋งŽ์€ ํด๋”๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•˜๋Š”๊ฒŒ ์ข‹์Œ 

๋Œ€๋ถ€๋ถ„ public์ด๋ผ๋Š” ํด๋”๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •ํ•ด๋‘๊ณ  ํ•ด๋‹น ํด๋”๋งŒ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๋งŽ์Œ 

 

public : ๋ธŒ๋ผ์šฐ์ € ๋“ฑ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ํด๋”๋กœ์จ ๋ณดํ†ต css, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” js, ์ด๋ฏธ์ง€ ๋“ฑ์„ ์œ„์น˜ ์‹œํ‚ด

728x90