-
[server] express 미들웨어 함수web study/JavaScript 2021. 3. 27. 15:41
서버 공부를 하던 중간에 미들웨어 함수라는 용어를 듣고 이게 뭔가 싶어서 한 번 파봐야 겠다는 생각이 들었다.
처음 미들웨어 함수를 봤을 때 이걸 어디에 쓸까 하다가 로그인 인증이나 보안 관련된 일들을 하겠거니 생각했는데
실제로도 보안관련된 일에도 쓰이며, 코드를 작성하다보면 하나의 함수 안에 너무 많은 일들을 처리하면 가독성이 떨어지는 문제도 발생하는데 요청에 대한 응답을 보내기 전에 미들웨어 함수를 이용함으로써 이를 해결하는데에도 사용한다고 한다.
1. 미들웨어 함수란?
간단하게 요약하면 서버에서 응답하기 이전에 실행되는 함수라고 할 수 있다.
이 미들웨어는 직접 작성하는 방법 외에 다른 개발자들이 작성해둔 미들웨어들을 가져와서 사용이 가능하다.
대표적으로 Morgan, Body-parser와 같은 친구들이 있으며 npm에서 install해서 사용이 가능하다
2. 미들웨어 특징
2.1 미들 웨어 함수는 use매서드를 이용하여 호출할 수 있다.
- 미들웨어 사용 방법은 아래에서 서술하도록 한다.
2.2 req, res, next 인자를 받으며 필수적으로 3개의 인자를 받아야 한다.
- 미들 웨어 함수에서는 request, response를 수정할 수 있다.
- 에러를 처리하기 위해서는 차례대로 err, req, res, next의 인자를 받아야 한다.
2.3 미들웨어 함수는 호출하는 순서에 따라 실행된다.
- 만약 미들 웨어 함수가 서버에서 응답을 하고 난 이후 실행이 된다면 해당 미들웨어 함수는 실행이 되지 않게된다.
2.4 미들웨어 함수는 요청 - 응답 주기를 꼭 종료해 줘야 한다.
- 미들 웨어 함수는 요청 후 next 함수를 호출함으로써 다음 행동을 정의해줄 수 있다.
- next 함수를 호출하지 않으면 함수 동작이 멈춤으로써 서버에서 클라이언트로 응답을 해줄 수 없게 된다.
- 즉 응답 메서드에서 res.end()와 같이 서버에서 응답을 하겠다는 행위를 next로 해준다고 생각하면 된다.
2.5 미들웨어 함수의 종류
- 어플리케이션 미들웨어
- 라우터 레벨 미들웨어
- 오류처리 미들웨어
- 써드 파티 미들웨어
3. 미들웨어 함수 작성법
공부 초기인 만큼 다른 방법을 사용하기보다는 기본기인 어플리케이션 미들웨어 작성법에 대해 정리해보려 한다.
공식 문서에서는 기본적인 미들웨어 함수를 사용하는 방법엔 아래와 같이 함수를 선언해주고 use 매서드 사용에 대해 서술하고 있다.
var myLogger = function (req, res, next) { console.log("외부에서 함수 선언"); next(); }; app.use(myLogger);
myLogger 라는 함수는 3개의 인자를 받으며 여기서 next는 콜백함수이다.
함수의 종료 시기는 next 함수가 호출되는 시점이며 next함수가 실행되면 즉시 다음 미들웨어 함수가 실행된다.
일반적으로 함수를 선언해서 사용하는 방법 외에 use 매서드 내부에 선언하는 방법도 사용할 수 있다.
app.use(function (req, res, next) { console.log("미들 웨어 함수 내부 콜백함수 선언"); next(); });
아래와 같이 콜백 함수를 연속적으로 선언하면서 하나의 use 매서드 안에 여러 매서드를 선언하는 방법도 존재한다.
app.use(function (req, res, next) { console.log("미들 웨어 첫 번째 콜백함수"); next(); }, function (req, res, next) { console.log("미들 웨어 두 번째 콜백함수"); next(); });
이와 같이 기본적인 미들웨어 함수를 정리해 보았다.
공식 문서를 읽어보면 전체적인 개념을 익히거나 세부적인 정보를 보는데는 도움이 되었지만
실제로 어떤식으로 사용하는지, 왜 필요한지는 명확하게 나온 것이 없어서 아쉬웠던 찰나
미들 웨어 함수가 어떤 것인지 정리하면서 사용예 등을 예상할 수 있어 좋은 시간이 된 것 같다.
다음엔 express에 대해 정리를 해볼까 한다.
- 참고 -
'web study > JavaScript' 카테고리의 다른 글
[JavaScript] JWT와 Session (0) 2021.07.16 [JavaScript] this와 Execution Context (0) 2021.07.16 [javascript] 자바스크립트 작동 원리 (0) 2021.07.13