개요
<aside> 💡 Sequelize란?
</aside>
기능 개발 도중 테스트를 하기 위해 데이터가 필요할 때가 있다.
그럴 때마다 그때 그때 DB에 데이터를 넣으면 귀찮으니까 한 번에 정해진 가짜 데이터를 넣어주는 것
Seeder 생성 방법
//백엔드 프로젝트 내에 seeders 폴더가 없을 경우
$ npx sequelize init:seeders
$ npx sequelize seed:generate --name <파일명>
//seeders 폴더 내에 <timestamp>-<파일명>.js 파일이 생성된다.
seed 파일 내부 구조
// 생성된 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
위 명령어를 실행하니까 아래와 같은 에러가 난다!
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'),
};
→ 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'),
};
이 에러가 해결이 도저히 안된다.......
→ 위에서 한줄 추가해줬는데도 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 };
이렇게 바꿔주니 제대로 읽어오고 잘 실행된다!!!