목차

1. 프로그래밍에서의 seeding이란?

2. typeorm-extension 사용 방법

1️⃣ 설치

2️⃣ CLI 세팅

3️⃣ 프로젝트 세팅

4️⃣ Seeding

5️⃣ 기타

태그

#TYPESCRIPT

#DB

#NODE

#SEEDING

#TYPEORM

TypeORM의 Seeding

2024년 1월 12일 15:41

54-thumbnail-image

1. 프로그래밍에서의 seeding이란?

Seeding은 데이터베이스에 초기 데이터 및 테스트 용 더미 데이터를 입력해주는 행위입니다.

Seeding에서 Seeder는 위와 같은 행동을 도와주는 도구라고 말할 수 있습니다.

노드 진영에서 seeding 할 수 있는 라이브러리들은 SequelizeTypeORM 등등이 있습니다.

오늘은 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 - 데이터베이스 seeding
  • seed: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한 쿼리를 실행할 수 있습니다.

감사합니다!