Search

#027 #스키마 설계 / Class Validator

 mongoose 쿼리 로그 남기는 법

app.module.ts 에서 mongoose.set(’debug’, true); 명령어를 추가하면 mongoose의 쿼리가 로그에 찍히게 된다. 단, prod로 배포시에는 false로 변경할 것!!! 이 MODE변경을 변수로 관리하면 편하다!

 환경변수로 dev / prod 로 로그레벨 관리

.env 에서 dev / prod 모드를 관리하고
MODE 변수를 분기처리하는 로직을 추가하면 된다.

 controller 설계

import { Controller, Get, Post, UseFilters, UseInterceptors, } from '@nestjs/common'; import { CatsService } from './cats.service'; import { HttpExceptionFilter } from 'src/common/exceptions/http-exception.filter'; import { SuccessInterceptor } from 'src/common/interceptors/success.interceptor'; @Controller('cats') @UseInterceptors(SuccessInterceptor) @UseFilters(HttpExceptionFilter) export class CatsController { constructor(private readonly catsService: CatsService) {} @Get() getCurrentCat() { return 'current cat'; } @Post() async singUp() { return 'signup'; } @Post('login') logIn() { return 'login'; } @Post('logout') logout() { return 'logout'; } @Post('upload/cats') uploadCatImg() { return 'uploadImg'; } }
JavaScript
복사
기존 controller 내용을 지우고, 프로젝트에 맞게 재설계

 스키마 생성

 파일 생성

cats 폴더 내부에 cats.schema.ts 생성!

 cats.schema.ts 구조

import { Schema, SchemaFactory, SchemaOptions } from '@nestjs/mongoose'; import { Document } from 'mongoose'; const options: SchemaOptions = { timestamps: true, }; @Schema(options) export class Cat extends Document {} export const CatSchema = SchemaFactory.createForClass(Cat);
JavaScript
복사
@Schema : 데코레이터를 사용해서 스키마 정의 → options : 옵션에 들어가 있는 timestamp: true 는 MongoDB가 자동으로 ‘createdAt’ 과 ‘updatedAt’ 필드를 추가하고 관리하게 한다. → extends Document : Cat클래스는 Mongoose의 Document클래스를 상속받아 문서 객체로 취급받는다. 이 Document클래스로 MongoDB 컬렉션에서 문서가 생성되고 조작된다. → SchemaFactory.createForClass(Cat) : Cat 클래스를 스키마로 변환한다. 이는 export되어서 다른 모듈에서 사용할 수 있게 된다.

 컬럼 정의

@Prop 데코레이터를 사용하여 속성을 추가한다. 이제 CatSchema는 email / catName / password / imgUrl 속성을 가지게 되었다.

 속성 제약조건 추가

속성에 대한 제약조건은 @Prop() 데코레이터 내부에 json형태로 추가할 수 있는데, 여기서 사용된 required 는 Nullable로 생각하면 되고, unique는 스프링에서 사용하던 것과 같은 제약조건이다.

 Class Validator

Class Validator라이브러리는 데코레이터 기반의 검증을 사용할 수 있게 해준다. 데코레이터 기반 검증은 Pipe기능과 같이 사용될 때 속성의 메타타입에 접근할 수 있기 때문에 아주 유용하다.

 설치

npm i --save class-validator class-transformer
JavaScript
복사

 class validator 추가정보

 전역 pipe추가

Class Validator를 사용하기 위해서는 main.ts에서 useGlobalPipes 를 통해서 전역설정을 해주어야 한다.

 class validator 사용

email 속성에 IsEmail / IsNotEmpty 라는 class validator를 추가하여 해당 필드가 이메일 형태가 맞는지, 비어있지는 않은 지에서 검증을 한다. 이와 같이
다양한 검증 도구를 사용할 수 있다.

cats.schema.ts 전체 코드