*개요
지난 시간, 노드의 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를 사용합니다.
'학습 > Node.js' 카테고리의 다른 글
노드 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 |