미들웨어는 들어오는 요청을 프레임워크의 다양한 함수를 통해 자동으로 이동하는 중간지점이라고 생각하면 된다.
미들웨어는 양 쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어, 네트워크를 통해서 연결된 여러 개의 컴퓨터에 있는 많은 프로세스들에게 어떤 서비스를 사용할 수 있도록 연결해 주는 소프트웨어를 말한다. - Wikepedia
이렇게 소프트웨어의 구조에서 가운데에 숨겨져 있으며 분산 애플리케이션에 대한 통신 및 데이터 관리를 가능하게 만들어준다. 활용 가능성이 큰 만큼 쓰이는 곳 또한 다양한다.
가장 기본적인 수준에서 미들웨어를 사용하면 개발자는 애플리케이션 구성 요소(서비스 또는 마이크로서비스), 데이터 소스, 컴퓨팅 리소스 또는 장치에 연결해야 할 때마다 사용자 지정 integration을 만들지 않고도 애플리케이션을 구축할 수 있다.
JSON(JavaScript 개체 표기법), REST(표현 상태 전송) , XML(확장 가능 마크업 언어), SOAP(단순 개체 액세스 프로토콜) 등과 같은 일반적인 메시징 프레임워크를 사용하여 다양한 애플리케이션과 서비스가 통신할 수 있도록 하는 서비스를 제공한다.
일반적으로 미들웨어는 Java, C++, PHP, Python 등 여러 언어로 작성된 구성 요소가 서로 통신할 수 있도록 하는 서비스도 제공하여 호환성이 좋다.
우리는 응답을 전송하기 전까지 요청이 통과하게 될 다양한 함수들을 연결할 가능성을 가진다. 이를 통해 모든걸 하나의 함수를 사용하여 처리하기보다는 코드를 다수의 블록 or 조각들로 분할할 수 있는 것이 express.js의 특징이다.
미들웨어 기능들을 제공하는 서드 파티 패키지들을 express에 담아 특정 기능을 추가할 수 있다는 점이 주요 특징이다.
// nodejs에 탑재된 모듈 불러오기
const http = require("http");
//express 불러오기
const express = require("express");
//express를 함수로서 실행 하면서 새로운 객체 초기 설정
const app = express();
//app.use로 전달하는 함수는 모든 요청이 들어올 때마다 실행되며 3가지 인수를 받음
//파라미터 중 next는 express.js를 통해 여기로 전달되는 함수이며 다음 미들웨어로 요청이 이동될 수 있도록 실행되어야 함.
app.use((req, res, next) => {
console.log("middleware");
//다음 아래에 있는 미들웨어로 이동할 수 있도록 허용
next();
});
app.use((req, res, next) => {
console.log("middleware2");
//express는 기본 응답을 보내지 않기 때문에 따로 응답을 보내야됨
//ContentType의 경우 자동으로 이루어짐(기본값 text/html)
res.send("<h1>Hello from express</h1>");
});
// createServer의 첫번째 인수: 요청에 대한 데이터, 두번째 인수: 응답에 대한 데이터
// createServer 콜백 함수의 사용
const server = http.createServer(app);
//listen의 경우 nodejs가 스크립트를 바로 종료하지 않고 계속 실행하면서 들을 수 있도록 만듦
//로컬 환경에서 서버 가동
server.listen(3000);
이런 식으로 app.use를 통해 express의 메서드가 작동하며 이러한 express의 parameter로 받는 req,res,next 중 추가된 next는 다음 미들웨어로 요청이 이동될 수 있도록 돕는다.
여기서 주의할 점은 express는 기본 응답을 보내지 않기 때문에 따로 응답을 보내야 한다. 기존 node.js만 사용할 때는 res.write 방식으로 응답을 전송했지만 express에서는 res.send("") 를 통해 이루어진다.
또한 next()를 호출하지 않는다면 여러 개의 미들웨어가 있을 경우 위 -> 아래
의 순서로 미들웨어가 작동하는 과정에서 next()를 호출하지 않은 미들웨어가 있을 경우 해당 미들웨어에서 멈춰 더 이상 다음 미들웨어를 실행하지 않으니 주의해야 한다.