미들웨어란?
공식 문서에 따르면 미들웨어는 요청 객체(req), 응답 객체(res), 그리고 애플리케이션의 요청-응답 주기 중 그 다음의 미들웨어 함수에 대한 액세스 권한을 갖는 함수이며, 그 다음의 미들웨어는 일반적으로 next라는 이름의 변수로 표시된다라고 정의되어 있다.
좀 더 쉽게 말하자면, 익스프레스 내에서 웹 요청과 응답에 대한 정보를 사용해서 필요한 처리를 진행할 수 있도록 분리된 독립적인 함수를 미들웨어라고 한다. 그리고 각각의 미들웨어는 next() 메소드를 호출해서 그 다음 미들웨어가 작업을 처리할 수 있도록 순서를 넘길 수 있다.
미들웨어 안에서는 기본적으로 요청 객체인 req와 응답 객체인 res를 파라미터로 전달받아 사용할 수 있다. 그리고 이 미들웨어 함수를 호출한 app 객체 또한 참조할 수 있도록 req의 속성으로 app 객체가 들어있다. 즉, req.app과 같은 형태로 app 객체를 참조하여 사용할 수 있다.
미들웨어 함수를 보면 요청 객체와 응답 객체가 파라미터로 전달되며, 그 다음 미들웨어로 넘길 수 있는 next 객체도 전달된다. 따라서 next 함수 객체를 실행하면 다음 미들웨어로 넘길 수 있다.
미들웨어 직접 작성하기
미들웨어를 사용하기 위해선 먼저 app.use()를 호출하여 미들웨어를 등록해야 한다. 클라이언트에서 요청이 들어오면 미들웨어 함수는 순서대로 실행되는데, 여러 개의 미들웨어를 사용하기 위해선 각각의 미들웨어 안에서 마지막에 next() 메소드를 호출하여 다음 미들웨어로 처리 결과를 넘겨줘야 한다. 만약 한 미들웨어 안에서 end() 메소드를 호출하여 응답을 보내면 처리 과정은 끝나게 된다.
다음은 공식 문서에 있는 미들웨어 작성 예제이다.
var express = require('express');
var app = express();
var requestTime = function (req, res, next) {
req.requestTime = Date.now();
next();
};
app.use(requestTime);
app.get('/', function (req, res) {
var responseText = 'Hello World!';
responseText += 'Requested at: ' + req.requestTime + '';
res.send(responseText);
});
app.listen(3000);
첫 번째 미들웨어에서 req 객체에 requestTime 속성을 추가하여 현재 시간을 값으로 넣은 후, next() 메소드로 두 번째 미들웨어에 처리를 넘겼기 때문에 해당 속성에 접근할 수 있는 것이다.
미들웨어 사용하기
위의 방식처럼 직접 미들웨어를 작성하는 방법 외에도 이미 만들어진 미들웨어를 사용할 수 있다.
몇 가지만 간략하게 살펴보도록 하자.
static
static 미들웨어는 특정 디렉토리 아래에 있는 폴더와 파일들을 특정 경로로 접근할 수 있도록 만들어준다.
app.use(express.static('public'));
public 디렉토리 아래에 있는 다음과 같은 폴더와 파일들을
Express/public/index.html
Express/public/css/style.css
Express/public/js/main.js
Express/public/css/style.css
아래와 같은 경로로 접근할 수 있게 된다.
http://localhost:3000/index.html
http://localhost:3000/css/style.css
http://localhost:3000/js/main.js
http://localhost:3000/css/style.css
compression
compression 미들웨어는 요청에 담긴 데이터들을 압축한다.
$ npm install compression
var compression = require('compression')
var express = require('express')
var app = express()
// compress all responses
app.use(compression())
// add all routes
helmet
helmet 미들웨어는 다양한 HTTP 헤더를 자동으로 설정해서 앱의 보안성을 높여준다.
const express = require("express");
const helmet = require("helmet");
const app = express();
app.use(helmet());
'웹 > Node.js' 카테고리의 다른 글
[Node.js] Express 5: 에러 처리(Error Handling) (0) | 2021.02.22 |
---|---|
[Node.js] Express 4: 라우터(Router) (1) | 2021.02.20 |
[Node.js] Express 2: 요청 객체와 응답 객체 (req & res) (0) | 2021.02.20 |
[Node.js] Express 1: app 객체 (0) | 2021.02.19 |
[Node.js] 이벤트: Event Loop, EventEmitter, EventListener (0) | 2021.02.18 |