미들웨어란?
웹 서버에서 요청을 받을 때 가끔 모든 요청에 대해 공통적인 처리를 하고싶은 경우가 생길 수 있습니다.
미들웨어를 통해 웹 서버의 요청/응답에 대해 공통적으로 관리가 가능합니다.
예를 들어, 모든 요청에 대해서 로그를 남겨 확인하고 싶은 경우처럼 말입니다.
이 외에도 승인된 사용자만 API를 접근할 수 있게 만들고 싶을때도 해당 될 수 있습니다.
이런 기능적인 부분 외에도 아주 기본적인 미들웨어로, 브라우저가 보낸 데이터를 우리가 쉽게 사용할 수 있게 바꿔주는 미들웨어도 존재합니다.
다른 웹 서버에도 미들웨어가 있을까요?
가장 유명한 웹 서버로 2가지가 존재합니다.
- Apache
- Nginx
두 웹 서버 모두 "모듈"이라는 개념을 가지고 있는데요, 미들웨어와 아주 유사합니다.
요즘은 어디서나 볼 수 있는 보안 연결 방법인 HTTPS를 지원하기 위해서는 https 모듈을 추가혹, 모든 요청과 응답을 기록하고 싶다면 로깅을 해주는 모듈을 추가하면 됩니다.
Express.js의 미들웨어와 같은 개념입니다.
Express.js의 미들웨어
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
- urlencoded: form-urlencoded 라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어입니다.
- json: JSON 이라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어입니다.
Express.js에서 미들웨어 작성해보기
app.use((req, res, next) => {
// 필요한 코드
});
위의 형태에서 req, res, next는 각자 역할을 지니고 있는 인자(Parameter)입니다.
- req: 요청(Request)에 대한 정보가 담겨있는 객체입니다.
- HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨있습니다.
- res: 응답(Response)을 위한 기능이 제공됩니다.
- 어떤 HTTP Status Code로 응답 할지, 어떤 데이터 형식으로 응답 할지, 헤더는 어떤 값을 넣어 응답 할지 다양한 기능을 제공합니다.
- next: 다음 스택으로 정의된 미들웨어를 호출합니다.
Request 로그 남기는 미들웨어 작성
app.use((req, res, next) => {
console.log('Request URL:', req.originalUrl, ' - ', new Date());
next();
});
- 코드를 작성한 뒤 저장하고 다시 node app.js로 서버를 실행해서 메인페이지로 접속해보세요!
- 터미널을 확인해보면 로그를 확인 할 수 있습니다.
미들웨어는 어떤 경우에 사용하는게 적합할까요?
- 미들웨어는 여러분이 만들기 위한 기능에 다양하게 사용 가능하고 또한 관리 측면에서도 많은 이점을 가져다 줍니다.
- 이미 존재하는 미들웨어를 보면 다양하게 존재하고 있습니다.
- 기본 미들웨어: https://expressjs.com/ko/4x/api.html
여러개의 미들웨어가 겹치는 경우 동작하는 방식
- 여러개의 미들웨어가 겹치는 경우, 이는 첫번째 미들웨어부터 순차적으로 진입하게 됩니다.
- 예시로 아래와 같이 3개의 미들웨어가 있다고 가정해보겠습니다.
app.use((req, res, next) => {
console.log('첫번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('두번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('세번째 미들웨어');
next();
});
// print: 첫번째 미들웨어
// print: 두번째 미들웨어
// print: 세번째 미들웨어
- 위와같은 그림처럼 순차적으로 미들웨어를 통과하고 중간에 응답을해서 종료가 되거나 다음 미들웨어로 넘어가서 터미널에 첫번째 미들웨어라는 로그부터 차례대로 세번째 미들웨어라는 로그가 쓰여진걸 확인 할 수 있습니다.
- 하지만 중간에 미들웨어에 next()가 실행되지 않으면 다음 미들웨어는 실행되지 않습니다.
Router와 미들웨어의 차이
Router와 미들웨어는 서로 다른 방식처럼 보이지만 Router는 미들웨어 기반으로 구현된 객체이므로 미들웨어와 동일한 방식으로 작동됩니다.
Express.js의 미들웨어가 실행되는 경우
- app.use(Middleware) : 모든 요청에서 미들웨어가 실행된다.
- app.use('/api', Middleware) : api로 시작하는 요청에서 미들웨어를 실행한다.
- app.post('/api', Middleware) : api로 시작하는 POST 요청에서 미들웨어를 실행한다.
'Language > Node.js' 카테고리의 다른 글
[OpenAPI] Swagger (1) | 2022.12.25 |
---|---|
[ORM] Sequelize (0) | 2022.12.24 |
Access Token, Refresh Token (0) | 2022.12.19 |
JWT란? (0) | 2022.12.19 |
쿠키와 세션 (0) | 2022.12.19 |