ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [first project] sequelize로 데이터베이스 다루는 법
    project 2022. 4. 10. 08:50
    반응형

    사용하고자 하는 백엔드 폴더에(e.g. /server) sequelize를 설치했다는 가정 하에 진행한다.

     

    초기화 작업

    sequelize init

     

    초기화를 진행하면 아래와 같은 폴더와 파일들이 생성된다.

    .
    |-- README.md      
    |-- config
    |   `-- config.json
    |-- migrations     
    |-- models
    |   `-- index.js   
    |-- package.json   
    |-- seeders        
    `-- yarn.lock
    • config : 데이터베이스 설정 파일, 사용자 이름, DB 이름, 비밀번호 등의 정보
    • migrations : git과 비슷하게, 데이터베이스 변화하는 과정들을 추적해나가는 정보로, 실제 데이터베이스에 반영할 수도 있고 변화를 취소할 수도 있다.
    • models : 데이터베이스 각 테이블의 정보 및 필드타입을 정의하고 하나의 객체로 모은다.
    • seeders : 테이블에 기본 데이터를 넣고 싶은 경우에 사용한다.

     

    이제 각 폴더 및 파일들에 대해 살펴봅시다.

    우선 mysql에 접속해 데이터베이스를 생성하고 선택한다. 이 과정에 대한 정보를 config.json에서 수정하면 된다.

    mysql -u root -p // 입력 후 비밀번호 입력
    create database testDB;
    use testDB;

     

    config.json의 파일들 중 development, test, production 모두 수정해준다. development의 수정 예시

    "development": {
      "username": "root",
      "password": "root",
      "database": "testDB",
      "host": "127.0.0.1",
      "dialect": "mysql",
      "operatorsAliases": false
    }

    모델 생성 후 데이터베이스에 반영하기

     

    sequelize CLI를 통해 모델을 생성할 수 있고 마이그레이션을 통해 실제 데이터베이스에 반영가능하다.
    User라는 모델을 생성해서 진행한다.

    sequelize model:generate --name User --attributes user_id:integer,user_name:string

     

    이 명령어를 실행하면 2개의 파일이 생성된다.

    // models/user.js
    
    'use strict';
    module.exports = (sequelize, DataTypes) => {
      const User = sequelize.define('User', {
        user_id: DataTypes.INTEGER,
        user_name: DataTypes.STRING
      }, {});
      User.associate = function(models) {
        // associations can be defined here
        // 모델에 있는 필드들의 타입을 정의하고 각 모델간의 관계를 설정하는 부분
      };
      return User;
    };
    // migrations/[타임스탬프]-create-user.js
    
    'use strict';
    module.exports = {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('Users', {
          id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
          },
          user_id: {
            type: Sequelize.INTEGER
          },
          user_name: {
            type: Sequelize.STRING
          },
          createdAt: {
            allowNull: false,
            type: Sequelize.DATE
          },
          updatedAt: {
            allowNull: false,
            type: Sequelize.DATE
          }
        });
      },
      down: (queryInterface, Sequelize) => {
        return queryInterface.dropTable('Users');
      }
    };

    -> 마이그레이션 파일이 생성되고 id , createdAt , updatedAt 필드가 자동으로 생성된다.
    여기서 
    up 프로퍼티는 실제 DB에 적용되는 부분이고 down 은 이 작업을 취소할 때 적용된다.


    여기선 
    user_id 를 primary key로 사용할 것이고 createdAt  updatedAt 이 필요없으니 이쪽을 수정하면된다.
    (** 단, 이렇게 하면 모델 부분도 primaryKey 를 수정해줘야 하고 timestamps 옵션도 추가해줘야 한다.)

    // models/user.js
    
    'use strict';
    module.exports = (sequelize, DataTypes) => {
      const User = sequelize.define('User', {
        user_id: {
          type: DataTypes.INTEGER,
          primaryKey: true   // <---------
        },
        user_name: DataTypes.STRING
      }, {
        timestamps: false    // <---------
      });
      User.associate = function(models) {
        // associations can be defined here
      };
      return User;
    };

     

    완료되었다면 실제 DB에 반영시키면 된다.

    sequelize db:migrate

     

    마이그레이션을 진행했다면 MYSQL CLI에서 테이블이 만들어진 것을 확인할 수 있다.

    DESC users;
    +-----------+--------------+------+-----+---------+----------------+
    | Field     | Type         | Null | Key | Default | Extra          |        
    +-----------+--------------+------+-----+---------+----------------+        
    | user_id   | int          | NO   | PRI | NULL    | auto_increment |        
    | user_name | varchar(255) | NO   |     | NULL    |                |        
    +-----------+--------------+------+-----+---------+----------------+

     

    마이그레이션을 취소하고 싶다면 undo만 추가하면 된다!

    sequelize db:migrate:undo

    CRUD

     

    이제 Users 테이블이 생성되었으니 기본 CRUD를 직접 실행해보는 단계이다.

     

    테스트를 하기 위해 루트에 index.js를 만들고 사용할 것이다.

    // index.js 상단에 작성
    
    const models = require("./models");

     

    Create (사용자 생성)

    // index.js
    
    models.User.create({
      user_name: "kimcoding"
    }).then(_ => console.log("User create!"));

    작성 후 DB의 결과

    +---------+-----------+
    | user_id | user_name |
    +---------+-----------+
    |       1 | kimcoding |
    +---------+-----------+

     

    Read (사용자 조회)

    // index.js
    
    models.User.findAll().then(console.log);

    콘솔에 찍힌 결과!

    Executing (default): SELECT `user_id`, `user_name` FROM `Users` AS `User`;
    [
      User {
        dataValues: { user_id: 1, user_name: 'kimcoding' },
        ....
      }
    ]

     

    Update (사용자 수정)

    수정할 부분을 먼저 찾고(findOne), 그 다음에 update를 작성한다.

    models.User.findOne({ where: { user_name: "kimcoding" }})
    .then(user => {
      if (user) {
        user.update({ user_name: "parkhacker" })
        .then(r => console.log("Data update!"));
      }
    });

    DB를 확인하면 이름이 바뀐 것을 확인할 수 있다.

    +---------+-----------+
    | user_id | user_name |
    +---------+-----------+
    |       1 | parkhacker|
    +---------+-----------+

     

     

    Delete (사용자 삭제)

    models.User.destroy({ where: { user_name: "kimcoding" }})
    .then(_ => console.log("Data was deleted!"));

     

    이상 기본적인 사용법과 CRUD 다루기에 대한 설명은 끝!!


     

    반응형
Designed by LEO.