Twitter Bootstrap과 Node.js를 이용하여 Single Page App을 만들어 보자. 여기서는 Backbone.js를 배제하고 만드는 방법이다. 외국 블로깅 글을 따라서 실행보면서 정리한다. (총 3 part중 part 1)
서버단 코드 만들기
1) GitHub에서 소스 다운로드 및 사전 설정
- 소스 다운로드 : $ git clone https://github.com/iatek/one-page-app.git
- node.js 와 npm 이 설치되어 있어야 한다
- Express 프레이워크 설치 : npm install express
- ejs 템플릿 엔진 설치 : npm install ejs npm install ejs-locals
$ npm install ejs-locals
npm http GET https://registry.npmjs.org/ejs-locals
npm http 304 https://registry.npmjs.org/ejs-locals
ejs-locals@1.0.2 node_modules\ejs-locals
// ejs 설치 안하면 에러 발생함
UserXP@NUKNALEA /d/Git_repositories/one-page-app (master)
$ node server
module.js:340
throw err;
^
Error: Cannot find module 'ejs'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (d:\Git_repositories\one-page-app\node_modules\ejs-locals\index.js:1:73)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
UserXP@NUKNALEA /d/Git_repositories/one-page-app (master)
$ npm install ejs
npm http GET https://registry.npmjs.org/ejs
npm http 304 https://registry.npmjs.org/ejs
ejs@0.8.3 node_modules\ejs
// 정상 수행됨
UserXP@NUKNALEA /d/Git_repositories/one-page-app (master)
$ node server
Listening on port 4000 in development mode
// 로컬에서 브라우져 호출시 reponsive web으로 반응한다 -width를 줄이면 메뉴자동변경됨- (데모확인)
2) Express 환경파일 설정
- app.js
// ejs template engine 사용 var express = require('express'), engine = require('ejs-locals'), app = express(); // init export exports.init = function(port) { app.locals({ _layoutFile:'layout.ejs' }) app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'ejs'); app.use(express.bodyParser()); app.use(express.methodOverride()); // Static pages 서비스 app.use(express.static(__dirname + '/static')); // Session과 Cookie 관리 app.use(express.cookieParser()); app.use(express.cookieSession({cookie:{path:'/',httpOnly:true,maxAge:null},secret:'skeletor'})); app.use(app.router); //app.enable("jsonp callback"); }); app.engine('ejs', engine); app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); // app.use(express.logger({ format: ':method :url' })); }); app.configure('production', function(){ app.use(express.errorHandler()); }); app.use(function(err, req, res, next){ res.render('500.ejs', { locals: { error: err },status: 500 }); }); server = app.listen(port); console.log("Listening on port %d in %s mode", server.address().port, app.settings.env); return app; }
3) Routing 만들기
- server.js : app이 시작하는 초기 파일이다. app route를 정의한다
- "app.get", "app.post", "app.del" 을 사용한다
- 4개의 HTTP get routing 호출
/(default homepage)
/login
/logout
/admin
var port = process.env.PORT || 4000, app = require('./app').init(port), dirty = require('dirty'); var locals = { author:'in1' // add other vars here }; var userDb = dirty('user.db'); app.get('/', function(req,res){ locals.date = new Date().toLocaleDateString(); var appDb = dirty('app.db'), sectionsDb; appDb.on('load', function() { sectionsDb = dirty('sections.db'); sectionsDb.on('load', function() { /* sectionsDb.forEach(function(key, val) { console.log('Found key: %s, val: %j', key, val); }); */ res.render('index.ejs', {locals:locals,sections:sectionsDb,app:appDb.get('app'),page:appDb.get('page')}); }); }); }); ... 중략 ... app.post('/contact', function(req,res){ appDb = dirty('app.db'); console.log('contact form submit.'); appDb.on('load', function() { console.log('Form submitted.'); res.send('Thank you.'); }); }); /* The 404 Route (ALWAYS Keep this as the last route) */ app.get('/*', function(req, res){ res.render('404.ejs', locals); });
4) Persistence 유지 하기
- Node-Dirty를 이용하여 disk log형태로 가벼운 데이터베이스겸으로 사용한다
- 5개의 database 파일안에 관련 표현할 내역이 .db파일에 들어있음 (백만 record 미만 사용하는 앱에 적당)
app.db : 애플리케이션 래벨 설정
sections.db : 섹션 설정과 내용 저장
user.db : 사용자 credential 과 admin 권한
snippet.db : 미리 생성할 섹션 내용을 위한 코드 조각 저장
post.db : 연락처와 이메일 폼 결과 저장
- server.js에서 require('dirty')
> 다음은 UI Part to be continued...
<참조>
- Single Page App with Twitter Bootstrap and Node.js : 데모사이트
- SPA를 위한 storage : node-dirty
- Node의 MVC Framework : Express.js
'AngularJS > Concept' 카테고리의 다른 글
[AngularJS] 개발자 가이드 - 03. HTML 컴파일러 (0) | 2013.04.10 |
---|---|
[AngularJS] 개발자 가이드 - 02. 시작하기 (0) | 2013.04.10 |
[AngularJS] 개발자 가이드 - 01. 개요 (0) | 2013.04.10 |
[Directive Driven] 사용자 정의 컴포넌트 만들기 (0) | 2013.04.09 |
[SPA] 기본개념 잡기 (0) | 2013.01.11 |