태그
#TYPESCRIPT
#DB
#NODE
#SEEDING
#TYPEORM
2024년 1월 12일 15:41

1. 프로그래밍에서의 seeding이란?
Seeding은 데이터베이스에 초기 데이터 및 테스트 용 더미 데이터를 입력해주는 행위입니다.
Seeding에서 Seeder는 위와 같은 행동을 도와주는 도구라고 말할 수 있습니다.
노드 진영에서 seeding 할 수 있는 라이브러리들은 Sequelize와 TypeORM 등등이 있습니다.
오늘은 TypeORM에서의 seeding을 알아보겠습니다.
2. typeorm-extension 사용 방법
1️⃣ 설치
패키지를 프로젝트의 dependency에 추가해줍니다.
npm install typeorm-extension --save
bun install typeorm-extension --save
2️⃣ CLI 세팅
설치가 완료된 후, CLI을 설정해줍니다. typeorm-extension
에는 4가지의 명령을 사용할 수 있습니다.
/* package.json */
"scripts": {
"db:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:create",
"db:drop": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:drop",
"seed:run": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed:run",
"seed:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed:create"
}
db:create
- 데이터베이스 생성db:drop
- 데이터베이스 삭제seed:run
- 데이터베이스 seedingseed:create
- 새로운 seeder 생성
저희는 이중에서 seed:run
를 추가해줍니다.
3️⃣ 프로젝트 세팅
파일의 위치는 다음을 통해 지정할 수 있습니다.
-
environment
변수TYPEORM_SEEDING_SEEDS=src/database/seeds/**/*{.ts,.js}
-
data-source.ts
파일import { DataSource, DataSourceOptions } from 'typeorm'; import { SeederOptions } from 'typeorm-extension'; const options: DataSourceOptions & SeederOptions = { type: 'better-sqlite', database: 'db.sqlite', seeds: ['src/database/seeds/**/*{.ts,.js}'], factories: ['src/database/factories/**/*{.ts,.js}'] }; export const dataSource = new DataSource(options);
-
runSeeder(s)
메소드 옵션 파라미터import { DataSource, DataSourceOptions } from 'typeorm'; import { runSeeders, SeederOptions } from 'typeorm-extension'; (async () => { const options: DataSourceOptions = { type: 'better-sqlite', database: 'db.sqlite', }; const dataSource = new DataSource(options); await dataSource.initialize(); runSeeders(dataSource, { seeds: ['src/database/seeds/**/*{.ts,.js}'], factories: ['src/database/factories/**/*{.ts,.js}'] }); })();
기본 경로는 다음과 같습니다.
src/database/seed/**/*{.ts,.js}
우리는 따로 설정하지 않고, 기본 경로를 사용할 것입니다.
아래와 같이 데이터 베이스 설정 파일을 추가해줍니다.
src/database/data-source.ts
import { DataSource } from 'typeorm';
export default new DataSource({
type: 'mysql',
host: process.env.DATABASE_HOST,
port: parseInt(process.env.DATABASE_PORT),
database: process.env.DATABASE,
username: process.env.USERNAME,
password: process.env.PASSWORD,
synchronize: false,
});
4️⃣ Seeding
본격적으로 seeding을 해봅시다. seeding을 하기 위해 간단한 엔티티를 하나 만들어줍니다.
src/entities/user.ts
import {
Entity,
PrimaryGeneratedColumn,
Column
} from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
firstName: string
@Column()
lastName: string
@Column()
email: string
}
이번에는 seeder를 생성해주겠습니다. 이 seede는 cli 명령으로 호출할 수 있습니다.
import { Seeder, SeederFactoryManager } from 'typeorm-extension';
import { DataSource } from 'typeorm';
import { User } from './user';
export default class UserSeeder implements Seeder {
public async run(
dataSource: DataSource,
factoryManager: SeederFactoryManager
): Promise<any> {
const repository = dataSource.getRepository(User);
await repository.insert([
{
firstName: 'Caleb',
lastName: 'Barrows',
email: 'caleb.barrows@gmail.com'
}
]);
}
}
seeder 클래스에는 Seeder
를 상속받고 run
함수를 구현해주어야합니다.
이후, cmd에서 아래 명령어를 실행해주면 데이터베이스에 정상적으로 데이터가 삽입되어있는 것을 볼 수 있습니다.
npm run seed:run
5️⃣ 기타
- 본문에서 다루지 않은 가짜 더미 데이터를 생성해주는 Factory 기능이 존재합니다.
- 꼭 엔티티가 필요한 것이 아닙니다. DataSource 객체에서 queryRunner을 얻어, orm이 필요없는 plain한 쿼리를 실행할 수 있습니다.
감사합니다!