본문 바로가기
NestJS

[NestJS] 데이터 시딩 - 50만건 더미 데이터 추가하기

by Programmer.Junny 2025. 5. 8.

SQL로 데이터를 가공하여 불러올 때, 성능이 어느정도인지 퍼포먼스 테스트를 해야 이후 최적화를 하더라도 얼만큼 개선이 되었는지 확인할 수 있다.

데이터를 넣는 방법에는 여러 가지가 있지만, 패키지를 통해 데이터 시딩을 하면 빠른 속도로 더미 데이터를 입력할 수 있다. 

1. 패키지 설치

npm install --save-dev typeorm-extension @faker-js/faker ts-node tsconfig-paths dotenv

2. 루트에 data-source.ts 추가

// data-source.ts
import 'dotenv/config';
import { DataSource, DataSourceOptions } from 'typeorm';
import { SeederOptions } from 'typeorm-extension';

// 엔티티 임포트 (NestJS 코드 구조에 따라 경로 조정)
import { PostsModel } from './src/posts/entity/posts.entity';
import { UsersModel } from './src/users/entity/users.entity';
import { ImageModel } from './src/common/entity/image.entity';
import { ChatsModel } from './src/chats/entity/chats.entity';
import { MessagesModel } from './src/chats/messages/entity/messages.entity';
import { CommentsModel } from './src/posts/comments/entity/comments.entity';
import { UserFollowersModel } from './src/users/entity/user-followers.entity';

const options: DataSourceOptions & SeederOptions = {
  type: 'postgres',
  host: process.env.DB_HOST     || 'localhost',
  port: Number(process.env.DB_PORT)     || 5432,
  username: process.env.DB_USERNAME || 'postgres',
  password: process.env.DB_PASSWORD || 'postgres',
  database: process.env.DB_DATABASE || 'postgres',

  synchronize: true,

  entities: [
    PostsModel,
    UsersModel,
    ImageModel,
    ChatsModel,
    MessagesModel,
    CommentsModel,
    UserFollowersModel,
  ],

  // 시더(Seeder)와 팩토리(Factory) 위치 지정
  seeds:    ['src/database/seeds/**/*{.ts,.js}'],
  factories:['src/database/factories/**/*{.ts,.js}'],
};

export default new DataSource(options);

DB 커넥션은 기존의 AppModule에 설정한 TypeOrmModule.forRootAsync() 로는 읽지 못한다.

그래서 위와 같은 '시딩'만을 위한 설정을 추가한다.

3. 팩토리 정의

import { setSeederFactory } from 'typeorm-extension';
import { PostsModel } from '../../posts/entity/posts.entity';
import { faker } from '@faker-js/faker/locale/en';
import { UsersModel } from 'src/users/entity/users.entity';

export default setSeederFactory(PostsModel, () => {
  const post = new PostsModel();
  post.title   = faker.lorem.sentence();
  post.content = faker.lorem.paragraphs(3);
  post.author = { id: 3 } as UsersModel;

  return post;
});

팩토리란 데이터 추가를 위한 템플릿을 만드는 작업이다.

faker 패키지의 설정들을(랜덤한 단어) 가져와서 title, content에 입력하고, author는 고정적으로 입력한다.

4. 시더 정의

import { Seeder, SeederFactoryManager } from 'typeorm-extension';
import { DataSource } from 'typeorm';
import { PostsModel } from '../../posts/entity/posts.entity';

export default class CreatePostsSeeder implements Seeder {
  public async run(
    dataSource: DataSource,
    factoryManager: SeederFactoryManager
  ): Promise<void> {
    // // PostsModel 팩토리를 가져와서 500,000개 생성,저장
    // const postFactory = factoryManager.get(PostsModel);
    // await postFactory.saveMany(500_000);

    const postFactory = factoryManager.get(PostsModel);
    const total = 500_000;
    const chunkSize = 5_000;

    for (let i = 0; i < total; i += chunkSize) {
      await postFactory.saveMany(chunkSize);
      console.log(`Seeded ${i + chunkSize} / ${total}`);
    }
  }
}

시더는 템플릿을 기반으로 본격적으로 데이터베이스에 데이터를 입력하는 작업이다.

주석처리된 부분처럼 한번에 밀어넣으면 메모리가 부족할 수 있으므로 chunk 단위로 나누어 실행되도록 설정한다.

5. 실행 스크립트 & CLI 사용법

{
  "scripts": {
    "db:seed": "ts-node -r tsconfig-paths/register ./node_modules/typeorm-extension/bin/cli.cjs seed:run --dataSource data-source.ts"
  }
}
npm run db:seed

위와 같이 package.json의 scripts 에 위와 같이 설정한 후 npm run db:seed를 하면 작업이 수행된다.

6. 오류 해결

@Column({
    default: 0,
  })
  likeCount: number;
synchronize: true,

NOT NULL 제약이 있는 경우엔 default 를 0으로 강제한 후, 설정에서 synchronize 를 true로 하여 동기화 하거나, 팩토리에서 직접 0으로 설정하여야 한다.

 

import { faker } from '@faker-js/faker/locale/en';

faker에서 설정하는 단어가 없는 경우도 오류를 발생하므로 기본 값을 영어로 설정하도록 한다.

'NestJS' 카테고리의 다른 글

[NestJS] GraphQL 적용하기  (0) 2025.05.26
[NestJS] DB 인덱싱  (0) 2025.05.21
[NestJS] Redis 적용하기 - Rate Limiting  (0) 2025.04.21
[NestJS] Redis 적용하기 (캐싱)  (0) 2025.04.17
[NestJS] Kakao OAuth2.0 Passport  (0) 2025.04.14

최근댓글

최근글

skin by © 2024 ttuttak