Validation
Validation
μ ν¨μ± κ²μ¬λ λͺ¨λ  μΉ μμ© νλ‘κ·Έλ¨μ νμμ μΈ κΈ°λ₯μ
λλ€. λ€μ΄μ€λ μμ²μ μλμΌλ‘ νμΈνκΈ° μν΄ λ΄μ₯λ ValidationPipeκ° μ¬μ©νλ class-validator ν¨ν€μ§λ₯Ό νμ©ν©λλ€. ValidationPipeλ λ€μν κ°λ ₯ν μ ν¨μ± κ²μ¬ κ·μΉμ μ¬μ©νμ¬ λ€μ΄μ€λ ν΄λΌμ΄μΈνΈ νμ΄λ‘λλ₯Ό νμΈνλ νΈλ¦¬ν λ°©λ²μ μ κ³΅ν©λλ€.
Overview
νμ΄ν μ₯μμ μ°λ¦¬λ λ¨μνλ κ²μ¦ νμ΄νλ₯Ό λ§λλ κ³Όμ μ κ±°μ³€μ΅λλ€. μ°λ¦¬κ° μννλ μμ μ λ μ μ΄ν΄νλ €λ©΄ μ΄ κΈ°μ¬λ₯Ό μ½λ κ²μ΄ μ’μ΅λλ€. μ¬κΈ°μλ μ£Όλ‘ μ€μ  μ¬μ© μ¬λ‘μ μ€μ μ λ κ²μ λλ€.
Auto-validation
μ΄ μμ΅μλ₯Ό μν΄ ValidationPipeλ₯Ό μ μ²΄ μμ© νλ‘κ·Έλ¨μ λ°μΈλ©νλ―λ‘ λͺ¨λ  μλν¬μΈνΈκ° μλͺ»λ λ°μ΄ν°λ‘λΆν° μλμΌλ‘ 보νΈλ©λλ€.
async function bootstrap() {
  const app = await NestFactory.create(ApplicationModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();νμ΄νλ₯Ό ν μ€νΈνκΈ° μν΄ κΈ°λ³Έ μλν¬μΈνΈλ₯Ό λ§λ€μ΄ λ΄ μλ€.
@Post()
create(@Body() createUserDto: CreateUserDto) {
  return 'This action adds a new user';
}κ·Έλ° λ€μ CreateUserDtoμ λͺ κ°μ§ μ ν¨μ± κ²μ¬ κ·μΉμ μΆκ°νμμμ€.
import { IsEmail, IsNotEmpty } from 'class-validator';
export class CreateUserDto {
  @IsEmail()
  email: string;
  @IsNotEmpty()
  password: string;
}μ΄μ  λκ΅°κ°κ° μ ν¨νμ§ μμ emailλ‘ μλ ν¬μΈνΈλ₯Ό μμ²νλ©΄ μ ν리μΌμ΄μ
μ 400 Bad Requestμ½λμ λ€μ μλ΅ λ³Έλ¬ΈμΌλ‘ μλ΅ν©λλ€.
{
  "statusCode": 400,
  "error": "Bad Request",
  "message": [
    {
      "target": {},
      "property": "email",
      "children": [],
      "constraints": {
        "isEmail": "email must be an email"
      }
    }
  ]
}λΆλͺ
ν μλ΅ λ³Έλ¬Έμ ValidationPipeμ μ μΌν μ¬μ© μ¬λ‘κ° μλλλ€. μλ ν¬μΈνΈ κ²½λ‘μμ :idλ₯Ό λ°κ³  μΆλ€κ³  μμν΄ λ³΄μμμ€. κ·Έλλ μ«μλ§ μ ν¨ν©λλ€. μ΄κ²μ λ§€μ° κ°λ¨ν©λλ€.
@Get(':id')
findOne(@Param() params: FindOneParams) {
  return 'This action returns a user';
}그리고 FindOneParamsλ λ€μκ³Ό κ°μ΅λλ€.
import { IsNumberString } from 'class-validator';
export class FindOneParams {
  @IsNumberString()
  id: number;
}Disable detailed errors
μ€λ₯ λ©μμ§λ λ€νΈμν¬λ₯Ό ν΅ν΄ μ μ‘λ λ°μ΄ν°μ λ¬Έμ μ μ μ΄ν΄νλ λ° λ§μ λμμ΄ λ©λλ€. κ·Έλ¬λ μΌλΆ νλ‘λμ  νκ²½μμλ μμΈν μ€λ₯λ₯Ό μ¬μ©νμ§ μμ μ μμ΅λλ€.
app.useGlobalPipes(
  new ValidationPipe({
    disableErrorMessages: true,
  }),
);μ΄μ  μ΅μ’ μ¬μ©μμκ² μ€λ₯ λ©μμ§κ° μ±μμ§μ§ μμ΅λλ€.
Stripping properties
μ’
μ’
 미리 μ μ λ (νμ© λ) μμ±λ§ μ λ¬νκ³  μΆμ΅λλ€. μλ₯Ό λ€μ΄, μ°λ¦¬κ° emailκ³Ό password μμ±μ κΈ°λνλ€λ©΄ λκ΅°κ°κ° ageλ₯Ό λ³΄λΌ λ μ΄ μμ±μ μ κ±°λμ΄ DTOμμ μ¬μ©ν  μ μκ² λ©λλ€. μ΄λ¬ν λμμ κ°λ₯νκ²νλ €λ©΄whitelistλ₯Ό trueλ‘ μ€μ νμμμ€.
app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,
  }),
);μ΄ μ€μ μ νμ΄νΈλ¦¬μ€νΈμ ν¬ν¨λμ§ μμ (λ°μ½λ μ΄ν°μμ΄) μμ±μ μλ μ κ±°λ₯Ό νμ±νν©λλ€. κ·Έλ¬λ μμ² μ²λ¦¬λ₯Ό μμ ν μ€μ§νκ³  μ¬μ©μμκ² μ€λ₯ μλ΅μ λ°ννλ €λ©΄ whitelistμ ν¨κ» forbidNonWhitelistedλ₯Ό μ¬μ©νμμμ€.
Auto payload transforming
ValidationPipeλ νμ΄λ‘λλ₯Ό ν΄λΉ DTO ν΄λμ€λ‘ μλ λ³ννμ§ μμ΅λλ€. 컨νΈλ‘€λ¬ λ©μλμμ createUserDto λλ findOneParamsλ₯Ό μ΄ν΄λ³΄λ©΄ μ€μ  ν΄λμ€κ° μλλΌλ κ²μ μ μ μμ΅λλ€. μλ λ³νμ νμ±ννλ €λ©΄transformμtrueλ‘ μ€μ νμμμ€.
app.useGlobalPipes(
  new ValidationPipe({
    transform: true,
  }),
);Websockets & Microservices
μ΄λ¬ν λͺ¨λ μ§μΉ¨μ μ¬μ©μ€μΈ μ μ‘ λ°©λ²μ κ΄κ³μμ΄ WebSocketκ³Ό λ§μ΄ν¬λ‘ μλΉμ€λ₯Ό λͺ¨λ κ³ λ €νμ΅λλ€.
Learn more
μ¬μ©μ μ§μ  μ ν¨μ± κ²μ¬κΈ°, μ€λ₯ λ©μμ§ λ° μ¬μ© κ°λ₯ν λ°μ½λ μ΄ν°μ λν μμΈν λ΄μ©μ λ³΄λ €λ©΄ μ΄ νμ΄μ§λ₯Ό λ°©λ¬Ένμμμ€.
Last updated
Was this helpful?