본문 바로가기

Node.js/node sequelize

Node Sequelize ORM 다루기 - DB 생성및 테이블 생성하기

Sequelieze는 Node에서 사용하는 ORM이다.

 

여기서 ORM 이란?

 

ORM은 Object Relational Mapping의 약자로써 OOP(Object Oritented Programming)에서 객체로 구현한 부분을 DB와 자동으로 매핑해주는 것을 의미해준다.

ORM을 사용하게 되면 객체 지향적인 코드를 작성할수 있게 되고 이를 통해 재사용성및 유지보수, 리팩토링이 증대된다. 

 

해당 글에서는 mysql을 활용해서 sequelize와 mapping을 진행할 예정입니다. 

 

 

기본툴은 vscode를 사용합니다. 

npm init

먼저 npm init 명령어를 통해 package.json을 생성해준다. 

 

 

그다음 

 npm i sequelize mysql2 express 

 

sequelize, mysql2, express 를 다운받아 준다. 

  • sequelize orm인 sequelize를 받아온다
  • sequelize에서 mysql을 사용하기 때문에 다운해준다
    (mysql이 아니라 mysql2인 이유는 mysql2가 Promise 기반을 지원하기 때문이다)
  • express Node의 대표적인 웹 프레임워크 

위와같이 다운을 받아주면 일단 1차적으로는 준비가 완료되었다.

이제 기본 폴더 구조를 잡아줘야하는데 sequelize에서는 관계형 설정에 대한 기본적인 부분들을 

명령어를 통해 자동으로 구조를 잡아 줄 수 있게끔 지원해주고 있다.

 

npx sequelize init

명령어를 입력하게 되면 

 

위와같이 폴더 구조를 알아서 생성해준다. 

 

config/config.json

{
  "development": {
    "username": "root", 
    "password": "root", 
    "database": "sequelize-study",
    "host": "127.0.0.1", 
    "dialect": "mysql" 
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

운영하는 버전에 따라 값을 세팅할 수 있다.  기본적으로 development로 되어있다. 

 

  • "username": "root", //DB 접속 아이디, mysql 아이디
  • "password": "root", //DB 접속 비밀번호, mysql 비밀번호
  • "database": "database_development", //DB 스키마의 이름, 원하는대로 생성하면된다
  • "host": "127.0.0.1", // DB 주소
  • "dialect": "mysql" // dialect는 방언이라는 뜻으로써 각 DB마다 고유 기능을 사용할 때 정의한다. 

 

 

이제 위 config에 setting을 다 해주었다면 연결 셋팅은 마무리 된것이다.

 

위에 정의한 sequelize-study를 db로 만들어 줄것이다.

 

스키마 생성하기 

 

npx sequelize db:create

db:create 를 활용하게 되면 DB스키마를 mysql에서 생성하지 않더라도 명령어 한줄로 생성해줄 수 있다. 

 

 

스키마가 정상적으로 생성되었다.

DB를 생성하였으니 이제 테이블을 생성할 차례다. 

 

테이블 생성하기 

 

먼저 Model을 생성해준다.

 

npx sequelize model:generate --name 테이블 이름 --attributes 컬럼이름

위와 같이 모델을 정의 할 수 있는데  ,를 붙이는 경우에는 띄어쓰지 않고 만들어야 정상적으로 생성이된다. 

npx sequelize model:generate --name user --attributes name:string,email:string

 

  

model:genreate를 통해 model을 만들게 되면 두가지 파일이 생성이 된다.

 

  • migration file- 해당 file을 기반으로 DB 테이블을 생성및 변경한다. 
  • model file- DB와 객체형을 매핑해주기 위해 나타내 주는 file 

 

 

 

 

mirgations 폴더에 생성된 파일에 들어가보면 위와 같이

 

up, down으로 정의되어있는 메소드 들이 있다

npx sequelize db:migrate

up의 메소드를 실행한다. (한번 정의하면 migrate:undo를 해서 상태를 돌리기 전까지는 돌릴 수 없다)

 

npx sequelize db:migrate:undo

down의 메소드를 실행한다. 위 사진에서는 table을 삭제하는 함수가 들어있다. 

 

 

migration을 진행해준다. 

npx sequelize db:migrate

 

 

이제 DB를 확인해 보면 table은 생성이 되었는데 만들지 않은 sequelizemeta 테이블과 users 테이블이 정의 된것을 확인할 수 있다. 

 

또한 user 테이블을 보게 되면 이상한점이 몇가지 있다. 

  • user 이라고 model을 정의했는데 users라고 테이블이 생성되었다.
    - seqeulize는 기본적으로 테이블을 복수형으로 정의한다.
  • id가 생성되어있다 
    - sequelize는 기본적으로 auto increment 되는 primary key id를 넣어준다.
  • createdAt/updatedAt이 정의되어있다. 
    - sequelize는 기본적으로 createdAt/updatedAt 이 정의되서 들어간다.

위의 바뀌어서 들어간 설정들은 모두 설정을 통해 제어해 줄수 있다. 

 

 

성공적으로 테이블이 만들어졌다. 

 

또한 정의하지 않은 sequelizemeta 테이블이 정의되어있다. 

sequelize-meta

sequliezemeta는 migrate를 하게 되면 위 db에 파일이름이 올라가서 두번이상 마이그레이션이 진행되지 않게 막아준다

(migrate:undo 를 실행하게 되면 위 name은 삭제 된다. 그래서 다시 마이그레이션이 가능하다.)

 

테이블에 컬럼 추가하기 

테이블을 만들더라도 운영중에 테이블내 컬럼들은 수없이 수정하고 지우게 될  일들이 생기게 된다. 

이를 위해 migration을 활용하면 table에 column들을 추가해줄 수 있게 된다. 

 

npx sequelize migration:generate --name 이름 

위 명령어를 통해 생성하게 되면 비어있는 migration 파일을 생성할 수 있게 된다. 

 npx sequelize migration:generate --name addpassowrd

 

 

 

이제 위에 바꾸게 될 명령어들을 넣어주면된다.

 

 //추가
 await queryInterface.addColumn('테이블이름', '컬럼이름',{
      type: Sequelize.  
 })
 
 //삭제 
 await queryInterface.removeColumn("테이블이름", "컬럼이름");
 

위와 같은 방식으로 넣어주면 컬럼을 추가하고 삭제할 수 있다. 

 

"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.addColumn("users", "password", {
      type: Sequelize.STRING,
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn("users", "password");
  },
};

