티스토리 뷰

Node.js

[Node.js] Middleware

군옥수수수 2017. 12. 1. 22:38

Express의 정의는 다음과 같습니다.


Express is a routing and middleware web framework that has minimal functionality of its own: An Express application is essentially a series of middleware function calls.


Express에서는 각종 요청을 처리하고 기능을 붙이기 위해 미들웨어(middleware)를 사용합니다. 그 만큼 우리는 미들웨어를 많이 사용하게 되는데요. 오늘은 이런 미들웨어에 대해 공부를 해보도록 하겠습니다. 


미들웨어는 위에서 언급했고, 이름 그대로 request와 response 객체에 접근하여 그 사이에서 특정 작업을 처리해주는 역할을 합니다. 모듈(module)과 혼동이 될 수 있지만, 모듈은 해당 모듈의 역할을 하는 미들웨어들의 묶음이라고 보시면 됩니다.


미들웨어의 유형에는 크게 4가지가 존재합니다.


  1. Application
  2. Router
  3. Error Handling
  4. Third-party

이 유형들을 하나하나 살펴보도록 하겠습니다.


1. Application-level middleware

어플리케이션 전역에서 처리가 가능한 미들웨어로 어플리케이션 자체에 request가 발생할 때마다 실행됩니다. 이런 어플리케이션 레벨의 미들웨어는 다음과 같이 사용합니다.


  • app.use()
  • app.METHOD() - HTTP method

미들웨어를 사용한다고 선언을 하면 기본적으로 미들웨어는 미들웨어 스택에 쌓이게 됩니다. 어플리케이션에 대한 request가 들어올 때마다 이 스택을 통과하면서 request에 관한 처리를 하고 response를 하게 됩니다.


app.use(function(req, res, next){
  console.log('Time: ', Date.now())
  next()
}) // ----- 1

app.use('/index', function(req, res, next){
  /*
  	Code
  */
}) // ----- 2

app.use() 를 사용할 때는 path를 지정할 수 있습니다. 첫 번째 미들웨어는 어떤 request가 들어와도 작동을 하는 것이고 두 번째 미들웨어는 /index의 path를 통해 들어오는 요청에 대해서만 작동하는 미들웨어입니다. 그럼 여기서 app.METHOD()와의 차이점이 무엇인지 생각해볼 수 있습니다.

app.use('/index', function(req, res, next){
  // Code
})

app.get('/index', function(req, res, next){
  // Code
})

app.use('/index')/index 로의 모든 요청에 대해서 동작합니다. 즉 get이나 post 등 어떤 HTTP method에도 작동을 합니다. 그에 반해서 app.get('/index')get 요청에 대해서만 동작하는 미들웨어입니다.


그리고 next 를 통해 현재 미들웨어 내에서 상태에 따라 선택적으로 다음으로 넘어갈 미들웨어 함수를 지정할 수 있습니다.


2. Router-level middleware

동작방식은 Application-level 미들웨어랑 같습니다. 하지만 라우터 단위로 묶어 넣고 experss.Router()의 객체를 사용해야 한다는 차이점이 있습니다. Router-level 미들웨어를 사용한다면 어플리케이션에 Path별 요청에 따른 동작 방식을 모듈화하여 관리할 수 있습니다.

// user.js
var app = express()
var router = express.Router()

router.get('/mypage', function(req, res, next){
  // Code
})

router.get('/articles', function(req, res, next){
  // Code
})

router.post('/newArticle', function(req, res, next){
  // Code
})

module.exports = router

// app.js
var app = express();
var user = require('user.js')

app.use('/user', user)

만일 /user/mypage의 path로 GET 요청이 들어온다면 user라는 라우터 미들웨어가 처리하는데 그 안의 내용을 보면 router.get('/mypage') 에서 처리를 해주는 것을 알 수 있습니다. 이런 방법으로 path별로 처리해줄 미들웨어를 모듈화하여 관리할 수 있습니다.


3. Error-handling middleware

에러 처리를 담당하는 미들웨어입니다. 이러한 유형의 미들웨어는 반드시 네 개의 인자를 매개변수로 받아 이 미들웨어가 에러를 담당하는 미들웨어라는 것을 식별해야 합니다.


Error-handling 미들웨어를 작성하는 것은 여타 다른 미들웨어와 매개변수의 개수 차이 외에는 다른 점이 없습니다.

app.use(function(err, req, res, next){
  console.error(err.stack)
  res.status(500).send('Something broke!')
})

Error-handling 미들웨어로 넘어가기 위해서는 에러가 발생할 수 있는 미들웨어에서 반드시 next(err) 를 통해 Error-handling 미들웨어로 넘어간다는 것을 지정해주어야 에러 처리가 정상적으로 작동합니다.


4. Third-party middleware

기본적으로 주어지는 Built-in middleware 외에 추가로 설치하여 사용해야하는 미들웨어를 Third-party middleware라고 합니다.

$ npm install cookie-parser

Express에서는 쿠키와 세션을 사용하기 위한 기본 내장 미들웨어가 존재하지 않기 때문에 이렇게 따로 설치하여 사용해주어야 합니다.

var express = require('express')
var app = express()
var cookieParser = require('cookie-parser')

app.use(cookieParser())


마무리

오늘은 이렇게 Express에서 아주 중요한 개념인 미들웨어(middleware)에 대해 공부해보았습니다. 반드시 이해하고 있어야 하는 개념이기 때문에 여러 글들도 참고해가면서 개념을 반드시 익히시길 바랍니다. 저도 마찬가지로 공부하고 있는 입장이기 때문에 많은 피드백 부탁드리겠습니다. 감사합니다.


참고자료


  1. 모듈과 미들웨어 개념
  2. express 미들웨어(middleware)
  3. Express.js 기본 개념 및 내용 정리
  4. Middleware : The core of node.js backend apps
  5. Express documents - Using middleware
  6. stackoverflow - Express: what is "app.use"
  7. stackoverflow - Difference between app.use and app.get in express.js
  8. stackoverflow - Difference Between app.use() and router.use() in Express
  9. stackoverflow - Differences between express.Router and app.get
  10. Express에서의 MIDDELWARE


'Node.js' 카테고리의 다른 글

MongoDB - NoSQL  (2) 2017.12.13
[Node.js] Express-generator  (0) 2017.11.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함