Node JS #3
Middleware
MDN 문서의 미들웨어의 정의는 아래와 같다.
Middleware
Middleware is a (loosely defined) term for any software or service that enables the parts of a system to communicate and manage data. It is the software that handles communication between components and input/output, so developers can focus on the specific purpose of their application.
In server-side web application frameworks, the term is often more specifically used to refer to pre-built software components that can be added to the framework’s request/response processing pipeline, to handle tasks such as database access.
-MDN document
그리고 우리가 실질적으로 이용하는 미들웨어는 아래와 같다.
즉, Request와 Response 사이에서 동작하는 것을 미들웨어라고 한다.
사실 모든 request handler는 3개의 인자를 갖는데, 마지막 인자는 다음 핸들러를 실행하는 next() 함수를 실행할 수 있게 한다.
const middlewareFunction = (req, res, next) => {
console.log("I'm MiddleWare");
next();
};
const handlerFunction = (req, res) => {
console.log("I'm Handler!");
return res.end();
};
app.get("/", middlewareFunction, handlerFunction);
localhost:4000 루트로 접근한 뒤의 콘솔은 다음과 같다.
예상한 바와 같이 next()가 다음 핸들러를 호출하는 것을 볼 수 있다.
그리고 이렇게 request와 response 중간에 있는 핸들러를 미들웨어라고 한다.
미들웨어는 app.use()를 이용해 등록할 수 있다.
import express from "express";
const app=express();
app.use((req, res, next)=>{
console.log("I'm Middle!");
next();
});
app.get("/", (req, res, next) => {
console.log("I'm root handler!");
res.end();
});
app.listen(PORT, () => {
console.log(`Server litening on port ${PORT}`);
});
미들웨어가 next()를 이용해 다음 핸들러를 호출하는 것을 확인할 수 있다.
이렇듯 미들웨어는 request에 응답하지 않고 request를 지연시키며 다른 핸들러를 호출하는 것을 알 수 있다.
app.use()는 global한 미들웨어를 만들어준다.
app.use(MiddlewareFunction); // 모든 route에 대해 MiddlewareFunction가 등록
app.get(_route,function) // 특정 _route에만 function이 등록
이때 연결 순서가 중요한데, app.use()가 먼저 온 뒤에 app.get()이 와야 미들웨어가 중간에서 올바르게 동작한다.
그리고 미들웨어가 next()를 이용해 다음 핸들러를 호출하지 않으면 그 뒤의 핸들러는 실행되지 않는다.
우리는 지금까지 미들웨어를 직접 만들어서 사용해왔다.
이제는 잘 정의된 외부 미들웨어를 가져와서 사용해보자.
Morgan
HTTP request logger middleware for node.js - npm
Morgan은 Node.js 웹 애플리케이션의 HTTP 요청 로깅 미들웨어입니다.
Morgan을 사용하면 간단한 설정으로 서버에서 수신된 HTTP 요청에 대한 로깅을 쉽게 수행할 수 있습니다. - GPT
import express from "express"; // /node_modules에서 express를 찾아 import
import morgan from "morgan"; // /node_modules에서 morgan import
const PORT = 4000; // 포트 번호
const app = express(); // express Application 생성
const logger = morgan("dev"); // moran의 dev 옵션
const handlerFunction = (req, res) => {
console.log("I'm Handler!");
return res.end();
};
app.use(logger); // margan 미들웨어 등록
app.get("/", handlerFunction); // 루트 route에 대한 핸들러 등록
// 서버 실행
app.listen(PORT, () => {
console.log(`Server litening on port ${PORT}`);
});
morgan에 dev 옵션을 이용하여 위와 같이
:method :url :status :response-time ms - :res[content-length]
를 확인할 수 있는 것을 볼 수 있다.
이렇게 미들웨어를 직접 만들 수도 있지만, morgan은 더 정교하고 이미 잘 만들어진 모듈이므로 이걸 가져다가 쓰자
Morgan의 소스코드를 들여다보면 우리가 작성한 미들웨어와 같은 방식으로 작성되어 있다는 것을 확인할 수 있다.
Leave a comment