본문 바로가기

[자바스크립트] express 미들웨어

들어가며

여행을 떠나보면, 언젠가 왜 이 여행을 하려 했을까 하는 생각이 들 때가 있었습니다. 공부를 할 때도 마찬가지였습니다. Node.js를 활용해서 개발을 하고 있는데, 왜 Node.js를 활용하는지 문득 궁금했습니다. Node.js의 특징, 장단점, 그리고 다른 언어와의 차이를 알아보며 Node.js에 대해 이해해야겠다고 생각했습니다. 아래의 글은 [Node.js] express 미들웨어란? 글을 보고 공부하며 정리한 글입니다. 자세한 내용은 해당 글을 참고해주세요.

 

 

 

 

 


 

Express 미들웨어 

미들웨어는 서로 다른 애플리케이션이 서로 통신하는 데 사용되는 소프트웨어를 뜻합니다. 그럼 Express 프레임워크에서 말하는 미들웨어는 어떤 의미일까요? 이에 대해 알아보겠습니다.

 

Express 공식문서에는 미들웨어를 다음과 같이 정의합니다. Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다. 미들웨어 함수는 요청 오브젝트(req), 응답 오브젝트(res), 그리고 애플리케이션의 요청-응답 주기 중 그다음의 미들웨어 함수에 대한 액세스 권한을 갖는 함수입니다. 그다음의 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시됩니다. 즉, Express에서 말하는 미들웨어는 Request 요청이 들어오고, 요청을 Response 응답으로 반환하기 까지 사이에 거치는 모든 함수를 미들웨어라고 합니다. 

 

 

 

// app.js

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

app.use('/', indexRouter);
app.use('/users', usersRouter);

 

 

예를 들어 위 코드를 살펴보면, 요청이 들어왔을 때, 위 코드를 순서대로 실행합니다. 그 후 응답을 전달합니다. 위의 코드는 미들웨어라고 볼 수 있습니다. 이런 미들웨어에는 크게 애플리케이션 레벨, 라우터 레벨, 오류 처리, 기본 제공, 써드파티 미들웨어가 존재합니다. 이를 차례대로 알아보겠습니다. 

 

 

 

1. 애플리케이션 레벨 미들웨어

애플리케이션 레벨은 express()로 생성할 수 있는 app 객체의 app.use(), app.METHOD() 함수를 이용해 미들웨어를 app 인스턴스에 바인딩하는 미들웨어입니다. 마운트 경로가 없는 미들웨어 함수는 앱이 요청을 수신할 때마다 실행합니다.

 

 

app.get('/pages/:id', (req, res, next) => {
  //pages id가 0이면 'regular'가 아닌 'special'로 넘어감
  if (req.params.id == 0) next('route');
  //pages id가 0이 아니라면 'regular'로 넘어감
  else next();
}, (req, res, next) => {
  res.send('regular');
}
});

//pages id가 0일 때 넘어올 미들웨어
app.get('/pages/:id', (req, res, next) => {
  res.send('special');
}

 

 

위 코드는 미들웨어가 2개 묶인 app METHOD가 위에 있으므로 일단 special보다 먼저 실행됩니다. next('route')는 지금 라우터 미들웨어 스택을 벗어난 다음 라우터(special)로 제어가 넘어가게 하는 것입니다. 여기서 만약 id가 0이 아니라면, next()는 regular로 넘어가게 됩니다. 거기서 next()를 호출하지 않았으므로 special은 호출되지 않습니다. 

 

만약 next(err)를 입력하면, express 앱은 그것을 오류 발생이라고 보고 오류 처리와 관련 없는 다른 모든 미들웨어를 다 건너뛰고 오류 처리(error handling) 라우터로 넘어갑니다.

 

 

 

2. 라우터 레벨 미들웨어

라우터 레벨은 express.Router()로 생성할 수 있는 router 인스턴스에 미들웨어가 바인딩되는 것입니다. express.Router()로 router 객체를 생성할 수 있는데, 미들웨어와 HTTP 메서드 라우트를 router 객체에 붙일 수 있습니다.

 

//app.js
const express = require('express');
const app = express();
const pageRouter = ('./routes/pages');
app.use('/pages', pageRouter);
//pages.js
const express = require('express');
const router = express.Router();

router.get('/pages/:id', (req, res, next) => {
  //pages id가 0이면 'regular'가 아닌 'special'로 넘어감
  if (req.params.id == 0) next('route');
  //pages id가 0이 아니라면 'regular'로 넘어감
  else next();
}, (req, res, next) => {
  res.send('regular');
}
});

