ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 6장 express 정적파일 컨트롤 + 뷰시스템 (ejs)
    MeanStack (deprecated) 2016. 6. 10. 22:17




    web application 이라면 당연히 다양한 뷰를 선보여야 한다.  텍스트만 딸랑나오는 web 이라면 누구나 바로 흥미를


    잃어 버릴 것 이다. 


    그래서 이번엔 express 환경에 뷰 시스템을 붙여보자. 원래라면 angular.js 를 붙여야 하지만 , 그건 나중에..


    일단은 기본적인 html 을 붙여보자. 


    express 에서 뷰를 생성하는 메소드는 2개가 있다. app.render() 는 뷰를 생성 하기 위해 사용되며, 콜백 함수에 


    HTML 을 전달한다. 그리고 또 한가지 res.render() 는 뷰를 지역적으로 생성하며, 응답으로 HTML 을 전송한다.


    흔히 HTML을 응답으로 받기를 원하기 때문에 res.render() 를 더욱 자주 사용한다. 



    express 에는 유명한 HTML 템플릿 엔진으로 ejs 와 jade 가 있는데 , 여기서는 ejs 를 사용할 것 이다. 


    먼저 ejs 를 사용하기 위해 ejs를 설치해야 한다.  


    cmd 창에서 npm install ejs --save 를 하던, package.json 에 ejs 를 추가하던 사용자의 마음에 드는대로


    설치를 하자. 



    {
        "name" : "test",
        "version" : "1.0.0",
        "description" : "",
        "main" : "index.js",
        "dependencies" : {
            "body-parsor" : "^1.15.1",
            "compression" : "^1.6.2",
            "express" : "^4.13.4",
            "forever" : "^0.15.2",
            "method-override" : "^2.3.6",
            "morgan" : "^1.7.0",
            "ejs" : "~1.0.0"
        },
        "devDependencies" : {
            "color" : "latest"
        },
        "scripts" : {
            "test" : "echo \"Error: no test specified\" && exit 1"
        },
        "author" : "",
        "license" : "ISC"
    }

    ( 이번엔 package.json 에 추가하여 설치했다.) 



    EJS 를 설치 하였으니 이제 express 초기화에 ejs 엔진을 사용하도록 코드를 바꿔주자. 


    config 폴더 안의 express_config.js 파일을 수정하자. 



    var express = require('express'),
        morgan = require('morgan'),
        compress = require('compression'),
        bodyParser = require('body-parser'),
        methodOverride = require('method-override')
        ;
    
    module.exports = function() {
        var app = express();
    
        if(process.env.NODE_ENV === 'development') {
            app.use(morgan('dev'));
        }else if (process.env.NODE_ENV === 'production') {
            app.use(compress());
        }
    
        app.use(bodyParser.urlencoded({
            extended : true
        }));
        app.use(bodyParser.json());
        app.use(methodOverride());
    
        app.set('views', './app/views');           // New!! 
        app.set('view engine', 'ejs');             // New!!
    
        require('../app/routes/index.server.routes.js')(app);
        return app;
    }
    



    New!! 부분이 새롭게 추가 된 부분이다.


    app.set() 은 앱의 전반적인 설정을 읽고 쓰는 일반적인 장소를 제공한다. 


    예를 들면 app.set('title', 'this is a title') 이라고 하면 서버가 title 을 'this is a title' 로 설정을 할 수 있다.


    나중에 app.get('title') 로 다시 가져올 수도 있다.  


    더 쉽게 생각하면 ('키','값') 으로 설정을 저장한다고 보면 된다. 


    대부분은 개발자가 직접 설정하여 사용하지만 express 에서는 내부적으로 이걸 이용해서 사용하기도 한다.


    여기서 views , view engine, jsonp callback name 과 같은 것 들은 express 내부에서 특정하게 사용하는 


    용도로 지정되어 있다. 


    위 에서 쓰인 views 는 view 파일이 모여있는 장소를 설정하고, view engine 은 express 의 view template 으로


    ejs 형식을 사용한다고 설정 하는 것 이다. 



    이제 뷰 엔진도 설정했으니 첫 뷰를 생성해보자. 

    <!DOCTYPE html>
    <html>
        <head>
            <%= title %>
        </head>
        <body>
            <h1><%= title %></h1>
        </body>
    </html>
    


    ejs 뷰는 기본적으로 ejs 태그가 섞인 HTML 파일인데, 확장자로는 당연히 .ejs 를 사용할 것 이다.


    먼저 app/views 폴더로 가서 index.ejs 파일을 만들고 첫 뷰 파일을 만들어 보자. 





    첫 index.ejs 를 만들었다. 딱 보면 딱 하고 바로 알아 볼 수 있을 것이다. 


    <%= %> 안에 변수를 넣는 것 말고는 다른 것은 HTML 파일과 똑같다. 


    이제 이 뷰를 선보이기 위해 app/controllers 안에 index.server.controller.js 를 수정하자. 


    exports.render = function(req,res) {
        res.render('index', {title : 'First Title'});
    }


    요 코드도 딱 보면 아 하고 나올 것 이다. 


    res.render() 함수로 첫 번째 인수는 .ejs 이름이 빠진 ejs 파일 이름이고, 두번째 인수는 템플릿에 들어 갈 


    변수를 설정 하였다. 


    res.render() 함수는 이제 아까 위에서 express_config.js 에 설정해준 views 폴더 , ejs 엔진에 따라서 


    app/views 폴더로 가서 index 라는 이름의 ejs 파일을 찾을 것 이고 그놈을 데리고 오면서 title 변수에


    'First Title' 을 입력해서 선보일 것 이다. 


    이제 저장하고 서버를 시작해서 한번 결과를 보자 . 




    본문에 'First Title' 과 사이트 이름역시 'First Title' 로 바뀌었을 것 이다. 



    이어서 이번엔 express 정적파일 컨트롤을 통하여 그림을 넣어보자. 


    express 에서 정적파일을 컨트롤 하기 위해서는 정적 파일이 있는 곳을 지정해 주어야 한다.


    app.use(express.static('폴더 경로')) 로 지정을 한다. 


    config 폴더로 가서 express_config.js 파일을 수정하자.  




    var express = require('express'),
        morgan = require('morgan'),
        compress = require('compression'),
        bodyParser = require('body-parser'),
        methodOverride = require('method-override')
        ;
    
    module.exports = function() {
        var app = express();
    
        if(process.env.NODE_ENV === 'development') {
            app.use(morgan('dev'));
        }else if (process.env.NODE_ENV === 'production') {
            app.use(compress());
        }
    
        app.use(bodyParser.urlencoded({
            extended : true
        }));
        app.use(bodyParser.json());
        app.use(methodOverride());
    
        app.set('views', './app/views');            
        app.set('view engine', 'ejs');             
    
        require('../app/routes/index.server.routes.js')(app);
        app.use(express.static('./static'));     // new 
        return app;
    }
    




    app.use(express.static('./static')) 으로 정적파일 폴더를 static 폴더로 설정 하였다.


    여기서 주의해서 볼 것은 정적파일 폴더를 설정하는 미들웨어가 라우팅 파일 호출 전에 있다는 사실을 보자.


    만약 정적 파일 설정 코드가 라우팅 파일 호출 위에 있다면 express 는 HTTP 요청 경로를 찾기위해 정적폴더를 


    먼저 찾아볼 것 이다.  이는 응답을 다소 느리게 만들기 때문에 정적폴더 호출은 꼭 라우팅 호출 밑으로 가야한다.



    자 이젠 아까만든 ejs 파일에 그림파일을 넣어보자 .


    먼저 static/images 폴더 안에 원하는 그림을 넣자. 



    그림을 넣었다면 app/views 폴더의 index.ejs 파일을 수정한다. 


    본인은 overwatchlogo.png 라는 고오급시계 로고 이미지를 넣었다. 

    <!DOCTYPE html>
    <html>
        <head>
            <%= title %>
        </head>
        <body>
            <img src="images/overwatchlogo.png" alt="logo">
            <h1><%= title %></h1>
        </body>
    </html>
    




    위와 같이 일반전인 img 태그로 경로를 지정해주자. 


    정적폴더를 static 로 설정했기 때문에 자동으로 static 안의 images 폴더를 찾아 갈 것 이다. 



    이제 저장하고 서버를 실행시켜 확인해보자.




    고오급 시계 타이틀이 보이는가? 


    그림이 제대로 나오는지 확인하자. 



    이번 장에서는 ejs 뷰 시스템을 연결해서 직접 선보이는 것 까지 해보았다. 


    다음 장에서는 web application 에서 중요한 session 처리와 데이터베이스 연결 , 즉 mongodb 를 간단히 


    알아보고 연동해보자. 




    (끝)





    (지금 까지 생성한 파일과 폴더 구조)



    댓글