*개요
이전에 index.js에 라우팅 관련 모든 정보들을 썼습니다. 하지만 모든 코드를 한 파일에 넣는 것은 가독성이 떨어지고 유지보수가 쉽지 않습니다. 따라서, 이번에 유저 관련 API를 user 폴더에 분리하고 controller도 따로 보관합니다.
api/user/index.js
const express = require("express");
const router = express.Router();
const ctrl = require("./user.ctrl");
router.get("/", ctrl.index);
router.get("/:id", ctrl.show);
router.delete("/:id", ctrl.destory);
router.post("/", ctrl.create);
router.put("/:id", ctrl.update);
module.exports = router;
express의 Router를 이용해서 기존의 app.get(), app.post(), app.put(), app.delete()를 개선합니다.
외부모듈로 만든 ctrl을 이용해 각 요청을 controller라는 또다른 파일에서 처리하도록 합니다.
index.js 파일은 클라이언트의 요청에 따라 처리를 중계해주는 라우팅의 역할을 합니다.
여기서는 내부로직을 알 수가 없습니다. 단지 경로에 따라 처리하도록 안내해줍니다.
//api/user/user.ctrl.js
//api 로직
const models = require("../../models");
const index = function(req, res) {
req.query.limit = req.query.limit || 10;
const limit = parseInt(req.query.limit, 10);
if(Number.isNaN(limit)) {
return res.status(400).end();
}
return res.json(users.slice(0, limit));
};
const show = function(req, res){
const id = parseInt(req.params.id, 10);
if(Number.isNaN(id)) {
return res.status(400).end();
}
const user = users.filter((user) => user.id === id)[0];
if(!user) return res.status(404).end();
return json.(user);
}
const destroy = (req, res) => {
const id = parseInt(req.params.id, 10);
if(Number.isNaN(id)) return res.status(400).end();
users = users.filter(user => user.id !== id);
res.status(204).end();
}
const create = (req,res) => {
const name = req.body.name;
if(!name) return res.status(400).end();
const isConflicted = users.filter(user => user.name === name).length;
if(isConflicted) return res.status(409).end();
const user = {id, name};
users.push(user);
return res.status(201).json(user).end();
}
const update = (req, res) => {
const id = parseInt(req.params.id, 10);
if(Number.isNaN(id)) return res.status(400).end();
const name = req.body.name;
if(!name) return res.status(400).end();
const user = users.filter(user => user.id === id)[0];
if(!user) return res.status(404).end();
const isConflicted = users.filter(user => user.name === name).length;
if(isConflicted) return res.status(409).end();
user.name = name;
res.json(user);
}
module.exports = {
index, show, destroy, create, update
}
기존에 app.get(), app.post(), app.put(), app.delete()로 만들었던 요청들을 각각 이름을 가진 함수로 만들어줍니다.
이렇게 만든 이름들을 외부 모듈로 빼서, index.js 파일에서 라우팅할 때 식별하는 이름으로 사용합니다.
* user에 대한 테스트코드는 api/user/user.spec.js 로 옮깁니다.
*정리
index.js 하나의 파일에 작성했던 코드들을 express의 라우팅을 통해 분리합니다.
라우팅은 요청에 따른 처리를 안내해주는 중계이며, 내부 로직은 모릅니다.
내부 로직은 controller파일에 따로 만들 수 있습니다.
반응형
'학습 > Node.js' 카테고리의 다른 글
데이터베이스를 사용해 API 요청하기 (0) | 2022.01.17 |
---|---|
노드 ORM 시퀄라이저 (0) | 2022.01.17 |
TDD로 API 서버 개발하기 (0) | 2022.01.15 |
mocha, should, supertest 사용하기 (0) | 2022.01.15 |
강의 후기 (0) | 2022.01.15 |