[컴] NestJS 설치 및 간단한 api 생성

orm 사용 / nestjs 에서 orm 사용 / nestjs example / nestjs simple api / 사용법

NestJS 설치 및 간단한 api 생성

@nestjs/cli를 사용해서 boiler plate 를 만들 수 있다.

npm i -g @nestjs/cli

원하는 project 이름으로 만들어보자. 여기서는 myapp 으로 했다.

nest new myapp

dev server

package.json 을 참고하면 된다.

npm run start:dev

main.ts 를 보면 알겠지만, 기본 port 는 3000 으로 되어 있다. 브라우저에서 http://localhost:3000 로 접속하자. Hello World 가 보이면 된다.

config

config 파일을 사용하려면 @nestjs/config를 설치해야 한다.

npm i --save @nestjs/config

module 추가

각 기능별로 Module 을 만들어서 추가하면 된다. Application 에는 하나의 root module 이 있고, 이 root module 이 모든 module 을 import 하게 하면 된다. root module 은 nest product 를 new 할 때 만들어진다. src/app.module.ts

여기서는 MyFuncModule 을 만들어보자. Module 은 어떤 controller 를 사용하고, 어떤 provider 를 사용하는지 명시하게 된다.

controller 에서 'myfunc' 을 만들어주면 http://localhost:3000/myfunc/ 를 호출할 수 있다.

src/
  |
  + app.module.ts
  + app.controller.ts
  + app.service.ts
  |
  +-- myfunc/
        |
        + myfunc.controller.ts
        + myfunc.module.ts
        + myfunc.service.ts

AppModule :

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MyFuncModule } from './diper/myfunc.module';

@Module({
  imports: [MyFuncModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

MyFuncModule :

import { Module } from '@nestjs/common';
import { MyFuncController } from './myfunc.controller';
import { MyFuncService } from './myfunc.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { MyFunEntity } from 'src/model/myfunc.entity';

@Module({
  imports: [TypeOrmModule.forFeature([MyFuncEntity]],
  controllers: [MyFuncController],
  providers: [MyFuncService],
})
export class MyFuncModule {}
import { Controller, Get } from '@nestjs/common';
import { MyFuncService } from './myfunc.service';
import { MyFuncEntity } from 'src/model/myfunc.entity';

@Controller('myfunc')
export class MyFuncController {
  constructor(private readonly myFunc: MyFuncService) {}

  @Get()
  async findAll(): Promise<MyFuncEntity[]> {
    return await this.myFunc.findAll();
  }
}
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { MyFuncEntity } from 'src/model/myfunc.entity';
import { Repository } from 'typeorm';

@Injectable()
export class MyFuncService {
  constructor(
    @InjectRepository(MyFuncEntity)
    private readonly myFuncEntityRepository: Repository<MyFuncEntity>,
  ) {}

  async findAll(): Promise<MyFuncEntity[]> {
    return await this.diperRepository.find();
  }
  
  getHello(): string {
    return 'Hello World!';
  }
}
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"

@Entity()
export class MyFuncEntity {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    price: number

    @Column()
    date: Date

}

Database ORM

기본으로 TypeORM 을 이용한 TypeORMModule 을 제공한다. module 은 설치해야 한다. 다음은 mysql 과 관련한 설치 command 이다. 다른 db 에 대한 정보는 TypeORM - Installation 를 참고하자.

npm install --save @nestjs/typeorm typeorm mysql2

설치를 하고 나서 TypeOrmModule 을 root module 에 import 하면 된다.

  • entites option: 아래 code 에서 entities 에 만들 table 의 정보가 들어가면 된다. 저곳에 명시하지 않으면 해당 table 을 만들지 않는다.
  • autoLoadEntities : 자동으로 entity 를 불러온다. 기본값은 false 이다.
  • synchronize : 이 값은 기본값이 true이다. 이 값을 true로 하면, entity 가 변경내역이 서버 시작 시점에 반영된다. production 에선 이 값을 false 로 두라고 한다.
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test', 
      entities: [],     // <---- info for tables
      synchronize: true // <---- 
    }),
  ],
})
export class AppModule {}

DataSource 를 사용하는 법

아래처럼 ConfigModule.forRoot 에서 config file 을 불러올지 정해주고, 그값들을 TypeOrmModule.forRootAsync에서 inject 해서 사용하면 된다.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MyFuncModule } from './diper/myfunc.module';

import { ConfigModule, ConfigService, } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: ['.env.dev.local', '.env.dev'],
      isGlobal: true
    }),
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => {
        return ({
          type: 'mysql',
          host: configService.get('HOST'),
          port: +configService.get('PORT'),
          username: configService.get('DATABASE_USER'),
          password: configService.get('DATABASE_PASSWORD'),
          database: configService.get('DATABASE'),
          // entities: [
          //   __dirname + '/**/*.entity{.ts,.js}',
          // ],
          autoLoadEntities: true,
          synchronize: true,
        })
      }
    }),
    MyFuncModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }

TypeOrmModule.forRootAsync

TypeOrmModule.forRootAsync 를 사용하면, 무조건 entity 에 대한 table 을 생성하지 않는다. 각 module 에서 자신들이 사용할 entity 를 TypeOrmModule.forFeature([MyFuncEntity]) 처럼 imports에 적어주게 되는데, 이렇게 적힌 것들에 대해서만 생성해 준다.

data migration

최초의 table 의 생성은 ConfigModule.forRoot 의 option entities를 통해 정보를 가져와서 생성하게 된다.

NestJS 에서 제공하진 않고, TypeORM CLI 를 이용한다.(참고) typeorm package 가 이미 설치되어 있으니, 이걸 이용하면 된다.

migration:create :

아래처럼 하면, ./migration/test01.ts 가 생성된다. 그러면 이 test01.ts에 migration 내용을 적으면 된다.

.\node_modules\.bin\typeorm migration:create ./migration/test01

migration:run :

.ts file 을 js 로 바꿔서 사용하기 위해 ts-node 를 사용해야 한다. 다음 커맨드를 이용하면 된다.

npx typeorm-ts-node-commonjs migration:run -- -d path-to-datasource-config

full codes

Refrence

  1. First steps | NestJS - A progressive Node.js framework

댓글 없음:

댓글 쓰기