Scikit Web

NestJS TypeORM DataSource 연동 본문

Backend/NestJS

NestJS TypeORM DataSource 연동

Keun0 2022. 5. 24. 21:35
728x90
반응형

nestjs typeorm 의 경우 공식적으로 아직까진 버전 2를 공식적으로 권장하고 있다.

https://docs.nestjs.com/techniques/database

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

하지만 .. typeorm 버전 2에서는 DB를 한개만 쓰는 경우에는 문제없이 사용할수 있지만..

 

동적으로 여러개의 DB를 사용해야 되는 상황이 된다면 대단히 불편하다.

 

그래서 그런지는 모르겠지만.. 자바 처럼 DataSource 개념이 추가 되었고.. 사용하는 방법도 많이 변경 되었다.

 

기본 DB의 경우 버전 2의 방법으로 그대로 사용하고.. 

 

App.ts

TypeOrmModule.forRoot({
  type: "mariadb",
  host: process.env.DATABASE_HOST,
  port: parseInt(process.env.DATABASE_PORT) || 3306,
  username: process.env.DATABASE_USER,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE_NAME,
  entities: ["dist/**/*.entity{.ts,.js}"],
  synchronize: true,
}),

 

DataSource 방법의 경우 Singleton 클래스를 만들어서 사용한다.

 

import { DataSource, DataSourceOptions } from "typeorm";

export default class DataSourceService {
  private dataSource: any;

  private constructor() {}

  public static async getInstance() {
    let dataSourceService: any = new DataSourceService();

    const option: DataSourceOptions = {
      type: "mariadb",
      host: process.env.DATABASE_HOST,
      port: parseInt(process.env.DATABASE_PORT) || 3306,
      username: process.env.DATABASE_USER,
      password: process.env.DATABASE_PASSWORD,
      database: process.env.DATABASE_NAME,
      entities: ["dist/**/*.entity{.ts,.js}"],
      synchronize: true,
    };

    return await dataSourceService.setDataSource(option);
  }

  async setDataSource(option: DataSourceOptions) {
    if (this.dataSource?.isInitialized) {
      await this.dataSource.destroy();
    }
    this.dataSource = new DataSource(option);
  }

  async getDataSource() {
    if (!this.dataSource?.isInitialized) {
      await this.dataSource?.initialize();
    }

    return this.dataSource;
  }

  static async getDataSource() {
    const dataSourceService: any = await DataSourceService.getInstance();
    return await dataSourceService.getDataSource();
  }
}

 

불러와서 사용할때는  아래와 같이 사용한다

 

const dataSource = await DataSourceService.getDataSource();
await dataSource.manager
  .createQueryBuilder()
  .update(Entity)
  .set(Object)
  .execute();
728x90
반응형
Comments