본문 바로가기

개발/Node.js

[nodejs] Middleware 미들웨어 개념, 종류, 사용법(에플리케이션 레벨 미들웨어, 라우터 레벨 미들웨어) 1

미들웨어란?

미들웨어는 요청(Request)과 응답(Response) 도중에 다른 함수로 접근할 수 있는 함수이다. 미들웨어 함수는 일반적으로 next라는 이름의 변수로 표시된다.

또한 app.use() 나 app.Method() - app.get(), app.post()... 함수를 통해서 바인딩 된다.

 

나는 token을 이용한 로그인을 구현하다가 미들웨어를 공부하게 되었다. 

 

정의

함수 정의와 비슷하게 정의한다. (그림참고)

미들웨어를 사용하는 간단한 예제를 실행해보겠다.

 

app.js

let myMiddleware = function(req, res, next){ // 미들웨어 선언
  console.log('이곳을 거쳐갑니다.');
  next();
};

app.use(myMiddleware) // 미들웨어 사용

app.get('/', function(req, res, next) { // 라우터 선언
  res.render('index', { title: 'Express' });
});

// app.use('/', indexRouter);
app.use('/users', usersRouter);

 

app.use('/', indexRouter);는 주석처리를 하고 직접 index로 가는 코드를 app.js에 선언하였다. 또한, myMiddleware라는 미들웨어 함수를 선언하고 app.use(myMiddleware)를 선언하여 myMiddleware 함수를 호출하였다. app.js는 위에서 아래로 순차적으로 실행되기 때문에 index.ejs로 가기 이전에 무조건 myMiddleware를 실행하게 된다.

 

결과값

 

 


 

미들웨어의 종류

 

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

 


 

 

에플리케이션 레벨 미들웨어

app.use() 함수를 이용해 애플리케이션 미들웨어를 인스턴스에 바인드한다. 이 함수는 앱이 요청을 수신할 때마다 실행된다.

 

예제 1.

app.js

app.use('/user/:id', function(req, res, next){ // 미들웨어 선언
  console.log('이곳을 거쳐갑니다.');
  next();
});

// app.use(myMiddleware)
app.use('/', indexRouter); // 그리고 이쪽으로 이동함
app.use('/users', usersRouter);

app.use(/user:id)로 갈때마다 미들웨어가 실행된다. 이제 미들웨어를 함수로 빼서 사용해보자.

 

예제2.

middleware folder, firstMiddleware.js 생성

 

app.js

let usersMiddleware = require('./middleware/firstMiddleware'); // 미들웨어 선언

// app.use(myMiddleware)
app.use('/', indexRouter);
app.use('/users/:id', usersMiddleware); // 미들웨어 실행
app.use('/users', usersRouter);

usersMiddleware라는 변수에 방금 만든 미들웨어 함수를 넣어주었다.

또한 /users를 거쳐가기 전에 app.use('/users/:id', usersMiddleware); 해당 변수를 호출하여 접근하도록 하였다.

 

middleware/firstMiddleware.js
let myMiddleware = function(req, res, next){
    console.log('이곳을 거쳐갑니다.');
    next();
};

module.exports = myMiddleware;
미들웨어는 간단한 콘솔 문구가 찍히도록 하였다.

 

 
router/users.js
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/:id', function(req, res, next) {
  console.log('id value : ' , req.params.id)
  res.send('respond with a resource');
});

그리고 users.js에는 해당 url로 접근 할 수 있는 라우터를 구현했다.

 

결과값

잘 접근함을 알 수 있다. 또한 http://localhost:3333/users/로는 미들웨어에 접근이 안됨을 확인 할 수 있다.
 

라우터 레벨 미들웨어

라우터 레벨 미들웨어는 express.Router() 인스턴스에 바인드된다는 점을 제외하면 애플리케이션 레벨 미들웨어와 동일한 방식으로 작동한다. 
간단한 예제를 만들어보자.

middleware/secondMiddleware.js 생성

 

app.js
let usersMiddleware = require('./middleware/secondMiddleware'); // 미들웨어 선언

app.use(usersMiddleware); // 미들웨어 실행
app.use('/', indexRouter); 
app.use('/users', usersRouter);

usersMiddleware의 경로를 방금 만든 js 페이지로 설정해주고

다른 라우터들이 실행되기 전에 app.use(usersMiddleware); 를 작성하여 userMiddleware를 선언하였다.

 

secondMiddleware.js

// mount path가 없는 미들웨어. 모든 요청에 실행된다.
router.use(function (req, res, next) {
  console.log('Time:', Date.now());
  next();
});

// /user/:id path로 온 모든 HTTP method를 받는 미들웨어
router.use('/users/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next();
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

// /user/:id path로 온 GET 방식만 받는 미들웨어 
router.get('/users/:id', function (req, res, next) {
  if (req.params.id == 0) next('route'); 
  // 파라미터가 0이면 next를 skip하고(미들웨어로 가는것을 중단하고) 다음 route로 전달 - special page로 렌더링됨
  else next(); 
}, function (req, res, next) { // index page로 렌더링
  res.render('index', { title: 'index page' });
});

// /user/:id path로 온 경우 special page로 랜더링 해주는 미들웨어
router.get('/users/:id', function (req, res, next) {
  console.log(req.params.id);
  res.render('special');
});

라우터레벨 미들웨어들을 선언해보았다. 주석을 참고하여 이해를 하고 테스트를 해보도록 하자.

 

결과값

 

/, /users호출시

첫번째 미들웨어가 호출된다.


POST로 각각 /users/100를 호출시

첫번째 미들웨어와 두번째 미들웨어가 실행된다.


GET /users/100 호출시

첫번째, 두번째 미들웨어가 호출되고,

index 페이지로 렌더링하는 세번재 미들웨어까지 실행되었다.


 

오류처리 미들웨어는 다른 페이지에 이어서 작성해볼것이다.

 

reference : http://expressjs.com/ko/guide/using-middleware.html

 

Express 미들웨어 사용

미들웨어 사용 Express는 자체적인 최소한의 기능을 갖춘 라우팅 및 미들웨어 웹 프레임워크이며, Express 애플리케이션은 기본적으로 일련의 미들웨어 함수 호출입니다. 미들웨어 함수는 요청 오

expressjs.com

참고 : https://github.com/datoybi/blog-posting/tree/main/middleware1