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️⃣ 마치며..
오늘은 라우팅하는 법을 좀더 깊이있게 다뤄보았습니다.
다음 시간에는 미들웨어에 대해 좀더 자세하게 알아보는 시간을 갖도록 하겠습니다.
읽어주셔서 감사합니다.