EJS(Embedded JavaScript)는 클라이언트 템플릿 언어이며, 이는 템플릿을 읽어 엔진의 문법과 설정에 따라서 파일을 HTML 형식으로 변환시키는 모듈이다. EJS는 HTML에서 <% %> 태그를 사용하여 서버의 데이터를 사용하거나 클라이언트에서 코드를 실행 할 수 있다.
디렉토리 구조
express_advanced/
├── data
│ └── user.json
├── node_modules
├── package.json
├── public
│ └── css
│ └── style.css
├── router
│ └── main.js
├── server.js
└── views
├── body.ejs
├── header.ejs
└── index.ejs
EJS 는 Framework 가 아니고, 그저 클라이언트 템플릿이기 때문에, 서버의 디렉토리 구조는 Express Framework의 구조를 그대로 따라간다. 다만 EJS 를 사용하기 위해서 몇가지 설정이 바뀔 수 있다. 그러므로, [10] Express Framework 의 프로젝트를 그대로 복사해서 사용한다.
package.json 설정 및 모듈 설치
package.json
{
"name": "express-advanced",
"version": "1.0.0",
"dependencies":
{
"express": "~4.13.1",
"ejs": "~2.4.1" ,
"body-parser": "~1.14.2",
"express-session": "~1.13.0"
}
}
body-parser : POST 데이터 처리 [RESTful API 편에서 사용됨] express-session : 세션 관리 [세션 편에서 사용됨]
package.json 의 디펜던시 설정이 완료 되었다면, 명령어를 통해 모듈을 설치하자.
npm install
server.js
//include modules
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var session = require('express-session');
var fs = require("fs")
//set View, EJS
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);
//Create Web Server:
var server = app.listen(3000, function(){
console.log("Express server has started on port 3000")
});
//Static Files:
app.use(express.static('public'));
//BodyParser(RESTful API 편에서 사용됨):
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//Session:
app.use(session({
secret: '@#@$MYSIGN#@$#$',
resave: false,
saveUninitialized: true
}));
//bodyParser보다 뒤에 있어야 제대로 작동함:
var router = require('./router/main')(app, fs);
[32번 행]에서 app 객체 이외에, fs 객체도 추가되었기 때문에 main.js도 이를 수정해야 한다.
/router/main.js
module.exports = function(app, fs)
// ... 생략
EJS 문법
EJS에서는 두가지만 알면 된다.
<% JavaScript Code %> // JavaScript 실행
<%= JavaScript Object %> // JavaScript 객체 출력
라우터에서 뷰(View) 로 정보 전송하기
JSON 데이터를 render 메소드의 두번 째 인자로 전달함으로서 뷰(View) 단에서 라우터의 데이터를 출력할 수 있게 된다.
/router/main.js
module.exports = function(app, fs)
{
app.get('/',function(req,res){
res.render('index', {
title: "MY HOMEPAGE",
length: 5
})
});
}
데이터를 출력할 뷰(View) 를 생성하자. 확장자는 ejs 가 된다.
/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>
밑줄 친 부분에서 라우터에서 전달한 JSON 객체의 데이터에 접근하고 있음을 확인할 수 있다.
title, length 가 제대로 출력되었음을 확인할 수 있다. 덤으로 <% %> 태그를 통해 JavaScript의 사용이 가능함을 확인했다.