Express로 서버 구성하기 ( 미들웨어 ) - 9

Express MiddleWare에 대해 알아보자

Posted by Kyun2da on January 5, 2021

1️⃣ 서론

안녕하세요 오늘은 Express의 미들웨어 사용법에 대해 자세하게 알아보는 시간을 가져보려고 합니다.

먼저 미들웨어가 무엇인지 어떻게 사용하는 것인지에 대해 알아보고 종류와 각각의 사용법들에 대하여 알아보도록 하겠습니다.

본 포스팅은 공식 문서를 보고 제가 복습할 때 보기 좋게 만든 포스팅입니다. 좀더 전문화된 글을 읽고 싶으시다면 공식문서를 참조해 주세요.

그럼 시작하겠습니다.

2️⃣ 미들웨어란?

미들웨어 함수는 어플리케이션 요청-응답 사이클 동안 (req)요청 객체, (res)응답 객체, next() 함수에 대한 엑세스 권한을 갖는 함수입니다.

즉, 미들웨어 함수는 요청이 오면 응답을 하기전에 거쳐가는 함수라고 보시면 될 것 같습니다.

여기서 생소한 함수가 next()일텐데요.

이 함수는 익스프레스 라우터 안의 함수로써 호출될 때 현재 미들웨어에 이어 미들웨어가 실행됩니다.

3️⃣ 미들웨어 예시

간단한 미들웨어 myLogger 함수를 만들어 보도록 하겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var express = require("express");
var app = express();

var myLogger = function (req, res, next) {
  console.log("LOGGED");
  next();
};

app.use(myLogger);

app.get("/", function (req, res) {
  res.send("Hello World!");
});

app.listen(3000);

위의 코드처럼 쓰고 / 경로로 접속한다면 먼저 app.use()를 통해 myLogger함수가 실행됩니다.

그 후 성공적으로 myLogger 함수가 실행된 후 app.get(‘/’) 함수가 실행되게 됩니다.

이 때 주의해야할점은 미들웨어를 쓸 때는 마지막에 next()가 들어가야한다는 점입니다.

4️⃣ Express 미들웨어 종류

Express 미들웨어 종류는 크게 5가지가 있습니다.

  • Application-level middleware
  • Router-level middleware
  • Error-handling middleware
  • Built-in middleware
  • Third-party middleware

크게 이렇게 나눌 수 있는데요 그럼 이제 하나하나 살펴보며 각각 어떤 종류인지 알아보도록 하겠습니다.

5️⃣ Application-level middleware

app.use() 와 app.METHOD(여기서 METHOD는 GET, PUT, POST등의 HTTP 메서드를 의미)함수를 사용함으로써 애플리케이션 레벨의 미들웨어를 앱에 바인딩하는 것을 의미합니다.

1
2
3
app.get("/user/:id", function (req, res, next) {
  res.send("USER");
});

가장 간단한 예로 위와 같이 라우팅하는 미들웨어를 의미합니다.

6️⃣ Router-level middleware

router-level 미들웨어또한 express.Router() 를 사용한다는것 빼고는 application-level 미들웨어와 같은 방식으로 동작합니다.

express.Router()는 라우터를 모듈화할때 매우 유용한 기능이다.

만약 users 라는 URI아래 또다른 URI를 여러개 작성하고 싶을땐 다음과 같이 미들웨어를 쓸 수 있다.

1
app.use("/users", require("./routes/users"));

그리고 새로 파일을 하나 만들어 다음과 같이 라우팅을 해주어 모듈화를 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var express = require("express");
var router = express.Router();

router.get("/", function (req, res, next) {
  res.send("유저 리스트");
});

router.get("/:id", function (req, res, next) {
  res.send("특정 유저 아이디: " + req.params.id);
});

router.post("/", function (req, res, next) {
  res.send("유저 이름 등록: " + req.body.name);
});

router.put("/:id", function (req, res, next) {
  res.send("유저 이름 수정:" + req.body.name);
});

router.delete("/:id", function (req, res, next) {
  res.send("유저 이름 삭제" + req.params.id);
});

module.exports = router;

7️⃣ Error-handling middleware

에러 핸들링 미들웨어는 항상 4개의 파라미터가 필요합니다.

그래야 오류 처리 미들웨어로 식별이 가능합니다.

1
2
3
4
app.use(function (err, req, res, next) {
  console.error(err.stack);
  res.status(500).send("Something broke!");
});

에러 핸들링은 다음에 추가적으로 포스팅 하도록 하겠습니다.

8️⃣ Built-in middleware

이미 내장되어있는 미들웨어는 4.x 버전 부터 다음과 같습니다.

  • express.static 은 정적파일을 제공하는 역할을 합니다.
  • express.json 은 요청을 JSON으로 파싱하는 역할을 합니다.
  • express.urlencoded 은 URL 인코딩 페이로드로 수신 요청을 구문 분석합니다.

9️⃣ Third-party middleware

다른 써드파티 미들웨어를 사용하여 Express 앱에 추가하는 것을 말합니다.

예를 들어 쿠키파서 같은 미들웨어가 있습니다.

1
$ npm install cookie-parser
1
2
3
4
5
6
var express = require("express");
var app = express();
var cookieParser = require("cookie-parser");

// 쿠키 파서 미들웨어를 로드합니다.
app.use(cookieParser());

🔟 마치며..

오늘은 미들웨어의 뜻과 미들웨어의 종류에 대해 알아보았습니다.

다음 시간엔 에러 핸들링 방법을 좀더 자세하게 알아보는 시간을 가져보도록 하겠습니다.

읽어주셔서 감사합니다. 🙏