ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Nest.js] TypeORM 사용기
    Back-end 2021. 12. 9. 23:43

    i새로운 서비스(더 좋은 사람들 save earth) 를 기획하고 백 엔드를 Nest.js + graphql server + postgres DB 로 스택을 정하고 빌드를 시작했습니다.

    typescript를 더욱 강력하기 사용하기위해 TypeORM 라이브러리를 사용하기로 하였고, 간단한 세팅을 포스팅으로 남길려고 합니다.

     

    TypeORM 공식문서

     

    TypeORM은 우리의 백엔드에서 SQL문을 직접 작성하지 않아도, 데이터베이스와의 통신을 간편하게 해결해주는 라이브러리입니다. 이와 비슷한 라이브러리인 sequelize도 있습니다. 이 두 라이브러리는 코드를 통해 데이터베이스와 통신하고 상호작용합니다. 타입스크립트 코드로써 데이터베이스에 POST, GET등의 처리를 해결하는데 도움을 주는 라이브러리입니다.

    TypeORM은 Node.js환경 뿐 만 아니라 Browser,Cordova,React-Native,Expo 등의 환경에서도 사용할 수 있습니다. 저의 프로젝트에서는 Postgres DB를 사용하지만 이 뿐만 아니라, Mysql, maria DB, mongo DB등 다양한 데이터베이스와의 상호작용도 가능합니다.

     

    Nest.js + TypeORM

    nest.js의 공식문서에는 TypeORM과의 통합을 위한 공식문서가 있을 정도로 둘의 궁합이 괜찮은 것 같습니다.

    npm install --save @nestjs/typeorm typeorm pg

    TypeORM을 사용하기 위해 관련 패키지와 postgresDB를 인스톨해줍니다. 패키지를 다운로드 받으면 우리는 우리의 app.modules.ts에 이 모듈을 imports 해주어야 합니다. 공식 문서를 살펴보면 다음과 같은 코드를 따릅니다.

    import { Module } from '@nestjs/common';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { User } from './users/user.entity';
    
    @Module({
      imports: [
        TypeOrmModule.forRoot({
          type: 'mysql',
          host: 'localhost',
          port: 3306,
          username: 'root',
          password: 'root',
          database: 'test',
          entities: [User],
          synchronize: true,
        }),
      ],
    })
    export class AppModule {}

    우리는 우리의 데이터베이스 포트와 호스트, 비밀번호와 같은 정보를 코드상에 노출시킬 이유가 없습니다. 네.. 물론 안되죠! 그래서 환경변수를 지정해 줄 필요가 있습니다. nest는 우리가 흔히 사용하는 dot.env를 사용할 수 있는 패키지가 있습니다.

    npm i --save @nestjs/config

     

    패키지를 다운로드 받은 후 config에 대한 모듈도 app.modules.ts에 imports해줍니다. 공식 문서의 코드를 확인해보겠습니다.

    ConfigModule.forRoot({
      isGlobal: true
      envFilePath: '.development.env',
    });

    다음과 같이 우리는 어떠한 환경변수를 사용할 것인지를 정할 수 있습니다.

     

     

    TypeOrmModule.forRoot({
          type: 'postgres',
          host: process.env.DB_HOST,
          port: +process.env.DB_PORT,
          username: process.env.DB_USERNAME,
          password: process.env.DB_PASSWORD,
          database: process.env.DB_NAME,
          synchronize: process.env.NODE_ENV !== 'prod',
          logging: process.env.NODE_ENV !== 'prod',
          entities: [User],
        }),

    환경변수를 정의한 뒤 TypeORM의 모듈에 설정을 한 모습입니다. synchronize는 자동으로 TypeORM이 데이터베이스를 동기화 시켜주는 작업을 할 수 있게 해주는데, 프로덕션 환경에서 사용 시 잘못 동기화시 데이터 테이블이 망가질 수 있으므로, 프로덕션 환경에서는 사용하지 않는 것이 좋습니다.

     

    Entity의 구성

    nest.js의 공식문서에 작성되어 있는 코드를 확인해봅시다.

    import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
    
    @Entity()
    export class User {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column()
      firstName: string;
    
      @Column()
      lastName: string;
    
      @Column({ default: true })
      isActive: boolean;
    }

    typeorm으로 부터 다음과 같은 직관적인 형태의 테이블을 코드로서 작성할 수 있습니다. 그리고 이 엔티티를 TypeORM 모듈에 entities 옵션을 세팅하면 자동으로 우리의 데이터베이스에 동기화 될 것입니다.

     

     

    이렇게 간단하게 nest.js + typeORM으로 데이터베이스와의 통신 및 상호작용을 알아보았습니다. sql을 전혀 사용하지 않고, 타입스크립트 만으로 엔티티와 컬럼을 정의하고, 더 나아가 class-validation 등으로 validation까지 확장할 수 있을 것 같습니다. 타입스크립트의 강력함을 다시 한 번 느끼는 하루입니다 🙊

    댓글

sangjun's blog