
🔗sequelize 공식문서
sequelize 메서드는 promise 를 반환하므로, 동기적으로 값을 반환하도록 async ~ await 을 잊지말고 사용해야한다.
const express = require('express');
const app = express();
const db = require('./models');
const { Member } = db;
app.use(express.json());
이하 예시들은 db 의 Members 테이블에서 Member 모델을 가져와 사용하는 예시이다.
테이블에 있는 모든 row들을 조회할 수 있다.
const members = await Member.findAll();
// 조건에 해당하는 Member row 조회
const teamMembers = await Member.findAll({ where: { "조건" } });
// 예시: 특정 team 멤버 전부 조회 또는 전체 멤버 조회
app.get('/api/members', async (req, res) => {
const { team } = req.query;
if (team) {
const teamMembers = await Member.findAll({
where: { team },
order: [['id', 'DESC']], // id 내림차순 정렬
});
res.send(teamMembers);
} else {
const members = await Member.findAll({ order: [['id', 'ASC']] });
res.send(members);
}
});
테이블에 있는 특정 row 하나를 조회할 때 사용한다.
const member = await Member.findOne({ where: { "조건" } });
보통 findOne 메소드는 id 컬럼처럼 특정 row의 고유값을 가진 컬럼을 그 조건으로 설정하는 경우가 많다.
만약 where 조건을 만족하는 row가 여러 개라면 가장 첫 번째 row 만 리턴한다.
// 예시 : 특정 member 조회
app.get('/api/members/:id', async (req, res) => {
const { id } = req.params;
const member = await Member.findOne({ where: { id } });
if (member) {
res.send(member);
} else {
res.status(404).send({
message: `Member with id ${id} not found~~!`,
});
}
});
테이블에 새로운 row를 추가할 때 사용한다.
const member = Member.build(newMember);
await member.save();
build 메소드로 하나의 row에 대응하는 모델 객체를 생성하고, 해당 모델 객체의 save 메소드를 호출한다.
create 메소드는 build + save 메소드를 한 번에 처리해준다.
await Member.create(newMember);
// 예시 : 새로운 멤버 추가
app.post('/api/members', async (req, res) => {
const newMember = req.body;
const member = Member.build(newMember);
await member.save();
res.send(member);
});
// create 메서드
app.post('/api/members', async (req, res) => {
const newMember = req.body;
const member = await Member.create(newMember);
res.send(member);
});
원하는 특정 row들을 수정하는 메소드이다
const arr = await Member.update(newInfo, { where: { ~ } });
보통 모든 row를 수정하는 경우는 많지 않기 때문에 where 조건을 설정해주는 게 좋다.
update 메소드가 리턴하는 Promise 객체는 그 작업 성공 결과로 배열 하나를 가지는데 해당 배열의 첫 번째 요소에는 갱신된 row 수가 담긴다.
request body 에는 수정이 필요한 { 키 : 값 } 만 담아서 보내면 된다.
// 예시 : 특정 멤버 정보 수정
app.put('/api/members/:id', async (req, res) => {
const { id } = req.params;
const newInfo = req.body;
const result = await Member.update(newInfo, { where: { id } });
if (result[0]) {
res.send({ message: `Member with id ${id} updated` });
} else {
res.status(404).send({
message: `Member with id ${id} not found~~!`,
});
}
});
update 메서드를 사용하지 않고 수정하려는 member 객체를 직접 수정해도 ORM에 의해서 db 의 Member 모델도 수정된다.
app.put('/api/members/:id', async (req, res) => {
const { id } = req.params;
const newInfo = req.body;
const member = await Member.findOne({ where: { id } });
if (member) {
Object.assign(member, newInfo);
res.send(member);
member.save();
} else {
res.status(404).send({
message: `Member with id ${id} not found~~!`,
});
}
});
원하는 row를 삭제하는 메소드이다.
const deletedCount = await Member.destroy({ where: { "조건" } });
destroy 메소드가 리턴하는 Promise 객체는 그 작업 성공 결과로 삭제된 row 수를 가진다.
// 예시 : 특정 멤버 삭제
app.delete('/api/members/:id', async (req, res) => {
const { id } = req.params;
const deletedCount = await Member.destroy({ where: { id } });
if (deletedCount) {
res.send({ message: `Member with id ${id} deleted` });
} else {
res.status(404).send({
message: `Member with id ${id} not found~~!`,
});
}
});
destory 메서드는 클래스의 static 메소드에도 있고, 인스턴스 객체에도 있다. 따라서 인스턴스 객체를 먼저 찾은 후 해당 row 에서 destory 메서드를 사용할 수도 있다.
app.delete('/api/members/:id', async (req, res) => {
const { id } = req.params;
const member = await Member.findOne({ where: { id } });
if (member){
const result = await member.destroy(); // member 인스턴스 객체의 메서드를 사용
res.send({ message: `${id} row deleted` })
} else {
res.status(404).send({ message : 'There is no member with the id!' })
}
});