포시코딩

[Sequelize] 세팅 및 사용방법 본문

Node.js

[Sequelize] 세팅 및 사용방법

포시 2022. 12. 20. 15:32
728x90

Sequelize란?

Node.js의 대표적인 ORM인 Sequelize는 MySQL, PostgreSQL, MariaDB 등 많은 RDBMS를 지원하고

Promise 기반으로 구현되었기 때문에 비동기 로직을 편리하게 작성할 수 있다.

MongoDB 사용할 때 Mongoose를 사용해봤다면 이해하기 쉬울것이다.

 

설치 및 세팅

DB 생성

npm i sequelize mysql2
npm i sequelize-cli -D
npx sequelize init

설치하면 아래와 같은 폴더구조가 생긴다.

내 프로젝트 폴더 이름
├── models
│   └── index.js
├── config
│   └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json
  • /models/index.js: 구현할 sequelize 모델을 편리하게 사용할 수 있게 해주는 파일
  • /config/config.json: 데이터베이스에 연결하기 위한 설정 데이터가 JSON 형식으로 들어가있다.

/confit/config.json파일에 들어가 dev 항목의 password와 host를 설정해준다.

그 후 아래 코드를 터미널에 입력하면

npx sequelize db:create

database_development라는 이름으로 db가 생성된다.

test, production으로 생성하고 싶다면 아래처럼 하면 된다.

NODE_ENV=test npx sequelize db:create
NODE_ENV=production npx sequelize db:create

 

모델 생성

npx sequelize model:generate --name User --attributes email:string,nickname:string,password:string

 

터미널에 위 명령어를 입력하게되면 migrations, models 폴더에 각각 user 관련 파일이 생성된다.

  • /migrations/user.js: 실제 데이터베이스 안의 user 정보
  • /models/user.js: Express에서 Sequelize를 통해 사용할 user 정보

 

모델 수정

자동으로 만들어준 id 대신 userId로 바꿔 사용해야 한다면 아래와 같이 수정해준다.

// (/models/user.js)

// ...생략
  // User.init({
  //   email: DataTypes.STRING,
  //   nickname: DataTypes.STRING,
  //   password: DataTypes.STRING
  // }, {
    User.init({
      userId: {
        primaryKey: true,
        type: DataTypes.INTEGER,
      },
      email: DataTypes.STRING,
      nickname: DataTypes.STRING,
      password: DataTypes.STRING
    }, {
// ...생략
// (/migrations/user.js)

// ...생략
await queryInterface.createTable('Users', {
      // id: {
      userId: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
// ...생략

 

테이블 생성

npx sequelize db:migrate

위와 같은 메시지가 출력되야 한다.

정상적으로 migration 파일을 통해서 table을 생성한 것을 볼 수 있다.

 

사용법

사용자 모델 불러오기

const { User } = require('./models');

/models/index.js 파일이 데이터베이스 연결 설정과 함께 Sequelize 모델 파일을 불러와서 다시 내보내주기 때문에

위의 코드처럼 사용자 모델을 사용해야 한다.

회원가입 예시

const { Op } = require('sequelize');
const { User } = require('./models');

// 회원가입
router.post('/users', async (req, res) => {
  const { nickname, email, password, confirmPassword } = req.body;

  if (password !== confirmPassword) {
    res.status(400).json({
      errorMessage: "패스워드가 패스워드 확인란과 일치하지 않습니다."
    });
    return;
  }

  const existUser = await User.findAll({
    where: {
      [Op.or]: [{ email }, { nickname }]
    }, 
  });

  if (existUser.length) {
    res.status(400).json({
      errorMessage: "Email이나 Nickname이 이미 사용중입니다."
    });
    return;
  }

  await User.create({ nickname, email, password });
  res.status(201).send({});
});
728x90