nestJS에서 Typeorm 사용하기

1
post-thumbnail

TypeORM은 두가지 패턴을 선택으로 사용할 수 있다.

  • Active Record: BeanEntity를 상속받아 entity내에서 CRUD 하기. (작은 서비스유리)
  • Data Mapper: Model은 별도이고, Respository가 DB와 연결하고, CRUD를 별도 서비스로 만든다. (큰 서비스유리)

nestJS 에서는 Data Mapper 패턴이 사용하기에 편리하다.
Data Mapper 패턴을 이용해서 만들어보쟈!

TypeORM 설치

npm install --save @nestjs/typeorm typeorm pg

디비에 접속 하기 위해 접속 정보를 입력해줍니다.
보안을 위해 env에 입력을 해둡니다.
AppModule 데코레이터의 imports 부분에 TypeOrmModule 객체의 forRoot 를 통해 접속 정보와 커넥션 option을 작성 후 Context Reload 가 되면 Nest 코어는 TypeOrmModule 을 초기화 합니다.

@Module({
  imports: [
    **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: true,
      entities: [Restaurant] ***사용entity***  
    }),**
    RestaurantsModule
  ],
  controllers: [],
  providers: [],
})

Entity 만들기

import { Field, ObjectType } from "@nestjs/graphql";
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@ObjectType()
@Entity()
export class Restaurant {
    @PrimaryGeneratedColumn()
    @Field(type => Number)
    id: number;

    @Field(type => String)
    @Column()
    name: string;

    @Field(type => Boolean)
    @Column()
    isVegan: boolean;

    @Field(type => String)
    @Column()
    address: string;

    @Field(type => String)
    @Column()
    ownersName: string;

    @Field(type => String)
    @Column()
    categoryName: string;
}

restaurant 모듈안에 Entity 객체를 imports 해줍니다.

@Module({
    imports: [TypeOrmModule.forFeature([Restaurant])],
    providers: [RestaurantsResover, RestaurantService]
})

nestJS의 데코레이션 @InjectRepository를 사용하여
const restaurantRepository = connection.getRepository(Restaurant); 컨넥션연결을 해주는 코드를 간편한게 사용 할 수 있습니다.

this.restaurants.find(); 은 typeorm의 문법으로 restaurants entity에서 전체select를 하는것입니다.

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Restaurant } from './entities/restaurant.entity';

@Injectable()
export class RestaurantService {
    constructor(
        @InjectRepository(Restaurant)
        private readonly restaurants: Repository<Restaurant>,
    ) { }
    getAll(): Promise<Restaurant[]> {
        return this.restaurants.find();
    }
}
profile
👩🏻‍💻항상발전하자 🔥

0개의 댓글