Framework/Express

2. express 미들웨어(middleware)

oniri1 2024. 9. 12. 02:22

미들웨어란 간단하게 서로 다른 애플리케이션이 서로 통신하는데 필요한 소프트웨어이다.

만약 개발자가 js express를 사용해, mySQL를 컨트롤 하려면?
당연히 js 에서는 mySQL에서 사용하는 문법을 사용할 수 없다.. 당연하다. 언어가 다르니까.
mySQL은 쿼리문이라고, 당연히 js에서 똑같은 명령어를 친다고 해도 알아들을 수 없다.

여기까지는 그냥 단순히 전체적인 미들웨어의 개념이고 express 미들웨어는 원활한 작동을 위한 중간다리 역할을 하는 함수다.

1. 전역레벨 미들웨어

server.js 부분에 사용된 app.use를 예시로 들어보자.

app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use("/api", router);

만약에 /api로 요청이 들어온다면, 해당 요청은 전부 아래 코드를 실행하는데

app.use(express.urlencoded({ extended: false })); //해당 요청은 자바스크립트 객체를 사용할게
app.use(express.json()); //json도 사용할게

이렇게 거치게 되면서 /api에서의 req는 js 객체와 json을 사용할 수 있게 되는거다.

특정 api에서만 특정 미들웨어를 작동하게 하고 싶다면?

전역 미들웨어는 무조건 실행되기 때문에, 백엔드 최적화를 극한까지 하고싶다면, 원하는 router에서만 middleware를 작동시키는 것 또한 좋은 방법이다.

2. 라우터 레벨 미들웨어 만들기

간단하다.
라우터.js의 맨 위에 router.use()(use는 어떤 restfulAPI라도 전부 작동한다)를 추가해주면 된다.

router.use((req, res, next) => {
  console.log('나는 미들웨어다.');
  next();
});

router.get("/",(req, res) => {
  console.log(' / 요청이 들어옴');
  next();
});

router.get("/test",(req, res) => {
  console.log(' /test 요청이 들어옴');
  next();
});

여기서 새롭게 생긴 next가 있는데, 라우트 핸들러에서 자주 사용되는 세 가지(req,res,next) 기본 매개변수다.
next는 대부분 미들웨어 함수에서 사용되며, 해당 함수가 끝에 도달했음을 알리고 다음 코드로 넘어가라는 명령어다. (함수에서 자주 사용하는 return과 비슷한데 리턴값은 없다고 생각하면 편하다.)

get /
get /test

두 요청을 보내 미들웨어가 어떻게 작동하는지 확인해보자

선택사항 next() 활용

굳이 알 필요는 없지만, next는 restful api를 받았을 때도 유용하게 사용할 수 있는데

app.get('/profile',(req, res, next) => {
  if(대충 뭔가를 체크) next();  // 다음 핸들러로 이동

  res.send('대충 뭔가가 false값임');
}, (req, res) => {
  res.send('대충 뭔가가 트루값임');
});

이렇게 한개의 get 메서드 처리에서 여러개의 콜백을 설정할 수 있다