본문 바로가기
nodejs

[node.js] 모듈과 미들웨어 개념

by jinbro 2017. 5. 23.
[모듈과 미들웨어란]
- 모듈 : 기본적으로 제공하는 기능 뿐 아니라 추가적으로 기능을 사용할 때 가져다 쓸 수 있는 라이브러리
1) 내장 모듈 : nodejs에서 제공하는 모듈
2) 확장 모듈 : nodejs 사용자들이 만들어낸 모듈

- 미들웨어 : 구조 내에서 중간 처리를 위한 함수(함수들의 꾸러미가 모듈)
1)  express 프레임워크에서 사용할 수 있는 중간 처리 목적의 소프트웨어 : 기본적인 express 구조 내에서 처리 목적으로 사용
2) 요청에 대한 응답을 완수하기 전까지 중간중간 다양한 일을 처리할 수 있음
3) 미들웨어 함수 생명주기 : request - response 응답을 주기로 종료 
4) 미들웨어 함수 우선순위 : 먼저 로드되는 미들웨어 함수가 먼저 실행됨(코드 순서 중요)

1
2
3
4
5
6
7
8
/* app.js */
var upload = require('./routes/upload');
app.use('upload', upload);
 
/* ./routes/upload.js */
router.get('/'function (req, res, next) {
  res.render('upload', { title: "파일 업로드" });
});
cs
- upload.js : function(req, res, next) HTTP get 메서드 + '/upload'가 요청이 발생했을 때 중간처리하는 미들웨어함수
- app.js : 미들웨어함수를 로드하기위해 app.use
- 요청이 발생했을 때 미들웨어 함수 실행, 응답 후 미들웨어 함수 죽음


[미들웨어 함수 유형 및 사용]
2) 미들웨어의 레벨 유형 : 미들웨어가 다뤄지는 영역마다 조금씩 정의하는 차이가 있음
2-1) 어플리케이션 : 어플리케이션 전체 영역에서 처리 가능, 앱에 대한 request가 발생할 때마다 실행되는 미들웨어
- app.use()app.METHOD() : 미들웨어 함수를 로드하기 위해서 호출해야함, METHOD: get, post 같은 HTTP 메서드


2-2) 라우터 : 라우터 단위로 request가 발생하면 실행, 특정 지정 라우트가 실행되었을 때마다 실행되는 미들웨어
1
2
3
4
5
6
var app = express();
var router = express.Router();
 
router.get('/'function (req, res, next) {
 
});
cs
- express().Router() 인스턴스에 바운드됨, 동작 방식은 같음
- get 라우트 함수의 두번째 인자 function이 미들웨어 함수
- 미들웨어함수 파라미터 : req(HTTP 요청), res(HTTP 응답), 
- req, res를 가지고 요청, 응답에 대한 변경 및 처리를 할 수 있음
- 어플리케이션 레벨에서 require해서 사용


2-3) 에러 핸들링 : 에러가 발생하면 핸들링할 때 사용하는 미들웨어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});
 
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env'=== 'development' ? err : {};
 
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
cs
- 에러 핸들링 미들웨어는 4개의 인수(err, req, res, next)를 가짐
- 에러가 캐치되면 위의 미들웨어 함수가 호출됨 : next(인수, 함수)  함수를 호출하지않으면 그 상태에 머무르게 됨
- 위와 같이 app.use(function()) : 아무런 주소가 지정되어있지않음, 지정되어있는 주소 이외에는 모두 에러 처리하겠다는 것
  그래서 next(); 함수를 호출하여 다음 미들웨어 함수로 넘김 : 에러 캐치와 에러 메세지를 분석해서 랜더링 하는 함수를 따로 둠
- 아래와 같이 next로 함수를 호출하지않을 경우 그 다음 미들웨어 함수로 넘어가지않음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
});
 
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env'=== 'development' ? err : {};
 
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
cs


3-4) 써드파티 미들웨어
- 어플리케이션, 라우터 레벨에서 써드파티 미들웨어 설정 가능
- express는 대부분 써드파티 미들웨어 사용을 권고
- npm으로 다운로드
- 오늘 포스팅할 multer 또한 써드파티 미들웨어


[참고자료]
- express 공식홈페이지, 미들웨어 작성 : http://expressjs.com/ko/guide/writing-middleware.html

- express 공식홈페이지, 미들웨어 사용 : http://expressjs.com/ko/guide/using-middleware.html



댓글