typeORM 강의

최수민·2023년 8월 11일
0

TIL

목록 보기
12/41

typeORM 설치 명령어

npm i typeorm@0.3.0
npm i @nestjs/typeorm mysql요

만약 class-validator 이슈로 인해 설치에 실패했다면 아래 명령어들을 순서대로 실행해주세요.

npm uninstall class-validator
npm i typeorm@0.3.0
npm i @nestjs/typeorm mysql
npm i class-validator

app.module.ts파일에 아래와 같이 수정해주었습니다.

import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { BoardModule } from "./board/board.module";

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: "mysql",
      host: "localhost",
      port: 3306,
      username: "여러분들의 데이터베이스 아이디",
      password: "여러분들의 데이터베이스 비밀번호",
      database: "board",
      entities: [__dirname + "/**/*.entity{.ts,.js}"],
      synchronize: true, // Production 환경에서는 false로 설정해야 합니다.
    }),
    BoardModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

여기서 중요한 점은 db에 관한 정보들이 고스란히 들어가 있다는 겁니다.

type: "mysql",
      host: "localhost",
      port: 3306,
      username: "여러분들의 데이터베이스 아이디",
      password: "여러분들의 데이터베이스 비밀번호",
      database: "board",
      entities: [__dirname + "/**/*.entity{.ts,.js}"],
      synchronize: true,

그래서 자주 사용하는 .env 파일처럼 nestjs config 파일을 생성해서 옮기려합니다.

  • @nestjs/config 명령어
npm i @nestjs/config

class-validator 이슈로 설치를 실패했다면 다음 명령어들을 복사 + 붙여넣기 해서 실행해주세요.

npm uninstall class-validator
npm i @nestjs/config
npm i class-validator

그리고 .env파일도 작성해주세요.

DATABASE_HOST="localhost"
DATABASE_PORT=3306
DATABASE_USERNAME="여러분들의 데이터베이스 아이디"
DATABASE_PASSWORD="여러분들의 데이터베이스 비밀번호"
DATABASE_NAME="board"
DATABASE_SYNCHRONIZE=true

이제 해당 confg설정을 전역으로 참조하기 위해 app.module.ts 코드 변경

import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { BoardModule } from "./board/board.module";
import { TypeOrmConfigService } from "./config/typeorm.config.service";
import { ConfigModule, ConfigService } from "@nestjs/config";
import { Article } from "./board/article.entity";

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }), // 일단 이것은 무조건 가장 위에서!
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule], // 주목
      useClass: TypeOrmConfigService,
      inject: [ConfigService], // 주목
    }),
    BoardModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

typeorm.config.service.ts도 .env 파일의 환경변수를 읽어오는 버전으로 코드 변경

import { Injectable } from "@nestjs/common";
import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from "@nestjs/typeorm";
import { ConfigService } from "@nestjs/config";
import { Article } from "src/board/article.entity";

@Injectable()
export class TypeOrmConfigService implements TypeOrmOptionsFactory {
  constructor(private readonly configService: ConfigService) {}

  createTypeOrmOptions(): TypeOrmModuleOptions {
    return {
      type: "mysql",
      host: this.configService.get<string>("DATABASE_HOST"),
      port: this.configService.get<number>("DATABASE_PORT"),
      username: this.configService.get<string>("DATABASE_USERNAME"),
      password: this.configService.get<string>("DATABASE_PASSWORD"),
      database: this.configService.get<string>("DATABASE_NAME"),
      entities: [__dirname + "/**/*.entity{.ts,.js}"],
      synchronize: this.configService.get<boolean>("DATABASE_SYNCHRONIZE"),
    };
  }
}

아직 익숙치 않아 일단 그냥 따라해보고 있습니다.

0개의 댓글