[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/WEB

Node.js - express 미들웨어

inu 2020. 10. 14. 21:51
반응형

미들웨어

  • 미들웨어의 원래 뜻은 '클라이언트와 서버 간의 통신을 담당하는 시스템 소프트웨어 또는 컴퓨터와 컴퓨터의 연결을 담당하는 시스템 소프트웨어'이지만, 적용되는 서비스마다 그 의미가 달라진다.
  • Node.js express에서 미들웨어는 '최종 요청 핸들러 이전의 Express 라우팅 계층에 의해 호출되는 함수로써, 따라서 원시 요청과 의도된 최종 라우트 사이의 미들웨어에 위치함'으로 정의된다.
  • 아래와 같이 라우팅시 처리되는 함수도 모두 미들웨어 함수이다.

출처 : Express 공식페이지(http://expressjs.com/ko/guide/writing-middleware.html)

  • 라우팅을 작성하는데 어떤 URL은 꼭 로그인을 요구하고 싶다고 하자. 로그인이 안되어있으면 로그인 페이지로 강제 이동한다. 특정 URL로 들어가기 전에 로그인을 체크한다.
  • 미들웨어는 이러한 일련의 과정을 좀 더 쉽게해주는 것이라고 할 수 있다.
  • 즉, 중간에 요청을 가로채는 것이 미들웨어라고 생각하면 이해하기 편하다.
  • 내부적으로는 모든 코드를 실행, 요청 및 응답 오브젝트에 대한 변경을 실행, 요청-응답 주기를 종료, 스택 내의 그 다음 미들웨어 함수를 호출 기능을 수행한다.

cf. morgan

  • 콘솔에서 사용자가 어떤 url에 접속했는지 확인할 수 있는 morgan이라는 것이 있다
  • 이를 통해 사용자의 url 요청을 확인함으로서 개발을 더 수월하게 할 수 있다
npm install morgan
  • npm install morgan을 통해 설치한다.
const logger = require('morgan')
app.use(logger('dev'))
  • 사용은 위와같이 한다. 사용자에게 페이지를 띄우기 전 해당 요청에 대한 정보를 콘솔에 띄우도록 한다.
  • use도 일종의 미들웨어이다. (중간에서 요청을 작업을 처리하고 다음 기능을 수행)
  • express 객체에 use를 활용해 logger('dev')를 항상 먼저 수행하도록 한다.

  • 어쨌든 위와 같이 morgan을 활용하면 사용자가 url 요청을 보낼 때마다 콘솔창에 위와 같이 요청에 대한 정보가 출력됨을 확인할 수 있다.
  • 이를 활용해 미들웨어 작동을 좀 더 제대로 살펴보자.

미들웨어 사용

  • 미들웨어는 인자 3가지를 사용한다. (request, response, next)
  • 여기서 next는 미들웨어 이후에 진행될 과정을 의미한다.
  • 요청-응답 주기를 종료하지 않는 경우에는 next()를 호출하여 그 다음 미들웨어 함수에 제어를 전달해야 한다.
function testMiddleware(req, res, next) {
    console.log('첫번째 미들웨어');
    next();
}

function testMiddleware2(req, res, next) {
    console.log('두번째 미들웨어');
    next();
}
  • 두개의 미들웨어 메소드를 작성했다.
  • 콘솔에 메세지를 출력하고 원래 하려던 작업을 수행하도록 할 것이다. (next()를 통해 원래 하려던 작업으로 이동한다.)
router.get('/', testMiddleware, testMiddleware2, (req, res) => {
    res.send('두개의 미들웨어 작동 후 전송되는 페이지');
});
  • 사용은 위와 같이 한다. 보는 바와 같이 여러개의 미들웨어를 하나에 사용할 수도 있다.
  • 페이지 요청이 있을 경우 먼저 testMiddleware를 수행하고, 그 다음 testMiddleware2를 수행한다.
  • 그러고 나서야 원래 하려던 res.send('두개의 미들웨어 작동 후 전송되는 페이지')를 수행하게 되는 것이다.

  • 콘솔창을 확인하면 위와 같이 정상적으로 미들웨어를 수행했음을 알 수있다.
  • cf. 에러처리를 할 땐 err을 포함한 4개의 인수를 사용한다. (아래 예시)
app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

app.use 미들웨어 적용

function vipMiddleware(req, res, next) {
    console.log('최우선 미들웨어');
    next();
}
app.use('/admin', vipMiddleware, admin)
  • app.use는 미들웨어를 전역 처리 스택에 추가하는 것이다.
  • 위와 같이 라우팅을 통해 특정 url에 접속할 때, 해당 url을 무조건 vipMiddleware를 실행하도록 할 수 있다.
  • 아무런 url도 입력하지 않고 use를 사용하면 무조건 요청을 수신할 때마다 해당 미들웨어 함수가 실행된다.
  • 이러한 기능을 활용한다면 초반에 언급했던 로그인 페이지 강제이동 기능도 구현할 수 있을 것이다.

결과

반응형

'🛠 기타 > WEB' 카테고리의 다른 글

Node.js - http 모듈  (0) 2020.12.14
Node.js - Event Emitter  (0) 2020.12.10
Node.js - express view engine (Nunjucks)  (0) 2020.10.13
Node.js - express Router  (0) 2020.10.13
Node.js - nodemon  (0) 2020.10.13