올해는 머신러닝이다.
NestJS에서 Seeder(시드 데이터) 사용 방법 본문
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 방식이 가장 편리합니다.
'스터디 > NestJS' 카테고리의 다른 글
NestJs + Seeder + Faker 조합 (0) | 2025.02.13 |
---|---|
NestJS에서 페이징을 구현 방법 2가지 (0) | 2025.02.13 |
NestJS와 MkDocs를 함께 사용하여 문서를 관리(Docker) (0) | 2025.02.13 |
NestJS에서 추천하는 아키텍처 패턴 (0) | 2025.02.13 |
NestJS 필수로 알아야 하는 개념 정리 (0) | 2025.02.13 |