//pages id가 0일 때 넘어올 미들웨어
router.get('/pages/:id', (req, res, next) => {
  res.send('special');
}

module.exports = router;

 

 

 

 

 

 

3. 오류 처리 미들웨어

오류 처리 미들웨어는 (err, req, res, next)를 인자로 받는 것입니다. 항상 4개의 매개변수가 필요합니다. 이게 오류 처리 미들웨어의 시그니처입니다. err.stack으로 에러 메시지를 볼 수 있습니다.

 

//오류의 종류에 상관없이 모든 오류를 잡는 미들웨어
app.get((err, req, res, next) => {
  console.log(err.stack);
  res.status(500).send('Something broke!');
});

 

 

주의할 점은 오류 처리 미들웨어는 app.use() 및 라우트 호출을 정의한 뒤 거의 코드의 맨 끝에 정의해야 한다는 점입니다. 위의 경우 모든 오류를 잡는 미들웨어 하나만 만들었는데, 에러마다 다른 오류 처리 미들웨어 함수를 정의할 수도 있습니다. 이 경우 모든 오류를 처리하는(catch-all) 에러 핸들러는 그 오류 처리 미들웨어들 중에서도 가장 아래 있어야 합니다.

 

 

app.get('/pages/:id', (req, res, next) => {
  if (!req.params.id) next(err);
});

 

 

이런 식으로 명시적으로 next(err)를 해줘야 오류 처리 미들웨어로 넘어갈 수 있습니다.

 

 

 

 

4. 기본 제공 미들웨어

기본 제공은 정적 리소스를 제공할 루트 디렉터리를 정하는 express.static 같은 것이 있습니다. 현재 문서에는 빌트인 미들웨어는 express.static 뿐이라고 되어 있습니다. 정적 파일을 전달해주는데, 여기서는 /public 디렉터리가 정적 파일들이 모여 있는 루트 디렉터리가 됩니다.

 

app.use(express.static(__dirname + '/public'));

 

 

 

 

5. 써드파티 미들웨어

마지막으로 써드파티 미들웨어는 npm에서 설치한 helmet이나 cookie-parser 같은 모듈들이 해당됩니다. 쉽게 말해 express 자체적으로 제공하지 않고 따로 설치해야 하는 것들은 다 써드파티라고 보면 됩니다.

 

 

npm i cookie-parser
const express = require('express');
const app = express();
const cookieParser = require('cookie-parser');

app.use(cookieParser());

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

마치며

자바스크립트에 대해 공부하면서, 항상 타입 스크립트를 공부하는 것도 좋지만, 먼저 자바스크립트의 기초부터 제대로 알아야겠다고 생각합니다. 이렇게 기초적인 부분을 습득하다 보면, 어느 순간 타입 스크립트로 넘어갔을 때 훨씬 잘 이해할 수 있으리라 믿습니다.

 

 

 

 

 

 


 

 

 

 

 

출처

 

[Node.js] express 미들웨어란?

미들웨어 사용하기 Express 미들웨어란 무엇인가? 쉽게 말해 함수이다. Express에서는 사실상 모든 것이 미들웨어이다. 내가 이해하기로 미들웨어와 미들웨어 함수는 같은 말이다(아니라면 댓글 부

dev-dain.tistory.com

 

[Express.js] 미들웨어(Middleware)

마지막으로, Express의 기본개념인 미들웨어에 대해 공부한 내용을 정리하려고 한다. 프로젝트 서버를 구축하기 위해 Express를 공부하면서, 미들웨어라는 단어를 접할수록 혼란스러웠다. Router에서

abangpa1ace.tistory.com

 

미들웨어란 무엇인가? - 미들웨어 설명 - AWS

 

aws.amazon.com

 

Express 미들웨어의 실행순서 - 생활코딩

수업소개 Express의 미들웨어가 실행되는 순서를 살펴보겠습니다.  강의

opentutorials.org