• 개요

    <aside> 💡 Sequelize란?

    • 관계형 데이터베이스를 위한 node.js 용 ORM
    • ORM(Object Relational Mapping) : SQL 대신 DB와 코드로 쿼리문을 작성하여 소통할 수 있게 해주는 언어

    </aside>

    • sequelize seeder?

    기능 개발 도중 테스트를 하기 위해 데이터가 필요할 때가 있다.

    그럴 때마다 그때 그때 DB에 데이터를 넣으면 귀찮으니까 한 번에 정해진 가짜 데이터를 넣어주는 것

  • Seeder 생성 방법

    //백엔드 프로젝트 내에 seeders 폴더가 없을 경우
    $ npx sequelize init:seeders 
    
    $ npx sequelize seed:generate --name <파일명>
    //seeders 폴더 내에 <timestamp>-<파일명>.js 파일이 생성된다.
    
    • seed 파일 내부 구조

      • up : seeder를 통해 생성할 데이터를 만드는 코드
      • down : 생성한 데이터를 되돌리는(삭제하는) 코드
      // 생성된 seeder 파일.js
      
      "use strict";
      
      module.exports = {
        up: async (queryInterface, Sequelize) => {
          /**
           * Add seed commands here.
           *
           * Example:
           * await queryInterface.bulkInsert('People', [{
           *   name: 'John Doe',
           *   isBetaMember: false
           * }], {});
           */
        },
      
        down: async (queryInterface, Sequelize) => {
          /**
           * Add commands to revert seed here.
           *
           * Example:
           * await queryInterface.bulkDelete('People', null, {});
           */
        },
      };
      
    • 데이터를 작성할 때, 컬림이나 데이터 타입이 일치하도록 주의해서 관련 테이블 정보를 확인 후 참고해서 작성

      → seeder 파일 생성 순서도 종속관계에 맞게 생성해야한다. ex) lesson 테이블에서 user_id를 Foreign key로 가지고 있다면 user 시드파일 생성(ex) 20211217000001-user.js)이 lesson 시드파일 생성(20211217000002-lesson.js)보다 먼저 선행되어야 한다.

  • 생성한 Seeder 파일 실행

    // 파일 하나만 실행
    $ npx sequelize db:seed --seed <파일명>
    
    // 모든 seeder 파일 실행
    $ npx sequelize db:seed:all
    
    // 모든 seeder 데이터 되돌리기
    $ npx sequelize db:seed:undo:all
    
  • 위 명령어를 실행하니까 아래와 같은 에러가 난다!

    Untitled

    • sequelize가 각 config, migrations, models, seeders 등의 폴더를 읽어오는 경로가 설정되지 않아서 생기는 에러

      →해당 root 경로에 .sequelizerc 파일을 만들어주면 된다.

    //.sequelizerc
    
    const path = require('path');
    
    module.exports = {
      config: path.resolve('./src/config', 'config.ts'),
      'migrations-path': path.resolve('./src/migrations'),
      'models-path': path.resolve('./src/models'),
      'seeders-path': path.resolve('./src/seeders'),
    };
    
    • 그러고 다시 명령어 실행하면 이번엔 다른 에러가 난다.

    Untitled

       → config.ts는 ES6 문법(import, export)을 사용하는데 sequelize는 commonJS(require, module.export)를 사용해서 충돌이 나기 때문
    

    → .sequelizerc 를 컴파일할 때 ts-node가 불러와지도록 한줄을 추가해주면 해결

    // .sequelizerc
    
    require('ts-node').register({ /* options */ });
    const path = require('path');
    
    module.exports = {
      config: path.resolve('./src/config', 'config.ts'),
      'migrations-path': path.resolve('./src/migrations'),
      'models-path': path.resolve('./src/models'),
      'seeders-path': path.resolve('./src/seeders'),
    };
    
    • 인줄 알았는데........

    Untitled

    이 에러가 해결이 도저히 안된다.......

    → 위에서 한줄 추가해줬는데도 config.ts 파일의 export 구문을 sequelize가 완벽히 읽어오지 못했고, config.ts 내부에 dialect: ‘mariadb’를 작성해주지 않아서 생겼던 오류.

    // config.ts
    
    import * as dotenv from 'dotenv';
    dotenv.config();
    
    const development = {
      host: process.env.DB_HOST,
      port: parseInt(process.env.DB_PORT!, 10),
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      dialect: 'mariadb',
      // test: {},
      // production: {},
    };
    
    module.exports = { development };
    

    이렇게 바꿔주니 제대로 읽어오고 잘 실행된다!!!