Legacy/Node.js

Express의 미들웨어들

Foo 2017. 1. 14. 01:49
728x90

참고 - [3판] 모던 웹을 위한 Node.js 프로그래밍 (윤인성)


Express의 미들웨어들 - http://expressjs.com/en/resources/middleware.html


1. router 미들웨어


Express에 내장되어 있는 미들웨어로 별로 미들웨어라는 느낌을 받지 않고 사용할 수 있음.

추가적인 모듈 설치 및 require 없이 app.get(), app.post() 등과 같은 메소드 호출만 필요함.


// 모듈을 추출합니다.
var express = require('express');

// 서버를 생성합니다.
var app = express();

// 라우터를 설정합니다.
app.get('/a', function (request, response) {
  response.send('<a href="/b">Go to B</a>');
});
app.get('/b', function (request, response) {
  response.send('<a href="/a">Go to A</a>');
});

// 서버를 실행합니다.
app.listen(52273, function () {
  console.log('Server running at http://127.0.0.1:52273');
});

위와 같이 고정된 url에 대해 처리해주면 되지만, RESTful API를 요청할 경우 글 번호 같은것을 url로 전송하면 받아오고 싶은경우가 있다. 스프링 프레임워크에 익숙한 사람이라면 @PathVariable을 생각하면 되겠다.

// 모듈을 추출합니다.
var express = require('express');

// 서버를 생성합니다.
var app = express();

// 라우터를 설정합니다.
app.get('/page/:id', function (request, response) {
  // 변수를 선언합니다.
  var name = request.params.id;

  // 응답합니다.
  response.send('<h1>' + name + ' Page</h1>');
});

// 서버를 실행합니다.
app.listen(52273, function () {
  console.log('Server running at http://127.0.0.1:52273');
});

URL 매핑 부분에 ":변수명"을 입력한 후 "request.params.변수명"으로 받아오면 된다.
다만 동적으로 데이터를 받아오게 되기 때문에 입력값에 대한 검증 및 보안 코딩이 필요하다.

추가로 모든 라우팅 페이지에 대한 전체선택자를 사용할 수 있다. 경로를 "*"로 설정해주면 된다.

// 모듈을 추출합니다.
var express = require('express');

// 서버를 생성합니다.
var app = express();

// 라우터를 설정합니다.
app.get('/index', function (request, response) {
  response.send('<h1>Index Page</h1>');
});
app.all('*', function (request, response) {
  response.status(404).send('<h1>ERROR - Page Not Found</h1>');
});

// 서버를 실행합니다.
app.listen(52273, function () {
  console.log('Server running at http://127.0.0.1:52273');
});



router는 모듈화할 수 있다. 다음 두 코드를 보고 동작 방식을 이해해보자.

1) /a/index, /b/index의 생성

// 모듈을 추출합니다.
var express = require('express');

// 서버를 생성합니다.
var app = express();

// 라우터를 설정합니다.
var routerA = express.Router();
var routerB = express.Router();

// 라우터A를 설정합니다.
routerA.get('/index', function (request, response) {
  response.send('<h1>Index Page</h1>');
});

// 라우터B를 설정합니다.
routerB.get('/index', function (request, response) {
  response.send('<h1>Index Page</h1>');
});

// 라우터를 설정합니다.
app.use('/a', routerA);
app.use('/b', routerB);

// 서버를 실행합니다.
app.listen(52273, function () {
  console.log('Server running at http://127.0.0.1:52273');
});



2) /a/index, /b/index의 생성 (+ 경로 별로 파일 나눠주기)

// routerA.js 파일
// 모듈과 변수 선언
var express = require('express');
var router = express.Router();

// 페이지 라우트
router.get('/index', function (request, response) {
  response.send('<h1>Index Page</h1>');
});

// 외부로 뺍니다.
exports.router = router


// index.js 파일 // 모듈을 추출합니다. var express = require('express'); // 서버를 생성합니다. var app = express(); app.use('/a', require("./routerA.js").router); app.use('/b', require("./routerB.js").router); // 서버를 실행합니다. app.listen(52273, function () { console.log('Server running at http://127.0.0.1:52273'); });


routerB.js도 routerA.js와 마찬가지로 추가로 만들어줘야합니다.


2. static 미들웨어

static 미들웨어 역시 router 미들웨어와 마찬가지로 express에 내장된 미들웨어임. 

대개는 ./public 폴더에 정적 파일들을 저장하고 static 미들웨어를 이용해 정적파일을 매핑해준다.


./public 폴더를 하나 만들어주고 그곳에 아무 파일이나 하나 만들어주고 해당 파일에 접근해보자.


// 모듈을 추출합니다.
var express = require('express');

// 서버를 생성합니다.
var app = express();

// 미들웨어를 설정합니다.
app.use(express.static(__dirname + '/public'));

// 서버를 실행합니다.
app.listen(52273, function () {
  console.log('Server running at http://127.0.0.1:52273');
  console.log(__dirname);
});


파일이름이 abc.txt라면

브라우저에 "localhost:52273/abc.txt"라고 입력하면된다.

위와 같은 방식으로 RESTful API 서버를 쉽게 만들 수 있다. static요청에 대해서 index.html로 가도록 하면된다.


3. 그 외 다른 모듈들

http://expressjs.com/en/resources/middleware.html을 참조