Express로 서버 구성하기 ( 라우팅 ) - 8

Express 라우팅 예제

Posted by Kyun2da on January 3, 2021

1️⃣ 서론

안녕하세요. 오늘은 Express로 라우팅하는 방법에 대해 알아보려고 합니다.

지난번에 Express - 기본 라우팅 포스팅을 통해 기본 라우팅 하는 방법에 대해 알아보았는데요.

이번에는 좀더 깊이 들어가 보도록 하겠습니다.

다음 내용은 공식 문서를 정리하며 만든 글입니다.

그럼 시작해보겠습니다.

2️⃣ 기본 라우팅 복습

Express 는 HTTP method를 사용하여 라우팅을 정의할 수 있습니다.

보통 get, post, put, delete가 많이 쓰이곤 하는데요.

1
2
3
4
5
6
var express = require("express");
var app = express();

app.get("/", function (req, res) {
  res.send("hello world");
});

위 예제를 보면 app.get의 get이 바로 HTTP method의 예중 하나 입니다.

3️⃣ Route Parameter

라우트 파라미터는 URL에서 해당 위치에 지정된 값을 가져오는데 사용되는 URL 조각입니다.

해당 값은 경로에 지정된 매개변수의 이름이 해당키로 req.params개체에 들어옵니다.

Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { “userId”: “34”, “bookId”: “8989” }

위와 같이 받아오려면 다음과 코드를 사용하면 됩니다.

1
2
3
app.get("/users/:userId/books/:bookId", function (req, res) {
  res.send(req.params);
});

4️⃣ Route Handler

Express 에서는 미들웨어처럼 작동하는 여러 콜백 기능을 제공합니다.

라우트 핸들러는 아래의 예제와 같이 함수, 함수의 배열 또는 두가지 조합의 형태로 사용이 가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var cb0 = function (req, res, next) {
  console.log("CB0");
  next();
};

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

app.get(
  "/example/d",
  [cb0, cb1], // cb0, cb1 미들웨어
  function (req, res, next) {
    console.log("the response will be sent by the next function ...");
    next();
  },
  function (req, res) {
    res.send("Hello from D!");
  }
);

cb0, cb1을 미들웨어로 사용하는 예제입니다. 미들웨어로 사용할때는 next()를 사용한다는 것을 기억해주시면 될 것 같습니다.

또한 미들웨어 여러개를 사용한다면 []로 감싸서 사용하시면 여러개의 미들웨어를 사용하실 수 있습니다.

5️⃣ Response methods

다음 표의 응답 개체에 있는 메서드는 클라이언트에 응답을 보내고 요청-응답 주기를 종료할 수 있습니다.

만약 route handler로부터 이러한 메서드를 호출하지 않는다면 클라이언트 요청이 중단됩니다.

Method Description
res.download() 파일 다운로드를 진행합니다.
res.end() 응답 프로세스를 끝냅니다.
res.json() JSON response 를 보냅니다.
res.jsonp() Jsonp 로 JSON response 를 보냅니다.
res.redirect() 요청을 redirect 합니다.
res.render() 템플릿을 렌더링 합니다.
res.send() 다양한 타입의 응답을 보냅니다.
res.sendFile() 파일을 octet stream (8비트 단위의 바이너리 데이터)으로 보냅니다.
res.sendStatus() 응답상태 코드를 설정하고 해당 문자열 표현을 응답 본문으로 보냅니다.

6️⃣ app.route()

app.route() 메소드를 이용하여 경로에 대한 chainable route handler를 만들 수 있습니다.

모듈로 경로를 생성하는 것이 유용하며, 중복성과 오타를 줄일 수 있게 됩니다.

예시는 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
app
  .route("/book")
  .get(function (req, res) {
    res.send("Get a random book");
  })
  .post(function (req, res) {
    res.send("Add a book");
  })
  .put(function (req, res) {
    res.send("Update the book");
  });

7️⃣ express.Router

express.Router를 이용하면 모듈식 경로 처리를 할 수 있습니다.

아래 예는 라우터로 모듈을 생성하고, 그안에 미들웨어 기능을 로드하고, 일부 경로를 정의하고, 라우터 모듈을 기본 앱의 경로에 마운트 하는 예제입니다.

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

// 이 라우터에 특정된 미들웨어입니다.
router.use(function timeLog(req, res, next) {
  console.log("Time: ", Date.now());
  next();
});
// home route 정의
router.get("/", function (req, res) {
  res.send("Birds home page");
});
// about route 정의
router.get("/about", function (req, res) {
  res.send("About birds");
});

module.exports = router;

8️⃣ 마치며..

오늘은 라우팅하는 법을 좀더 깊이있게 다뤄보았습니다.

다음 시간에는 미들웨어에 대해 좀더 자세하게 알아보는 시간을 갖도록 하겠습니다.

읽어주셔서 감사합니다.