«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

NestJS에서 Seeder(시드 데이터) 사용 방법 본문

스터디/NestJS

NestJS에서 Seeder(시드 데이터) 사용 방법

행복한 수지아빠 2025. 2. 13. 14:24

NestJS에서 Seeder(시드 데이터) 사용 방법

Seeder(시드 데이터)는 데이터베이스를 초기화하거나 테스트 데이터를 삽입할 때 유용합니다. NestJS에서는 TypeORM, Prisma, Mongoose(MongoDB) 등 다양한 데이터베이스 라이브러리를 사용할 수 있으며, 각각의 방법에 따라 Seeder를 작성하는 방식이 조금씩 다릅니다.


1. TypeORM을 사용하는 경우

🔹 설치하기

npm install @nestjs/typeorm typeorm
npm install --save-dev ts-node

ts-node는 TypeScript 파일을 실행하는 데 필요함.


🔹 Seeder 파일 생성

src/database/seeds/seeder.ts 파일을 만들고, 데이터를 삽입하는 코드를 작성합니다.

import { DataSource } from 'typeorm';
import { User } from '../entities/user.entity'; // 예제 엔티티

const dataSource = new DataSource({
  type: 'mysql', // 사용 중인 데이터베이스 타입
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: 'password',
  database: 'test_db',
  entities: [User],
  synchronize: true, // 개발 환경에서만 사용
});

async function seed() {
  await dataSource.initialize();

  const userRepository = dataSource.getRepository(User);

  const users = [
    { name: 'John Doe', email: 'john@example.com' },
    { name: 'Jane Doe', email: 'jane@example.com' },
  ];

  await userRepository.insert(users);

  console.log('✅ Seeder 완료');
  await dataSource.destroy();
}

seed().catch((err) => {
  console.error('❌ Seeder 실패', err);
  process.exit(1);
});

🔹 Seeder 실행

npx ts-node src/database/seeds/seeder.ts

실행 후, 데이터베이스에 지정된 데이터가 삽입됨.


2. Prisma를 사용하는 경우

🔹 설치하기

npm install @prisma/client
npm install --save-dev prisma ts-node

🔹 Prisma 설정

Prisma 초기화를 먼저 진행합니다.

npx prisma init

prisma/schema.prisma 파일을 설정합니다.

model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
}

마이그레이션을 실행하여 데이터베이스를 업데이트합니다.

npx prisma migrate dev --name init

🔹 Seeder 파일 생성

prisma/seed.ts 파일을 만듭니다.

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  await prisma.user.createMany({
    data: [
      { name: 'John Doe', email: 'john@example.com' },
      { name: 'Jane Doe', email: 'jane@example.com' },
    ],
  });

  console.log('✅ Prisma Seeder 완료');
}

main()
  .catch((e) => {
    console.error('❌ Prisma Seeder 실패', e);
  })
  .finally(async () => {
    await prisma.$disconnect();
  });

🔹 Seeder 실행

Prisma는 기본적으로 package.json에 "prisma": { "seed": "ts-node prisma/seed.ts" } 설정을 추가할 수 있습니다.

npx prisma db seed

3. Mongoose(MongoDB)를 사용하는 경우

🔹 설치하기

npm install @nestjs/mongoose mongoose

🔹 Seeder 파일 생성

src/database/seeds/mongo-seeder.ts 파일을 만듭니다.

import { connect, Model } from 'mongoose';
import { User, UserSchema } from '../schemas/user.schema';

async function seed() {
  const connection = await connect('mongodb://localhost:27017/test_db');
  const userModel: Model<User> = connection.model('User', UserSchema);

  await userModel.insertMany([
    { name: 'John Doe', email: 'john@example.com' },
    { name: 'Jane Doe', email: 'jane@example.com' },
  ]);

  console.log('✅ MongoDB Seeder 완료');
  await connection.close();
}

seed().catch((err) => {
  console.error('❌ Seeder 실패', err);
  process.exit(1);
});

🔹 Seeder 실행

npx ts-node src/database/seeds/mongo-seeder.ts

4. NestJS CLI를 이용하여 Seeder 실행

TypeORM이나 Prisma 같은 ORM을 사용할 때, NestJS의 명령어를 이용하여 Seeder를 실행할 수도 있습니다.

🔹 NestJS 커스텀 Seeder 서비스 만들기

NestJS 내부에서 Seeder를 실행하려면 모듈과 서비스를 이용할 수 있습니다.

src/database/seeds/seeder.service.ts 파일:

import { Injectable, OnModuleInit } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from '../entities/user.entity';

@Injectable()
export class SeederService implements OnModuleInit {
  constructor(
    @InjectRepository(User) private readonly userRepository: Repository<User>,
  ) {}

  async onModuleInit() {
    await this.seed();
  }

  async seed() {
    const count = await this.userRepository.count();
    if (count === 0) {
      await this.userRepository.insert([
        { name: 'John Doe', email: 'john@example.com' },
        { name: 'Jane Doe', email: 'jane@example.com' },
      ]);
      console.log('✅ 데이터 시드 완료');
    }
  }
}

🔹 Seeder 모듈 등록

src/database/seeder.module.ts 파일:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from '../entities/user.entity';
import { SeederService } from './seeds/seeder.service';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [SeederService],
})
export class SeederModule {}

🔹 Seeder 실행

npx nest start

NestJS 앱을 실행하면 SeederService가 자동으로 실행되면서 데이터를 삽입합니다.


📌 결론

방식 장점 단점 추천 사용 사례

TypeORM Seeder 간단하고 NestJS와 통합이 쉬움 대규모 데이터 삽입 시 성능 이슈 MySQL, PostgreSQL 사용 시
Prisma Seeder 강력한 타입 지원 및 간결한 코드 Prisma 의존성 필요 Type-safe ORM을 선호할 때
Mongoose Seeder MongoDB와 네이티브하게 연동 Mongoose 전용 MongoDB 사용 시
NestJS CLI Seeder 서비스 형태로 통합 가능 독립 실행이 어려움 NestJS 내부에서 Seeder 관리할 때

💡 NestJS 프로젝트에서 TypeORM을 사용한다면 findAndCount() 또는 insertMany()를 이용하는 방식이 가장 일반적이며, Prisma를 사용한다면 prisma db seed 방식이 가장 편리합니다.