Nest.js환경에서 TypeORM 으로 DB연결하기

ESH'S VELOG·2023년 8월 7일
1

오늘은 프로젝트 뼈대를 생성하기 위해 Nest.js 환경에서 TypeORM으로 DB를 연결하려 한다.

TypeORM은 typescript와 javascrip를 함께 사용할 수 있는 환경에서 활용할 수 있는 ORM이다.

sequelize는 Model이 있다면 TypeORM은 entity가 있다.

우선 사용하기 위해서는 다음과 같이 패키지를 설치해야 한다.

npm i typeorm@0.3.0
npm i @nestjs/typeorm mysql
npm i @nestjs/config 
npm i dotenv

@nestjs/config는 환경변수 .env파일을 활용하여 AWS DB의 민감한 정보를 캡슐화할 때 사용할 것이다.

파일 트리 구조와 추가해야 하는 파일은 다음과 같다.
엔티티: /src/entity
typeORM과 DB연결 설정: /src/config/typeorm.config.service.ts
모듈: 루트폴더/app.module.ts
.env: 루트폴더/.env

우선 app.모듈에서 전역으로 사용할 수 있게 설정해주어야 한다.

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 { UserService } from './user/user.service';
import { UserModule } from './user/user.module';
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      useClass: TypeOrmConfigService,
      inject: [ConfigService],
    }),
    BoardModule,
    UserModule,
  ],
  controllers: [AppController],
  providers: [AppService, UserService],
})
export class AppModule {}

다음은 typeorm.config.service.ts를 설정해준다.
typeorm과 DB host를 연결해주는 모듈이다.

import { Injectable } from '@nestjs/common';
import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';


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

entities의 설정은 내가 짠 스키마들의 모델들이 들어가는 부분이다. 이전 프로젝트에서 가져온 코드이며 그때에는 각 API 폴더에 entity를 가져오는 설정이므로 entity를 설정한 클래스들을 import해서 가져오도록 한다.

import { User } from '../entity/user.entity';
import { Board } from '../entity/board.entity';
import { List } from '../entity/list.entity';
import { Card } from '../entity/card.entity';
import { Comment } from '../entity/comment.entity';
import { Waiting } from 'src/entity/waiting.entity';
import { Member } from 'src/entity/member.entity';

...(생략)
entities: [User, Board, Comment, List, Waiting, Member, Card],
....(생략)

npm run start를 명령하고 로그들이 뜨면서 잘 실행이 되는지 확인되었다.
DB와 연결이 잘되는지 확인하려고 DBeaver를 켰는데 엔티티 관계설정과 테이블이 전혀 생성되지 않았다.

확인하기 위해
typeOrmModuleOptions에 console.log로 port를 찍어보았는데 잘 찍히는 것을 확인하였다.

그런데 왜 데이터 생성이 되지 않는가?를 확인해보았더니

"@nestjs/typeorm": "^10.0.0",

@nestjs/typeorm은 설치가 되었으나 typeorm 자체는 설치가 제대로 안이뤄졌던 것이다.

npm i typeorm@0.3.0

위 명령어를 실행하니 다시 pakage.json에

"typeorm": "^0.3.0"

이 설치된 것이 확인되었고
npm run start명령어를 통해 DB가 연결되어 엔티티 및 테이블이 생성된 것을 확인하였다.

혹시라도 이렇게해서 안깔린다면
class-validator를 uninstall하고 typeorm을 설치한 후 class-validator를 다시 설치하는 것을 추천한다.

profile
Backend Developer - Typescript, Javascript 를 공부합니다.

0개의 댓글