미들웨어 특성 활용하기
미들웨어를 직접 만들어보기도 했고, 다른 사람이 만든 미들웨어 패키지를 설치해 정착해보기도 했습니다.
app.use((req, res, next) => {
console.log("모든 요청에 다 실행됩니다.");
next();
});
미들웨어는 req, res, next을 매개변수로 가지는 함수(에러 처리 미들웨어인 예외적으로 err, req, res, next를 가집니다.) 로서 app.use나 app.get, app.post 등으로 정착합니다. 특정한 주소의 요청에만 미들웨어가 실행되게 하려면 첫 번째 인수로 주소를 넣으면 됩니다.
app.use(
morgan('dev'),
express.static('/', path.join(__dirname, 'public')),
express.json();
express.unlencoded({ extends: false });
cookieParser(process.env.COOKIE_SECRET),
);
위와 같이 동시에 여러 개의 미들웨어를 정착할 수도 있으며, 다음 미들웨어로 넘어가려면 next 함수를 호출해야 합니다. 위 미들웨어들은 내부적으로 next를 호출하고 있으므로 연달아 쓸 수 있습니다. next를 호출하지 않는 미들웨어는 res.send나 res.sendFile 등의 메서드로 응답을 보내야 합니다. express.static과 같은 미들웨어는 정적 파일을 제공할 때 next 대신 res.sendFile 메서드로 응답을 보냅니다. 따라서 정적 파일을 제공하는 경우 express.json, express.unlencoded.cookieParser 미들웨어는 실행되지 않습니다. 미들웨어 정착 순서에 따라 어떤 미들웨어는 실행되지 않을 수 있다는 것을 기억해둡시다.
만약 next도 호출하지 않고 응답도 보내지 않으면 클라이언트는 응답을 받지 못해 하염없이 기다리게 됩니다.

지금까지는 next에 아무런 인수를 넣지 않았다면 next 함수에 인수를 넣을 수도 있습니다. 단, 인수를 넣는다면 특수한 동작을 합니다. route라는 문자열을 넣으면 다음 라우터의 미들웨어로 바로 이동하고, 그 외의 인수를 넣는다면 바로 에러 처리 미들웨어로 이동합니다. 이때의 인수는 에러 처리 미들웨어의 err 매개변수가 됩니다. 라우터에서 에러가 발생할 때 next(err)을 통해 에러 처리 미들웨어로 넘깁니다.

미들웨어 간에 데이터를 전달하는 방법도 있습니다. 세션을 사용한다면 req.session 객체에 데이터를 넣어도 되지만, 세션이 유지되는 동안에 데이터도 계속 유지된다는 단점이 있습니다. 만약 요청이 끝날 때까지만 데이터를 유지하고 싶다면 req 객체에 데이터를 넣어두면 됩니다.
app.use((req, res, next) => {
req.data = "데이터 넣기";
next();
}, (req, res, next) => {
console.log(req.data); // 데이터 받기
next();
});
현재 요청이 처리되는 동안 req.data를 통해 미들웨어 간에 데이터를 공유할 수 있습니다. 새로운 요청이 오면 req.data는 초기화됩니다. 속성명이 꼭 data일 필요는 없지만 다른 미들웨어와 겹치지 않게 조심해야 합니다. 예를 들어 속성명을 body로 한다면(req.body) body-parser 미들웨어와 기능이 겹치게 됩니다.
미들웨어를 사용할 때 유용한 패턴 한 가지로 소개합니다. 미들웨어 안에 미들웨어를 넣는 방식입니다. 다음 예제의 두 방식은 같은 기능을 합니다.
app.use(morgan("dev"));
// 또는
app.use((req, res, next) => {
morgan('dev')(req, res, next);
next();
});
이 패턴이 유용한 이유는 기존 미들웨어의 기능을 확장할 수 있기 때문입니다. 예를 들어 다음과 같이 분기 처리를 할 수도 있습니다. 조건문에 따라 다른 미들웨어를 적용하는 코드입니다.
app.use((req, res, next) => {
if (process.env.NODE_ENV === 'production') {
morgan('combined')(req, res, next);
} else {
morgan('dev')(req, res, next);
}
});
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| Router 객체로 라우팅 분리하기 (2) | 2025.07.03 |
|---|---|
| multer (0) | 2025.06.30 |
| expression-session (0) | 2025.06.26 |
| cookie-parser (0) | 2025.06.22 |
| body-parser (0) | 2025.06.19 |