Express 미들웨어 사용하기

서나무·2022년 10월 10일
0
post-thumbnail

🔍 미들웨어(Middleware)란?

나는 미들웨어를 내가 원하는 기능을 수행하기 전에, 서버에서 필요로 하는 정보가 클라이언트에서 잘 넘어왔는지 확인하는 함수라고 이해했다.

예를 들어, 로그인을 하고 글을 등록, 수정, 삭제 할 때에 사용자에게 발급한 토큰으로 사용자의 접근 권한이 유효한지 체크해야한다. 그런데 토큰이 유효한지 체크하는 기능을 모든 라우터의 함수에서 작성하는 것은 매우 비효율적이다.

만약 토큰이 유효한지 체크한 후, 어떤 작업을 추가로 진행해야 된다면 현재는 등록, 수정, 삭제 총 세 군데 이지만 나중에는 수백여곳의 코드를 찾아서 고쳐야할 수도 있다.

따라서 토큰이 유효한지 체크하는 기능을 가진 미들웨어 함수를 생성하고, 토큰 유효성 검사가 필요한 라우터에 적용해주는 것이다.

📌 Express의 미들웨어 종류

  • 애플리케이션 레벨 미들웨어
  • 라우터 레벨 미들웨어
  • 오류 처리 미들웨어
  • 기본 제공 미들웨어
  • 써드파티 미들웨어

📌 Express의 미들웨어가 수행하는 기능

  • 모든 코드를 실행
  • 요청 및 응답 개체를 변경
  • 요청, 응답 주기를 종료
  • 스택에서 다음 미들웨어 함수를 호출

자세한 내용은 Express 미들웨어 사용에서 확인해볼 수 있다.

🚧 미들웨어 사용하기

미들웨어는 requset와 response 객체 그리고 next 함수를 인자로 받는다.

next 함수는 다음 함수를 실행시키는 함수인데, 만약 next를 호출해주지 않으면 내가 라우터마다 작성한 코드들이 실행되지 않는다.

app.js

// 라우터 요청을 처리하기 전에 실행시킬 미들웨어
app.use((req, res, next) => {
  console.log(`[${req.method}] ${req.path} | ${new Date().toLocaleString()}`);
  next();
});

// ...

// 오류 처리 미들웨어
app.use((error, req, res, next) => {
  console.log(error.message);
  res.status(500).send({ message: '서버 내부에서 오류가 발생했습니다.' });
});

간단하게 라우터 요청을 처리하기 전에 요청 내용 로그를 찍는 미들웨어와 오류를 처리해주는 미들웨어를 작성했다.

오류 처리 미들웨어는 라우터 중 맨 아래에 작성해야되며, 오류 처리 미들웨어보다 위에 있는 라우터는 오류 처리 미들웨어가 실행되지 않는다.

서버에서 로직을 실행하다가 throw로 오류가 발생되면 모두 오류 처리 미들웨어로 가게 된다.

나중에는 라우터에서 매번 res.send()로 각 상황에 따라서 결과값을 반환해주지 않고, 오류를 던져서 예외 처리 미들웨어에서 오류 결과를 반환하도록 하려고 한다.

🧺 사용하지 않는 라우터 처리

API 테스트를 하다보면 잘못된 주소로 요청을 보내는 경우가 있다.

게시판 프로젝트를 진행하면서 여러번 잘못된 주소를 보냈었는데, 사용하지 않는 라우터라는 것을 명시해주기 위해서 코드를 추가했다.

app.js

app.all('*', (res, req) => {
  req.status(405).send({ message: '사용할 수 없는 라우터입니다.' });
});

위에 있는 모든 라우터에 해당하지 않을 경우 마지막으로 이 라우터를 통과하게 되기 때문에, 존재하지 않는 경로로 http 요청을 보냈을 경우 응답을 보내줄 수 있다.

profile
주니어 프론트엔드 개발자

0개의 댓글