Node.js | Express Web 어플리케이션 자동 생성 | 메인 프로그램 app.js

그럼 작성된 Web 응용 프로그램을 살펴 보자.

메인 프로그램 “app.js"에 대해

우선 메인 프로그램인 app.js부터 보도록 하겠다. 파일 내용은 아래와 같다.

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
 
var routes = require('./routes/index');
var users = require('./routes/users');
 
var app = express();
 
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
 
// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
 
app.use('/', routes);
app.use('/users', users);
 
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});
 
// error handlers
 
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}
 
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});
 
module.exports = app;

포인트를 골라서 설명해 나가도록 하겠다.

1. 라이브러리 로드

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

먼저 수행하는 것은 라이브러리 로드이다. 각종 라이브러리를 로드하고 다음과 같은 변수에 저장한다.

변수 설명
express Express 객체의 변수이다.
path Path 객체이다.
serve-favicon favicon (Web 페이지에 표시되는 아이콘 데이터)에 관한 것이다.
morgan 로그 출력에 대한 객체이다.
cookie-parser 쿠키 이용에 관한 객체이다.
bodyParser 바디 부분의 파싱과 관련된 객체이다.
routes routes 폴더에 설치되어 있는 index.js의 객체이다. 이 내용은 나중에 설명하겠다.
user routes 폴더에 설치되어있는 user.js의 개체입니다. 이것도 나중에 설명하겠다.

마지막 2개는 모듈이 아닌 어플리케이션에 포함되어 있는 스크립트 파일을 로드하는 것이다. require으로, 이런 식으로 다른 스크립트를 로드할 수 있다.

충분히 다양한 모듈이 로드되어 있지만, 사실은 로드되는 것은 이뿐만이 아니다. 어플리케이션을 기동하기 위한 www에 다음과 같은 문장이 작성되어 있다.

var app = require('../app');
var debug = require('debug')('exapp:server');
var http = require('http');

이것으로 이 app.js 스크립트 디버깅에 대한 개체, 그리고 http 객체가 제공된다. 이 모든 것이 갖추어져 어플리케이션을 구축하고 있다.

2. express 함수로 Application 만들기

var app = express();

express 함수로 Application 개체를 만든다. 이것은 이전과 동일하다.

3. 각종 어플리케이션 설정하기

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

다음에는 app.set ~app.use ~ 와 같은 코드가 정렬되어 있는데, 이것은 각종 어플리케이션의 설정을 수행하고있는 부분이다. 이들은 우선 사용자가 이를 편집하는 일은 없을 것이다. 작성을 변경되거나 하지 않도록 주의하자.

4. get으로 루트 설정하기

app.use('/', routes);
app.use('/users', users);

get으로 ‘/‘와 ‘/users’ 주소에 각각 routes과 users 변수를 설정하고 있다. 이 routes 및 users 변수는 이전에 나온 것이다. routes 폴더에 있는 index.js와 users.js을 각각 require으로 로드한 것을 얻은 변수였다.

이러한 변수를 use로 설정하여, 지정된 주소에 스크립트를 할당하고 있다. 즉, ‘/‘에 액세스가 있으면 routes 안에 index.js가, ‘/users’에 액세스가 있으면 users.js가 각각 실행되도록 되는 것이다.

5. 에러 처리 설정

app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

app.use, if문 또한 app.use 계속되지만, 이러한 에러에 대한 처리를 수행하는 것이다. 이것도, 특별히 사용자가 만질 부분은 없다. 우선 잊어도 되는 부분이다.

6. 어플리케이션을 설정하기

module.exports = app;

마지막으로 만든 app 객체를 module.exports에 대입한다. 이것으로 어플리케이션이 설치되어 동작하게 된다.

도중에 갑자기 어려워 보이는 처리가 나와하기도 했지만, 모든 이해할 필요는 없다. 전체의 흐름으로써, 대충 “이런 식으로 처리가 되어 있구나” 정도로 파악할 수 있으면 그것으로 충분하다.