DTO: Data Transfer Object
ํด๋ผ์ด์ธํธ ์ธก์์ Request๋ฅผ ๋ฐ์ ๋ 'ํ์ ์ง์ '๋ง์ผ๋ก validation ํ ์ ์๋ค,
๋ฐ๋ผ์ ๊ธฐ๋ณธ validation ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ custom validation์ ์ฌ์ฉํ์ฌ ๊ฒ์ฆํ๋ ๊ฒ์ ๋ํด ์ ๋ฆฌํ๊ฒ ๋ค.
entity์์ ์ ์๋ ์ ์ฝ ์กฐ๊ฑด์ PickType ํ์ฉํด dto์์๋ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค.
export class CreateMailDto extends PickType(Mail, [
'title',
'html',
]) {
@IsArray()
@Validate(CheckEmailList)
userList: string[];
}
nestjs ๊ณต์ ๋ฌธ์์์ ํ์ธํด๋ณด๋ฉด class-validator ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ validation์ ํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค
@IsEmail()
, @IsNotEmpty()
๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ์ํ๋ validation์ ์งํํ๋ค.import { IsEmail, IsNotEmpty } from 'class-validator';
export class CreateUserDto {
@IsEmail()
email: string;
@IsNotEmpty()
password: string;
}
๋ฐ์ฝ๋ ์ดํฐ | ์ค๋ช |
---|---|
@IsString() | ํด๋น ํ๋์ ๊ฐ์ด ๋ฌธ์์ด์ธ์ง ๊ฒ์ฆ |
@IsNotEmpty() | ํ๋๊ฐ ๋น์ด์์ง ์์์ง ๊ฒ์ฆ. ๋ฌธ์์ด, ๋ฐฐ์ด ๋ฑ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ณต๋ฐฑ ๋ฌธ์์ด์ด๋ ๋น ๋ฐฐ์ด๋ ์ ํจํ์ง ์์ ๊ฐ์ผ๋ก ๊ฐ์ฃผ |
@IsEmail() | ํด๋น ํ๋์ ๊ฐ์ด ์ ํจํ ์ด๋ฉ์ผ ํ์์ธ์ง ๊ฒ์ฆ |
@IsOptional() | ํ๋ ๊ฐ์ด ์ ๊ณต๋์ง ์๊ฑฐ๋ undefined ์ผ ๊ฒฝ์ฐ์ ๊ฒ์ฆ์ ๊ฑด๋๋ |
@MinLength() / @MaxLength() | ๋ฌธ์์ด์ ์ต์ ๊ธธ์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ๊ฒ์ฆ |
@IsInt() / @IsNumber() | ํด๋น ํ๋์ ๊ฐ์ด ์ ์ ๋๋ ์ซ์์ธ์ง ๊ฒ์ฆ |
@IsBoolean() | ํ๋ ๊ฐ์ด ๋ถ๋ฆฌ์ธ ํ์ ์ธ์ง ๊ฒ์ฆ |
@IsArray() | ํด๋น ํ๋์ ๊ฐ์ด ๋ฐฐ์ด์ธ์ง ๊ฒ์ฆ |
@ArrayNotEmpty() | ๋ฐฐ์ด์ด ๋น์ด์์ง ์์์ง ๊ฒ์ฆ |
@ValidateNested() | ๊ฐ์ฒด ๋ฐฐ์ด์์ ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ฒ์ฆํ ๋ ์ฌ์ฉํฉ๋๋ค. @Type() ๋ฐ์ฝ๋ ์ดํฐ์ ํจ๊ป ์ฌ์ฉ๋์ด, ๋ฐฐ์ด ๋ด ๊ฐ์ฒด์ ํด๋์ค ํ์
์ ๋ช
์ํ๊ณ ๊ทธ ๊ฐ์ฒด๋ค์ด ์ ํจํ์ง ๊ฒ์ฆํฉ๋๋ค. |
์์ ๊ธฐ๋ณธ ์ ๊ณต class-validator decorator๋ง์ผ๋ก๋ ๋ชจ๋ ๊ฒ์ฆ์ ๋ค ํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ์ด ์๋ค.
service ๋จ์์ dto์ ๊ฐ์ ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง, dto ์์ฒด์ ๋ฌธ์ ์ด๋ฏ๋ก ๋๋ dto ๋จ์์ ๊ฒ์ฆ์ ๋ง์น๋ ๊ฒ์ ์ ํธํ๋ค.
@ValidatorConstraint({ name: 'IsEvenNumber' })
export class IsEvenNumber implements ValidatorConstraintInterface {
validate(value: number): boolean {
if (value {
return value % 2 === 0
}
return false
}
}
export class SpecificNumber {
// ์ง์์ธ์ง ์ฒดํฌ
@Validate(IsEvenNumber, { message: 'No Even Number' })
specificNumber: number
}