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 를 사용하는 법
- NestJS, TypeORM and PostgreSQL — full example development and project setup working with database migrations. | by Simon Gausmann | Medium
- node.js - Nest can’t resolve DataSource as dependency - Stack Overflow
- Database | NestJS - A progressive Node.js framework
- nest/sample/05-sql-typeorm at master · nestjs/nest · GitHub
아래처럼 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