이전에 기록해놓은 Express Framework 에 대한 내용은 웹 서버의 기본 셋팅만을 기반으로 설명되어 있기에, 기본이 되는 지식에 대한 기록이 부족할 수 있다고 생각해서, Express Framework 에 대한 기록, 제 2탄을 적고자 한다.
지난 기록과는 다르게 디렉토리 구조를 신경쓰지 않고 Express Framework 의 기초를 중심으로 기록하려 한다.
Express Framework 시작하기(Express 객체 이해하기)
// Express 기본 모듈 불러오기
var express = require('express');
var http = require('http');
// 익스프레스 객체 생성
var app = express();
// 기본 포트를 app 객체에 속성으로 설정
app.set('port', process.env.PORT || 3333);
// Express 서버 시작
http.createServer(app).listen(app.get('port'),function(){
console.log('익스프레스 서버를 시작했습니다 : ' + app.get('port'));
});
Express 모듈은 웹 서버를 위해서 만들어진 것으로 HTTP 모듈 위에서 동작하므로, express 모듈을 사용하기 위해서는 반드시 HTTP 모듈도 불러와야 한다.
Express 모듈 내에 있는 express() 메소드를 통해 Express 객체를 생성한다(6행) 이 app 이라는 익스프레스 서버 객체가 웹 서버에 대한 대부분의 정보를 담고 있으며, 이 객체를 기반으로 서버를 컨트롤 하게 된다.
Express 객체의 옵션(set, get)
Express 객체는 서버를 실행하고 운용하기 위한 많은 정보를 포함하고 있다. 미들웨어와 객체 옵션이 그 중 일부이고, 그 중 객체 옵션을 다루는 방법에 대해 알아보자.
// 옵션 넣기
var port = 3333;
app.set('port', port);
// 옵션 얻기
port = app.get('port');
객체 옵션은 Map 구조를 띠고 있으며, set 과 get 메소드를 통해 직관적으로 값을 넣고 뺄 수 있다. Express 객체(app) 은 한 어플리케이션 전체에 적용되므로, 익스프레스 서버에 대한 정보는 객체 옵션에 넣고 활용하는 것이 바람직하다. (포트 등 서버 설정에 대한 것들)
Express 객체의 미들웨어
미들웨어는 말 그대로, 가운데에서 처리하는 것으로, 클라이언트의 Request 와 Response 가운데에서 처리하는 함수들의 집합을 뜻한다.
미들웨어는 코드 내에 마음대로 생성할 수 있으며, 코드 순서에 따라 로딩 순서가 정해지게 된다. 아래의 코드는 미들웨어를 적용시켜서 가동시킨 익스프레스 서버의 예이다.
// 빌트인(내장) 모듈 불러오기
var express = require('express');
var http = require('http');
// 익스프레스 객체 및 웹 서버 객체 생성
var app = express();
const port = 3333;
app.set('port', port);
var server = http.createServer(app);
// 포트 설정 및 요청 대기
server.listen(app.get('port'));
// 미들웨어 설정
app.use(function(req, res, next){
console.log("첫 번째 미들웨어 실행");
next();
});
app.use(function(req, res, next){
console.log("두 번째 미들웨어 실행");
next();
});
app.use('/test', function(req, res){
console.log('/test 접속');
});
보다시피, 일부 미들웨어는 콜백 메소드에 next 라는 메소드 인자가 붙는다. 이 next() 라는 메소드는 “해당 미들웨어에서의 처리가 종료되었으며, 다음 처리를 위해 실행을 넘긴다” 라는 뜻을 가지고 있다. 미들웨어에서 이 next() 메소드를 생략할 경우, 미들웨어 단의 처리를 종료시켜 버린다. (본인의 처리를 미들웨어의 마지막 처리로 정하는 것이다) 그래서 마지막 처리를 담당하는 미들웨어가 아니라면, next() 메소드는 필수라고 볼 수 있다.