깊은 라우팅
스크랩모듈을 만든 후 이를 서버형태로 제공하여 공식적으로 제공하는 REST API처럼 만들고 싶었다. 그러다 보니 평소보다 더 깊은 단계의 라우팅이 필요해졌다.
https://songnumberbook.ga:5000/v1/search/title
스크랩 서버에 title 검색을 요청하고 싶다면 위의 주소로 get 요청을 보내야 하도록 만들고 싶었다. 이를 위해선 v1, search에 2가지 라우터가 필요하다. 이는 다음과 같이 만들 수 있다.
//scrap-server/index.js
const express = require('express');
const v1Router = require('./routes/v1/index');
const app = express();
app.use('/v1', v1Router);
//...생략
먼저 /v1경로는 v1라우터를 만들어 연결시킨다.
//scrap-server/routes/v1/index.js
const express = require('express');
const searchRouter = require('./search');
const router = express.Router();
router.use('/search', searchRouter);
module.exports = router;
v1라우터에서 다시 라우터를 만들고 이를 또다른 라우터와 위와 같이 연결시킨다.
//scrap-server/routes/v1/search.js
const express = require('express');
const searchController = require('../../contollers/search');
const router = express.Router();
router.get('/title', searchController.getSongsByTitle);
router.get('/singer', searchController.getSongsBySinger);
module.exports = router;
search에서 드디어 endpoint에 도달하였으므로 path에 따라 적절한 컨트롤러와 메소드에 연결시키면 끝이다!
사실 스크랩 서버는 결과 조회만 하는 서버이므로 v1라우터에서 search라우터를 거치지 않고 바로 '/v1/search' 경로로 라우팅시켜도 되었을 것이다. 그러나 이달의 신곡이나 노래방인기차트 등도 제공할 수 있도록 프로젝트가 확장된다면 그들은 /v1/search 경로에서 처리하는 것이 아니라 다른 경로로 보내는 것이 직관적일 것이다.
비슷한 이유로 /v1 경로도 사실 당장은 필요없어 보이지만 스크랩서버에 큰 변동이 있어 버전 2를 새롭게 만들어야하는 상황이 온다면 원본을 바꾸기 보단 v2로 분기하는 것이 더 좋아 보인다. 왜냐하면 기존 버전의 API를 이미 쓰고 있는 다른 클라이언트가 있을 수 있고, 기존 버전을 더 선호하는 클라이언트도 있을 수 있기 때문이다. 따라서 경로를 통해 API의 버전관리를 굳이 만들어 놓은 것이다.