DATA TRANSFER OBJ
우리가 nest 에서 dto 만들때 class-validator 을 사용한다
npm i class-validator@0.14.1 class-transformer@0.5.1
더 정확한 info -> github.com/typestack/class-validator
Dto class 를 만든 후 이를 적용시키기 위해선
@Post()
public createUser(@Body(new ValidationPipe()) createUserDto: CreateUserDto) {
...///
}
new 키워드와 함께 써준다.
하지만 이렇게쓰면 모든 함수마다 new ValidationPipe() 쓰게 되니 중복된 코드가 많을것이다.
글로벌하게 써보쟈
main.ts 에서 app.useGlobalPipes(new ValidationPipe())
코드 추가
하면
@Post()
public createUser(@Body() createUserDto: CreateUserDto) {
console.log(createUserDto, 'createUserDto');
return 'createUser post 요청 성공';
}
이제 @Body() 안에 아무것도 안넣어도 자동으로 연동된다.
dto에 없는 프로퍼티가 post 되는것을 방지하고싶을때 whitelist와 forbidNonWhiteListed를 true 로 해주자
https://velog.io/@wngud4950/NestJS-Validation-Pipe-%EC%A0%81%EC%9A%A9%EA%B8%B0
를 읽어보니 더 이해가 잘된다
보통 get 요청시 param이 문자열로 받아지는데, 만약 숫자로 바로 변환하고싶으면 class-transformer에서 Type을 import 해서 위 처럼 사용한다.
Dto를 extends를 이용해 더 효율적으로 쓰자!
export class CreateUserDto {
@IsNotEmpty()
@IsString()
@MinLength(3)
@MaxLength(96)
firstName: string;
@IsString()
@IsOptional()
@MinLength(3)
@MaxLength(96)
lastName?: string;
@IsNotEmpty()
@IsString()
@IsEmail()
email: string;
@IsNotEmpty()
@IsString()
@MinLength(8)
@Matches(
/^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+={}\[\]:;"'<>,.?~`-]).+$/,
{
message:
'Minimum 8 characters at least one number, one letter and one special character',
},
)
password: string;
}
기존에 이러한 dto 클래스가 있는데, patch 메소드에서 저 프로퍼티들이 필요하다면 ?
다시 똑같은 코드를 쓰기보다, PartialType
을 이용해보자
import { CreateUserDto } from './createUser.dto';
import { PartialType } from '@nestjs/mapped-types';
export class PatchUserDto extends PartialType(CreateUserDto) {
// CreateUserDto의 모든 프로퍼티들이 optional 로 된다
// validation 모두 상속됨
}