미들웨어

J Park·2023년 11월 9일

01. 미들웨어 (Middleware)

  • 1) 미들웨어 기본 개념
    • 미들웨어란 무엇일까? 웹 서버에서 요청을 받을때 가끔 모든 요청에 대해 공통적인 처리를 하고싶은 경우가 생길 수 있다.
      미들웨어를 통해 웹 서버의 요청/응답에 대해 공통적으로 관리가 가능하다. 예를 들어, 모든 요청에 대해서 로그를 남겨 확인하고 싶은 경우,
      이 외에도 승인된 사용자만 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 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어다!

        이 외에도 다양하게 있지만 우리의 수업에서는 이 두가지를 사용 할 예정이다!

  • 2) Express.js에서 미들웨어 작성해보기
    • 미들웨어는 어떻게 작성할 수 있을까? 미들웨어는 아래의 인터페이스로 작성할 수 있다.
      app.use((req, res, next) => {
        // 필요한 코드
      });
      위의 형태에서 req, res, next는 각자 역할을 지니고 있는 인자(Parameter)이다.
      • req: 요청(Request)에 대한 정보가 담겨있는 객체이다.
        • HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨있다.
      • res: 응답(Response)을 위한 기능이 제공된다.
        • 어떤 HTTP Status Code로 응답 할지, 어떤 데이터 형식으로 응답 할지, 헤더는 어떤 값을 넣어 응답 할지 다양한 기능을 제공한다.
      • next: 다음 스택으로 정의된 미들웨어를 호출한다. !https://s3-us-west-2.amazonaws.com/secure.notion-static.com/37d79f84-576e-4657-b9f7-5afc5519788d/Untitled.png
    • Request 로그 남기는 미들웨어 작성
      app.use((req, res, next) => {
          console.log('Request URL:', req.originalUrl, ' - ', new Date());
          next();
      });
    • 코드를 작성한뒤 저장하고 다시 node app.js로 서버를 실행해서 메인페이지로 접속해보기!
    • 터미널을 확인해보면 로그를 확인 할 수 있다.
  • 3) 미들웨어는 어떤 경우에 사용하는게 적합할까?
    • 미들웨어는 여러분이 만들기 위한 기능에 다양하게 사용 가능하고 또한 관리 측면에서도 많은 이점을 가져다 준다.
    • 이미 존재하는 미들웨어를 보면 다양하게 존재하고 있다.
  • 4) 여러개의 미들웨어가 겹치는 경우 동작하는 방식 !https://s3-us-west-2.amazonaws.com/secure.notion-static.com/37d79f84-576e-4657-b9f7-5afc5519788d/Untitled.png
    • 여러개의 미들웨어가 겹치는 경우, 이는 첫번째 미들웨어부터 순차적으로 진입하게 된다.
    • 예시로 아래와 같이 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() 가 실행되지 않으면 다음 미들웨어는 실행되지 않고, 클라이언트의 요청은 거기서 종료된다.
  • 5) Router와 미들웨어의 차이
    • Router와 미들웨어는 서로 다른 방식처럼 보이지만 Router는 미들웨어 기반으로 구현된 객체이므로 미들웨어와 동일한 방식으로 작동된다.
  • 6) Express.js의 미들웨어가 실행되는 경우
    • app.use(Middleware) : 모든 요청에서 미들웨어가 실행된다.
    • app.use(’/api’, Middleware) : /api로 시작하는 요청에서 미들웨어를 실행한다.
    • app.post(’/api’, Middleware) : /api로 시작하는 POST 요청에서 미들웨어를 실행한다.
profile
꾸준히 공부하는 개발자

0개의 댓글