[ExpressJs] 미들웨어란

미뇽·2024년 1월 25일
0

아장아장 백엔드

목록 보기
3/5

미들웨어는 들어오는 요청을 프레임워크의 다양한 함수를 통해 자동으로 이동하는 중간지점이라고 생각하면 된다.

미들웨어는 양 쪽을 연결하여 데이터를 주고 받을 수 있도록 중간에서 매개 역할을 하는 소프트웨어, 네트워크를 통해서 연결된 여러 개의 컴퓨터에 있는 많은 프로세스들에게 어떤 서비스를 사용할 수 있도록 연결해 주는 소프트웨어를 말한다. - Wikepedia

이렇게 소프트웨어의 구조에서 가운데에 숨겨져 있으며 분산 애플리케이션에 대한 통신 및 데이터 관리를 가능하게 만들어준다. 활용 가능성이 큰 만큼 쓰이는 곳 또한 다양한다.

  • 데이터베이스 미들웨어
  • 애플리케이션 서버 미들웨어
  • 메세지 지향 미들웨어(MOM)
  • 트랜잭션 처리모니터(TPM)
  • API 미들웨어
  • 원격 프로시저 호출(RPC) 미들웨어
  • 객체 요청 브로커(OBR) 미들웨어
  • 비동기식 데이터 스트리밍 미들웨어
  • 기타 등등..

작동방식

가장 기본적인 수준에서 미들웨어를 사용하면 개발자는 애플리케이션 구성 요소(서비스 또는 마이크로서비스), 데이터 소스, 컴퓨팅 리소스 또는 장치에 연결해야 할 때마다 사용자 지정 integration을 만들지 않고도 애플리케이션을 구축할 수 있다.

JSON(JavaScript 개체 표기법),  REST(표현 상태 전송) , XML(확장 가능 마크업 언어), SOAP(단순 개체 액세스 프로토콜) 등과 같은 일반적인 메시징 프레임워크를 사용하여 다양한 애플리케이션과 서비스가 통신할 수 있도록 하는 서비스를 제공한다.
일반적으로 미들웨어는 Java, C++, PHP, Python 등 여러 언어로 작성된 구성 요소가 서로 통신할 수 있도록 하는 서비스도 제공하여 호환성이 좋다.

Express.js

우리는 응답을 전송하기 전까지 요청이 통과하게 될 다양한 함수들을 연결할 가능성을 가진다. 이를 통해 모든걸 하나의 함수를 사용하여 처리하기보다는 코드를 다수의 블록 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()를 호출하지 않은 미들웨어가 있을 경우 해당 미들웨어에서 멈춰 더 이상 다음 미들웨어를 실행하지 않으니 주의해야 한다.

profile
문이과 통합형 인재(人災)

0개의 댓글