본문 바로가기
학습/Node.js

라우터 컨트롤러 함수로 분리

코동이 2022. 1. 17.

*개요

 

이전에 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