[Express.js/MongoDB] Routing? Routing!
목표
Routes, Router, Routing 이 무엇인지 간략히 알아본다.
Express.js의 라우팅 시스템을 알아본다.
과정
라우팅이란 무엇인가? 클라이언트 상에서 HTTP 메서드를 통해 "어떤 사이트 주세요" 라고 요청하면 그에 해당하는 파일을 주는 것이라고 설명할 수 있다.
그런 요청들은 매우 다양해서(GET, POST, PATCH, DELETE ...) 어떤 한 객체나 프로그램이 관리하는 게 효율적이지 않겠는가?
어떤 음식점이 대박이 나서 영업 시간 내내 웨이팅이 있다고 해보자. 만약 그 식당에 메인 쉐프만 있다면 쉐프가 주문을 받고 결제를 한 뒤, 음식을 내야할 것이다. 한 사람이 이 모든것을 소화하기엔 너무 버거운 작업량이다. 그래서 홀에서 서빙을 하는 웨이터를 두기로 한다. 웨이터를 영입하니 주문을 관리, 감독해주는 사람이 생겨 쉐프는 요리를 내는데에만 온전히 집중할 수 있게 되었다!
완벽한 예시는 아니지만, 라우팅과 라우터의 관계는 쉐프와 웨이터의 관계처럼 볼 수 있다. 정확히 말하자면 "음식을 해서 내는 행위"(Routing)와 "주문을 관리하는 행위"(Router)의 관계 말이다.
다시, 딱딱한 서버의 세계로 와서 생각해보자. 한 홈페이지가 제공하는 서비스가 만약 한 파일에 존재한다면 어떻겠는가? 어떤 부분에서 버그가 발생했을 때, 디버깅을 하기 어려울 뿐더러 어떤 기능을 추가할 때, 어디에 코드를 삽입해야할지 파악하는데 굉장히 시간이 오래 걸릴 것이다. 그렇기 때문에 서비스를 분산시킬 필요가 있다.
Routing은 요청이 들어왔을 때 응답하는 것이고, Router는 그런 Routing들을 한 곳에 모아주는 감독관이라고 생각하면 된다. 자, 그럼 Express.js에서 어떻게 Router를 선언하고, Routing을 관리할 수 있는지 알아보자.
메인 스크립트에 다음과 같은 코드가 존재한다고 가정하자.
// main.js
const express = require('express');
const app = express();
app.get('/products', (req, res) => {
res.send('HERE ARE THE PRODUCTS!');
});
app.post('/products', (req, res) => {
res.send('HERE ARE A NEW PRODUCT!');
});
app.delete('/products', (req, res) => {
res.send('PRODUCT DELETED!');
});
app.listen(3000);
위 코드에는 /products에 대한 라우트 핸들러가 3개 밖에 존재하지 않지만, 실제로는 1000개 정도 있다고 가정하자.
코드가 아주 복잡해질 것이다. 그럴 때, 사용하는 것이 Router이다.
// router.js
const express = require('express');
const router = express.router();
router.get('/', (req, res) => {
res.send('HERE ARE THE PRODUCTS!');
});
router.post('/', (req, res) => {
res.send('HERE ARE A NEW PRODUCT!');
});
router.delete('/', (req, res) => {
res.send('PRODUCT DELETED!');
});
module.exports = router; // 모듈화 했으니 exports 선언 해준다!
Express.js 가 지원하는 Router 객체는 하나의 또 다른 application이다.
즉, Router 객체에 미들웨어를 설정할 수 있기 때문에 라우트 핸들링도 가능한 것이다. 그렇다면 진짜 사용자 정의 미들웨어도 달 수 있을까? 다음 코드를 한 번 봐보자.
router.use((req, res, next) => {
// 이 미들웨어는 사용자의 쿼리 문자열을 확인합니다
// /products 로 들어오는 모든 HTTP 요청이 관리자만 가능하다고 가정해 다음 코드를 작성합니다.
if (req.query.isAdmin) {
// 관리자 쿼리인경우
next();
} else {
res.send('You are not an admin!!!');
}
});
Router 객체가 하나의 application처럼 동작하기 때문에 위와 같은 미들웨어도 작동한다.
어떤 URL 이하는 모두 권한이 있는 사용자만 들어올 수 있게 처리할 수 있게 된 것이다!
이제 아래처럼 main.js도 변경해주면 깔끔하게 라우터를 활용해 라우팅을 할 수 있다.
// main.js
const express = require('express');
const app = express();
const productRouter = require('./router');
app.use('/product', productRouter); // 왜 이렇게 써야하는지는 참조 자료를 확인해주세요.
app.listen(3000);
결과
과정 확인.
참고자료
https://expressjs.com/ko/4x/api.html#router
Express 4.x - API 참조
Express 4.x API express() Creates an Express application. The express() function is a top-level function exported by the express module. var express = require('express') var app = express() Methods express.json([options]) This middleware is available in Ex
expressjs.com