본문 바로가기

공부 정리/NodeJs

데이터베이스를 사용해 API 요청하기

728x90
반응형

*개요

지난 시간, 노드의 ORM인 sequelize를 공부했습니다. 이를 바탕으로 배열로 만들어 둔 API 요청을 sqlite를 이용해서 만들어 보겠습니다. 

 

 

* sequelize로 개선하기

 

//models.js

const Sequelize = require('sequelize');
const sequelize = new Sequelize({
    dialect: 'sqlite',
    storage: './db.sqlite',
    logging: false
});

const User = sequelize.define('User', {
    //name: Sequelize.STRING //varchar255
    name: {
        type: Sequelize.STRING,
        unique: true
    }
});

module.exports = {Sequelize, sequelize, User};

 

sequelize를 정의했던 models.js를 다시한번 복습합니다.

sequelize 객체를 만들어 sqlite 저장소 이용과 db.sqlite 파일 생성을 설정했습니다.

또한, name을 변수로 가지는 User 객체를 만들었습니다.

 

1. GET /users

 

//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();
    }

    models.User
        .findAll({
            limit: limit
        })
        .then(users => {
            res.json(users);
        });
};

 

시작은 models.User입니다. 외부모듈로 가져온 models에서 User를 이용한다는 의미입니다.

findAll로 모두 조회하며, limit으로 갯수를 정해줍니다. .then을 통해 json으로 리턴합니다.

 

2. GET /users/:id

 

const show = function(req, res){
    const id = parseInt(req.params.id, 10);
    if(Number.isNaN(id)) {
        return res.status(400).end();
    }

    models.User.findOne({
        where: {
            id: id
        }
    }).then(user => {
        if(!user) return res.status(404).end();
        res.json(user);
    });
}

 

시작은 models.User입니다. 이번에는 findAll이 아닌 1개만 이용하므로 findOne을 사용합니다.

where로 조건을 걸어줍니다. 마찬가지로 then을 통해서 해당하는 user를 json으로 리턴합니다.

 

3. DELETE /users/:id

 

const destroy = (req, res) => {
    const id = parseInt(req.params.id, 10);
    if(Number.isNaN(id)) return res.status(400).end();

    models.User.destroy({
        where: {id}
    }).then(() => {
        res.status(204).end();
    });
}

 

시작은 models.User입니다. 삭제는 destroy로 합니다. 삭제할 데이터를 정하기 위해서 where절을 사용합니다.

then으로 결과를 리턴합니다.

 

4. POST /users

 

const create = (req,res) => {
    const name = req.body.name;
    if(!name) return res.status(400).end();

    models.User.create({name})
    .then(user => {
        res.status(201).json(user);
    }).catch(err => {
        if(err.name === 'SequelizeUniqueConstraintError') {
            return res.status(409).end();
        }
        return res.status(500).end();
    });
}

 

시작은 models.User입니다. 생성이므로 create를 사용하며, name을 담습니다.

혹여나 예외가 발생할 수 있으므로 catch로 확인하고, unique: true를 설정했으므로 예외가 발생하면 중복을 리턴합니다.

 

5. PUT /users/:id

 

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();

    models.User.findOne({where: {id}})
        .then(user => {
            if(!user) return res.status(404).end();

            user.name = name;
            user.save()
                .then(user => {
                    res.json(user);
                })
                .catch(err => {
                    if(err.name === 'SequelizeUniqueConstraintError') {
                        return res.status(409).end();
                    }
                    return res.status(500).end();
                });
        });

    res.json(user);
}

 

시작은 models.User입니다. PUT은 먼저 저장된 데이터를 찾고 변경해야 하기 때문에 가장 깁니다.

먼저 findOne으로 원하는 데이터를 찾아서 user의 name을 변경합니다. 저장은 save()를 통해서 하며

예외가 발생했을 때 처리하기 위해 catch를 사용합니다.

 

728x90
반응형

'공부 정리 > NodeJs' 카테고리의 다른 글

노드 ORM 시퀄라이저  (0) 2022.01.17
라우터 컨트롤러 함수로 분리  (0) 2022.01.17
TDD로 API 서버 개발하기  (0) 2022.01.15
mocha, should, supertest 사용하기  (0) 2022.01.15
강의 후기  (0) 2022.01.15