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 |