EJS

Directory Structure

Test02_EXPRESS/
โ”œโ”€โ”€ data
โ”‚   โ””โ”€โ”€ user.json
โ”œโ”€โ”€ node_modules
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ public
โ”‚   โ””โ”€โ”€ css
โ”‚       โ””โ”€โ”€ style.css
โ”œโ”€โ”€ router
โ”‚   โ””โ”€โ”€ main.js
โ”œโ”€โ”€ server.js
โ””โ”€โ”€ views
    โ”œโ”€โ”€ body.ejs
    โ”œโ”€โ”€ header.ejs
    โ””โ”€โ”€ index.ejs

1. Add dependency

1-1 Update package.json

package.json

{
  "name": "Test02_EXPRESS",
  "version": "1.0.0",
  "dependencies": {
    "ejs": "~2.4.1",
    "express": "^4.17.1",
    "body-parser":"~1.19.0",
    "express-session": "~1.17.0"
  }
}
  • body-parser

    : POST data ์ฒ˜๋ฆฌ

  • express-session

    : session ๊ด€๋ฆฌ

Install the modules

npm install

1-2 Update `server.js``

server.js

var express = require('express');
var app = express();

// server๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก HTML์˜ ์œ„์น˜๋ฅผ ์ •์˜ํ•ด์ฃผ๊ธ”
app.set('views',__dirname + '/views');

// server๊ฐ€ HTML rendering์„ ํ•  ๋•Œ EJS engine ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๊ธ”
app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);

var server = app.listen(8000, function(){
    console.log("Express server has started on port 8000!!")
})

// public directory๋ฅผ static folder๋กœ ์„ค์ •
app.use(express.static('public'));

//body-parser ์‚ฌ์šฉํ•˜๊ธฐ
var bodyParser = require('body-parser');

// express-session ์‚ฌ์šฉํ•˜๊ธฐ
var session = require('express-session');
var fs = require('fs')

app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(session ({
    secret: '@this#is#secret#key@',
    resave: false,
    saveUninitialized: true
}))

// router module์ธ main.js๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ app์— ์ „๋‹ฌํ•˜๊ธ”
var router = require('./router/main')(ap,fs);
  • fs

    • ํŒŒ์ผ์„ ์—ด๊ธฐ ์œ„ํ•ด ๋ถˆ๋Ÿฌ์˜จ Node.js built-in module

  • secret

    • ์ฟ ํ‚ค๋ฅผ ์ž„์˜๋กœ ๋ณ€์กฐํ•˜๊ธฐ ์œ„ํ•œ sign ๊ฐ’!

    • ์›ํ•˜๋Š” ๊ฐ’ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค

  • resave

    • session์„ ์–ธ์ œ๋‚˜ ์ €์žฅํ•  ์ง€ ์ •ํ•˜๋Š” ๊ฐ’

    • express-session documentation์—์„œ๋Š” ์ด ๊ฐ’์„ false๋กœ ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ true๋กœ ์„ค์ •ํ•จ!

  • saveUninitialized

    • uninitialized session์ด๋ž€ ์ƒˆ๋กœ ์ƒ๊ฒผ์ง€๋งŒ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ session์„ ์˜๋ฏธํ•จ

    • documentation์—์„œ๋Š” true๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•จ!

2. EJS Template Engine

  • Teamplate ์„ ์ฝ์–ด engine์˜ ๋ฌธ๋ฒ•๊ณผ ์„ค์ •์— ๋”ฐ๋ผ์„œ file์„ HTML ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ๋ชจ๋“ˆ

  • HTML์—์„œ <% %> ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ server์˜ data๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ์Œ!

Syntax

<% JavaScript code %>
<% ์ถœ๋ ฅํ•  JavaScript object %>  => JavaScript ๊ฐ์ฒด๋ฅผ router์—์„œ ๋ฐ›์•„ ์˜ฌ ์ˆ˜๋„ ์žˆ์Œ!  

2-1. VIEW๋กœ ๋ฐ์ดํ„ฐ ๋„˜๊ธฐ๊ธฐ

main.js

module.exports = function(app,fs){

    app.get('/', function(request, response) {
        response.render('index', {
            title: "MY HOMEPAGE",
            length: 5
        })
    });
}
  • JSON data๋ฅผ render method์˜ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌํ•จ์œผ๋กœ์จ page์—์„œ data๋ฅผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ

2-2. VIEW์—์„œ data ์ ‘๊ทผ & loop

views > index.ejs

<html>
  <head>
  <title><%= title %></title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
  </head>
  <body>
    <h1>Loop it!</h1>
    <ul>
        <% for(var i=0; i<length; i++){ %>
            <li>
                <%= "LOOP" + i %>
            </li>
        <% } %>
    </ul>
  </body>
</html>

execute

node server.js

result

image-20200406024630806

2-3. EJS ๋ถ„ํ• ํ•˜๊ธฐ

PHP ๋‚˜ Rails ์—์„œ ์ฒ˜๋Ÿผ EJS์—์„œ๋„ code๋ฅผ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ถˆ๋Ÿด์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

File ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

<% include FILENAME %>

views > header.ejs

 <title>
     <%= title %>
 </title>
 <link rel="stylesheet" type="text/css" href="css/style.css">
 <script>
    console.log("HelloWorld");
 </script>

views > body.ejs

<h1>Loop it!</h1>
<ul>
    <% for(var i=0; i<length; i++){ %>
        <li>
            <%= "LOOP" + i %>
        </li>
    <% } %>
</ul>

views > index.ejs ์ˆ˜์ •!

<html>
  <head>
    <% include ./header.ejs %>
  </head>
  <body>
    <% include ./body.ejs %>
  </body>
</html>

์žฌ๋ฐŒ๋‹ค!!!

Last updated

Was this helpful?