nest.js typeorm

jangdu·2023년 7월 30일
0

nest.js

목록 보기
11/11

초기 데이터 넣기 (seeding)

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,
        },
      ]);
    }
  }
}

typeOrm service 연결

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어쩌고 해서 메서드를 활용할 수 있음

profile
대충적음 전부 나만 볼래

0개의 댓글