위와같이 코드를 정의하고 나서 다시 마이그레이션을 진행해준다.

 

 

 

 

마이그레이션을 하고나서 주의해야할 상황은 마이그레이션을 진행헀다고 하더라도

model파일은 자동으로 적용이 되어있지 않다.

 

따라서 model파일도 다시 수정해 줘야 한다. 

 

user.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class user extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  };
  user.init({
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
  }, {
    sequelize,
    modelName: 'user',
  });
  return user;
};

 

 

 

더미 데이터 넣기 

sequelize는 seeders라는 기능을 통해 더미 데이터를 넣어주는 기능 또한 존재한다. 

 

 

npx sequelize seed:generate --name 이름

위와같은 명령어를 통해 seed를 만들어 보겠다

 

npx sequelize seed:generate --name user

 

seeder도 mirgration과 같이 up과 down으로 이루어져 있다. 

 

 

"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert("users", [
      {
        name: "test1",
        email: "tes2t@test.com",
        password: "@!DKJ@#!JK!@KJ132",
        createdAt: new Date(),
        updatedAt: new Date(),
      },
      {
        name: "test2",
        email: "test2@test.com",
        password: "@!DKJ@#!JK!@KJ132",
        createdAt: new Date(),
        updatedAt: new Date(),
      },

      {
        name: "test3",
        email: "test3@test.com",
        password: "@!DKJ@#!JK!@KJ132",
        createdAt: new Date(),
        updatedAt: new Date(),
      },
    ]);
  },

  down: async (queryInterface, Sequelize) => {
    await  queryInterface.bulkDelete('users', null, {});
    /**
     * Add commands to revert seed here.
     *
     * Example:
     * await queryInterface.bulkDelete('People', null, {});
     */
  },
};

위와같이 더미 데이터를 작성해주고  

 

npx sequelize db:seed:all   

 

위 명령어를 통해 db에 더미 데이터를 넣어준다. 

 

 

 

 

여기까지 진행하게 되면 sequelize를 활용하여 DB생성, 테이블 생성및 컬럼 추가하기, 더미데이터까지 완료되었다. 

 

다음에는 sequelieze를 활용해서 외래키 생성 및 관계형 설정, express를 연동해서 데이터 받아오기에 대해 진행 할 예정이다. 

 

loy124.tistory.com/374

 

Node Sequelize ORM 다루기 - 외래키 생성하기, 관계형 설정하기

loy124.tistory.com/373 Node Sequelize ORM 다루기 - DB 생성및 테이블 생성하기 Sequelieze는 Node에서 사용하는 ORM이다. 여기서 ORM 이란? ORM은 Object Relational Mapping의 약자로써 OOP(Object Oritented..

loy124.tistory.com