NestJS로 API 만들기 (4) TypeORM, Module, Middleware 설정

Jiwon Youn·2021년 1월 11일
0

NestJS로 API만들기

목록 보기
4/4

TypeORM 설치

npm i --save @nestjs/typeorm typeorm pg
(본 프로젝트에서 Postgres DB를 사용하므로 pg 설치)

app.module.ts

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Product } from './products/entities/products.entity';
import { ProductsModule } from './products/products.module';
import { CommonModule } from './common/common.module';
import { LoggerMiddleware } from './middleware/logger.middleware';
import { Categories } from './products/entities/categories.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: 'nestjs',
      entities: [Product, Categories],
      synchronize: true,
      logging: true,
    }),
    ProductsModule,
    CommonModule,
  ],
  controllers: [],
  providers: [],
})

사용할 DB의 정보 설정 후 연결
entities : 사용할 객체 클래스들 선언
synchronize : DB 테이블과 동기화
logging : 간단한 쿼리와 에러를 로깅

src/common/common.module.ts

import { Module } from '@nestjs/common';

@Module({})
export class CommonModule {}

src/products/products.module.ts

import { Module } from '@nestjs/common';
import { ProductService } from './products.service';
import { ProductController } from './products.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Product } from './entities/products.entity';
import { Categories } from './entities/categories.entity';

@Module({
  imports: [TypeOrmModule.forFeature([Product, Categories])],
  exports: [TypeOrmModule],
  providers: [ProductService],
  controllers: [ProductController],
})
export class ProductsModule {}

app.module.ts 에 middleware 추가

export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    // ProductsController 내에서 정의해둔 /product 경로에 대한 설정
    consumer.apply(LoggerMiddleware).forRoutes('product');
    // 또는 .forRoutes({ path:'product', method: RequestMethod.GET }); - 특정 요청 method 유형을 제한
    // 또는 .forRoutes(ProductsController); - Controller class 사용 가능
  }
}

요청값에 대한 정보를 조회하는 middleware 설정

src/middleware/logger.middleware.ts

import { Injectable, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    console.log(
      `HttpRequest... host: ${req.headers.host}, url: ${req.originalUrl}, method: ${req.method}`,
    );
    next();
    // next를 통해 다음 미들웨어 호출 가능
  }
}

src/main.ts

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );
  await app.listen(3000);
}
bootstrap();

main.ts에 ValidationPipe로 데이터의 유효성 체크

npm i --save class-validator class-transformer
Pipes를 사용하기 위해 설치

whitelist: true : validation을 위한 decorator가 붙어있지 않은 속성들은 제거
forbidNonWhitelisted: true : whitelist 설정을 켜서 걸러질 속성이 있다면 아예 요청 자체를 막도록 (400 에러)
transform: true : 요청에서 넘어온 자료들의 형변환

0개의 댓글