반응형
DTO(Data Transfer Object, 데이터 전송 객체)
-
네트워크를 통해 데이터가 어떻게 전송될지 정의하는 객체
-
DTO 스키마를 클래스를 통해 쉽게 정의할 수 있다.
create-movie.dto.ts
export class CreateMovieDto {
readonly title: string;
readonly year: number;
readonly genres: string[];
}
- class-validator와 class-transformer를 설치하고 이를 기반으로 파이프를 만들어 이를 통해 객체의 유효성을 체크할 수 있다. (파이프는 일종의 미들웨어라고 생각하자.)
npm i class-validator class-transformer
- 위 명령어로 class-validator와 class-transformer를 설치할 수 있다.
create-movie.dto.ts
import { IsNumber, IsString } from 'class-validator';
export class CreateMovieDto {
@IsString()
readonly title: string;
@IsNumber()
readonly year: number;
@IsString({ each: true })
readonly genres: string[];
}
- create-movie.dto.ts에서 dto에 형식을 체크할 수 있는 @IsString, @IsNumber 데코레이터를 추가해준다.
main.ts
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 파일에 위와 같이 app.useGrobalPipes를 추가하고, 여기에 ValidationPipe를 넣어 체크한다.
-
main.ts에 파이프를 설치하지 않으면 dto파일에 타입체크 데코레이터를 추가해도 걸러지지 않는다.
-
whitelist : 아무 데코레이터도 없는 속성을 가진 obeject는 거를 수 있음
-
forbidNonWhitelisted : 유효하지 않는 데이터의 request 자체를 막을 수 있음
-
transfor : 가능한 경우 실제 데이터 타입으로 변환하여 처리해줌
{
"statusCode": 400,
"message": [
"property hacked should not exist",
"title must be a string",
"year must be a number conforming to the specified constraints",
"each value in genres must be a string"
],
"error": "Bad Request"
}
- 유효하지 않은 데이터를 넣으면 위와같이 처리된다.
PartialType
npm i @nestjs/mapped-types
- mapped-types 모듈에 존재하는 PartialType을 사용하면 다른 객체의 타입을 그대로 이용할 수 있다.
import { PartialType } from "@nestjs/mapped-types";
import { CreateMovieDto } from "./create-movie.dto";
export class UpdateMovieDto extends PartialType(CreateMovieDto) { }
- 이렇게 구성할 경우 CreateMovieDto의 속성을 가져와서 UpdateMovieDto를 구성한다.
- CreateMovieDto의 속성들이 이용되지만, 필수는 아니다.
반응형
'🛠 기타 > WEB' 카테고리의 다른 글
React Hooks - useState의 활용 (useInput, useTabs) (0) | 2021.01.10 |
---|---|
Nest.js - unit testing, e2e testing (feat. jest) (0) | 2021.01.08 |
Nest.js 기초 - Service 생성 (0) | 2021.01.06 |
GraphQL - 서버 시작하기 (by. GraphQL-yoga) (0) | 2021.01.06 |
Nest.js 기초 - 시작하기 (0) | 2021.01.04 |