[node.js] sequelize 주요 메서드

iberis2·2024년 2월 11일
post-thumbnail

🔗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 모델을 가져와 사용하는 예시이다.

1. findAll(options?: object)

테이블에 있는 모든 row들을 조회할 수 있다.

  • options 안에 특정 조건(where), 정렬 기준(order) 등을 설정하여 조회할 수 있다.
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);
  }
});

2. findOne(options?: object)

테이블에 있는 특정 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~~!`,
    });
  }
});

3. build, save, create

테이블에 새로운 row를 추가할 때 사용한다.

const member = Member.build(newMember);
await member.save();

build 메소드로 하나의 row에 대응하는 모델 객체를 생성하고, 해당 모델 객체의 save 메소드를 호출한다.

  • build 메소드는 다른 메소드들과 다르게 비동기 실행 함수는 아니기 때문에 앞에 await을 붙여줄 필요가 없다.

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

4. update(value: object, options?: object)

원하는 특정 row들을 수정하는 메소드이다

const arr = await Member.update(newInfo, { where: { ~ } });

보통 모든 row를 수정하는 경우는 많지 않기 때문에 where 조건을 설정해주는 게 좋다.

update 메소드가 리턴하는 Promise 객체는 그 작업 성공 결과로 배열 하나를 가지는데 해당 배열의 첫 번째 요소에는 갱신된 row 수가 담긴다.

request body 에는 수정이 필요한 { 키 : 값 } 만 담아서 보내면 된다.

  • 수정이 필요 없는 값들 ( 예를 들어 phone 만 변경이 필요한 경우 id, name 등)은 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~~!`,
    });
  }
});

5. destroy(options?: object) 메소드

원하는 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!' })
  }
  
});
profile
React, Next.js, TypeScript 로 개발 중인 프론트엔드 개발자

0개의 댓글