npm i --save @nestjs/typeorm typeorm pg
(본 프로젝트에서 Postgres DB를 사용하므로 pg 설치)
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 {}
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를 통해 다음 미들웨어 호출 가능
}
}
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
: 요청에서 넘어온 자료들의 형변환