Framework/Node.js

[Node.js] 미들웨어에 대해 알아보자

  • -
Node.js 공부 중 미들웨어에 대한 개념을 확실히 하고자 정리한 글입니다.

미들웨어란?

미들웨어(Middleware)는 이름 처럼 HTTP 요청과 응답의 처리 과정 중간에 위치하먀, 어플리케이션의 동작을 제어하고 변형하는 함수 또는 모듈을 의미합니다. 저는 미들웨어를 요청과 응답의 중간 단계라고 생각하고 공부하였습니다. 

 

// 미들웨어 함수 예

const myMiddleware = (req, res, next) => {
  console.log('This is a middleware.');
  next(); // 다음 미들웨어 함수 호출
};

app.use(myMiddleware); // Express에서의 사용 예


미들웨어 함수는 세 개의 인자를 받습니다. req는 HTTP 요청 객체, res는 HTTP 응답 객체, next는 다음 미들웨어 함수를 호출하는 콜백 함수입니다.

 

미들웨어 함수를 사용하려면 app.use()메서드를 사용하거나, 특정 경로에 미들웨어를 연결하는 app.use('/path', myMiddleware) 형식으로 사용합니다.

 

app.get('/', (req, res, next) => {
    console.log('GET / 요청에서만 실행')
    next()
}, (req, res) => {
    throw new Error('에러는 에러 처리 미들웨어로 갑니다.')
})

app.use((err, req, res, next) => {
    console.error(err)
    res.status(500).send(err.message)
})

 

이 코드에서 localhost:3000에 접속하게 되면 콘솔에는 다음과 같이 출력됩니다.

모든 요청에 다 실행
GET / 요청에서만 실행
Error: 에러는 에러 처리 미들웨어로 갑니다.

미들웨어의 종류

미들웨어를 사용할 때 유형을 나눠서 보진 않지만 자주 보이는 쓰임새에 대해 정리해봤습니다.

  1. 앱 레벨 미들웨어: app.use() 를 사용하여 전역적으로 앱에 적용되는 미들웨어. 로깅, CORS 처리 등
  2. 라우터 레벨 미들웨어: 특정 라우터에만 적용되는 미들웨어 router.use() 를 사용하여 라우터에 연결됩니다.
  3. 에러 핸들링 미들웨어: 에러 처리를 담당하는 미들웨어
  4. 서드파티 미들웨어: 외부 패키지에서 제공되는 미들웨어로 body-parser, morgan 등이 있습니다.
  5. 특정 HTTP 메서드에 사용되는 미들웨어: app.method('/path', 미들웨어) 방식으로 사용되며 app.post('/users', MyMiddleware) 이 예시에선 users POST 요청에서 미들웨어 적용

 

미들웨어와 체이닝

미들웨어는 대게 일련의 함수들이 체이닝되어 작동합니다.

"일련의 함수들이 체이닝된다"의 의미는 여러 개의 함수가 연속적으로 호출되어 하나의 흐름이 형성된다는 의미입니다. JS에서 함수를 반환하는 함수를 이용해 함수를 연결하고, 각 함수가 처리한 결과를 다음 함수로 전달하는 방식으로 동작합니다. 이것을 체이닝이라고 합니다.

 

*체이닝 예시*

function step1(input) {
  console.log("Step 1:", input);
  return input + 1;
}

function step2(input) {
  console.log("Step 2:", input);
  return input * 2;
}

function step3(input) {
  console.log("Step 3:", input);
  return input - 3;
}

// 체이닝된 함수들
const result = step3(step2(step1(5)));
console.log("Final Result:", result);

 

미들웨어의 경우, 요청과 응답을 처리하는 함수들이 체이닝 되어 작동합니다. 각 미들웨어 함수는 다음 미들웨어 함수를 호출하기 위해 next()를 사용합니다.


부족한 글 읽어주셔서 감사합니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.