Express - Middleware란?

Oneik·2023년 12월 13일
0
post-thumbnail

미들웨어(Middleware)란?

요청과 응답 중간(사이)에 위치하여 미들웨어라고 불린다. 라우터와 에러 핸들러 또한 미들웨어의 일종이며, 요청과 응답 중간에서 특정 작업을 수행하기 위해 사용된다.

미들웨어의 특징

순차적 실행

  • 미들웨어는 등록된 순서대로 실행된다. 즉, app.use()를 사용하여 미들웨어를 등록한 순서에 따라 어떤 미들웨어가 먼저 실행될지 결정된다.

next 함수

  • 미들웨어 함수는 next라는 메소드를 호출하여 다음 미들웨어로 제어를 넘길 수 있다. 이를 통해 여러 미들웨어가 체인 형태로 연결되어 실행된다.

재사용성과 모듈화

  • 모듈로서 구현할 수 있기 때문에, 특정 기능을 담당하는 미들웨어를 여러 부분에서 재사용할 수 있다.

미들웨어의 유형

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

Express로 만든 웹 애플리케이션에 전역으로 적용되는 미들웨어이다.

app 객체의 app.use()와 app.METHOD() 함수를 사용해서 미들웨어를 app 객체 인스턴스에 바인딩한다.

즉, app.use()와 app.METHOD() 함수를 이용해서 미들웨어를 등록하고 사용할 수 있다.

사용 방법설명
app.use(미들웨어)모든 요청에서 해당 미들웨어를 사용
app.use('/path', 미들웨어)특정 경로로 접근할 때 미들웨어를 사용
app.METHOD('/path', 미들웨어)특정 HTTP 메소드에 특정 경로로 접근할 때 미들웨어를 사용

라우터 레벨 미들웨어

특정 라우터에만 적용되는 미들웨어이다. express.Router()로 만든 라우터 인스턴스에 바인딩된다. 즉, 특정 경로로 요청이 들어오면, 실행되는 미들웨어이다.

애플리케이션 레벨 미들웨어와 같은 방식(router.use()와 router.METHOD())으로 미들웨어를 등록하고 사용할 수 있다.

// app.js
const express = require('express');
const app = express();
const userRouter = require('./routes/users');
app.use('/users', userRouter);

// users.js
const express = require('express');
const router = express.Router();
// 라우터 레벨 미들웨어
router.use((req, res, next) => {
  console.log('This is a router-level middleware');
  next();
});

// 라우터에 미들웨어 적용
router.get('/users/:id', (req, res) => {
  res.send('This is the response for the /users route in the router.');
});

오류 처리 미들웨어

미들웨어나 라우터에서 에러가 발생하면 실행되는 미들웨어이다. 에러 핸들링과 관련된 로직을 수행하여 사용자에게 에러 페이지를 제공할 수 있다.

항상 4개의 인자가 필요하다

app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

기본 제공 미들웨어

Express 자체에서 제공하는 기본적인 미들웨어로, 애플리케이션에서 기본적인 기능을 수행한다.

  • express.json()
    요청의 본문에서 JSON 데이터를 javascript 객체로 변환하는 작업을 한다.
app.use(express.json());

서드파티 미들웨어

Express 외부에서 개발자들이 만든 후 제공하는 미들웨어 패키지이다. 추가적인 기능을 제공하거나 특정 작업을 수행하기 위해 사용된다.

morgan(로그 기록), Helmet(보안 헤더 설정) 등이 있다.

Reference

https://expressjs.com/ko/guide/writing-middleware.html
https://inpa.tistory.com/entry/EXPRESS-%F0%9F%93%9A-%EB%AF%B8%EB%93%A4%EC%9B%A8%EC%96%B4-%F0%9F%92%AF-%EC%9D%B4%ED%95%B4-%EC%A0%95%EB%A6%AC
https://cotak.tistory.com/84

profile
초보 개발자의 블로그입니다

0개의 댓글