typeorm에서는 seeding도 지원함
typeOrm에서 초기데이터를 넣어야할 때 즉, seeding을 하기 위해서 필요한 패키지를 설치한다.
> npm i typeorm-extension
package.json에 다음 명령어들을 추가한다.
"scripts": {
"typeorm": "ts-node --require tsconfig-paths/register ./node_modules/typeorm/cli.js",
// db생성하는 명령어
"db:create": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:create -d ./dataSource.ts",
// 없애는 명령어
"db:drop": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:drop -d ./dataSource.ts",
// 초기데이터 넣는 명령어
"seed": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js seed -d ./dataSource.ts",
// 테이블 전부 드랍
"schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop",
// 테이블 전부 생성
"schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync",
"db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts",
"db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts",
"db:create-migration": "npm run typeorm migration:create -- ./src/migrations/",
"db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts"
위 명령어들은 앞서 만들어둔 typeorm.config를 읽지 못해서
루트 디렉토리에 dataSource.ts파일을 만들어주고 아래 를 추가해준다.
import * as dotenv from 'dotenv';
import { ReservationEntity } from 'src/entities/reservation.entity';
import { SeatEntity } from 'src/entities/seat.entity';
import { ShowEntity } from 'src/entities/show.entity';
import { UserEntity } from 'src/entities/user.entity';
import { DataSource } from 'typeorm';
dotenv.config();
const entities = [UserEntity, ReservationEntity, SeatEntity, ShowEntity];
const dataSource = new DataSource({
type: 'mysql',
host: process.env.DEV_DB_HOST,
port: 3306,
username: process.env.DEV_DB_USERNAME,
password: process.env.DEV_DB_PASSWORD,
database: process.env.DEV_DB_DATABASE,
entities: entities,
// 앱 시작 시 스키마 자동 동기화
synchronize: true,
// 로깅
logging: true,
migrations: [__dirname + '/src/migrations/*.ts'],
charset: 'utf8m4_general_ci',
// 한국 표준 시
timezone: '+09.00',
});
export default dataSource;
데이터베이스를 생성하고 테이블도 생성하고나면
synchronize옵션을 false로 바꿔줘야함
데이터 베이스를 생성했다 가정하고 테이블도 생성 한 뒤
초기 데이터를 위한 파일을 /src/database/seeds
안에 만든다.
// src/database/seeds/create-initial-data.ts
import { Seeder, SeederFactoryManager } from 'typeorm-extension';
import { DataSource } from 'typeorm';
import { ShowEntity } from 'src/entities/show.entity';
import { SeatEntity } from 'src/entities/seat.entity';
export default class UserSeeder implements Seeder {
public async run(dataSource: DataSource, factoryManager: SeederFactoryManager): Promise<any> {
const workspacesRepository = dataSource.getRepository(ShowEntity);
await workspacesRepository.insert([
{
id: 1,
title: '장두혁의 node.js',
date: '2023-08-01 14:00:00',
location: '강남 공연장',
category: '뮤지컬',
},
]);
const channelsRepository = dataSource.getRepository(SeatEntity);
for (let i = 1; i < 101; i++) {
await channelsRepository.insert([
{
id: i,
grade: 'B',
price: 8000,
seatNumber: i,
showId: 1,
},
]);
}
for (let i = 101; i < 151; i++) {
await channelsRepository.insert([
{
id: i,
grade: 'A',
price: 10000,
seatNumber: i,
showId: 1,
},
]);
}
for (let i = 151; i < 200; i++) {
await channelsRepository.insert([
{
id: i,
grade: 'S',
price: 20000,
seatNumber: i,
showId: 1,
},
]);
}
}
}
userservice에서 user.entity를 의존성 주입해서 사용하기 위해서는
users모듈에 typeorm entity를 import하는 과정이 필요하다.
// users.module.ts
import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserEntity } from 'src/entities/user.entity';
@Module({
imports: [TypeOrmModule.forFeature([UserEntity])],
providers: [UsersService],
controllers: [UsersController],
})
export class UsersModule {}
이후, UsersService에서 typeOrm Entity를 Repository로 변경, 사용하는 방식을 한다면,
아래 constructor를 사용해서 의존성을 주입한다.
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { UserEntity } from 'src/entities/user.entity';
import { Repository } from 'typeorm';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(UserEntity)
private usersRepository: Repository<UserEntity>,
) {}
createUsers(email: string, isAdmin: boolean, password: string, confirm: string) {}
}
그럼 이제 this.usersRepository어쩌고 해서 메서드를 활용할 수 있음