본문 바로가기
Nest js

[NestJS] 커스텀 데코레이터 검증(validating)

by 욧닭 2023. 4. 3.
반응형

Nest JS는 많은 데코레이터를 제공합니다

그러나 원하는 데코레이터가 없다면 만들어서 사용해야 합니다 NestJs에 유용한 메서드가 있죠 createParamDecorator 로 원하는 데코레이터를 만들어서 Controller, Service 등 다양한 곳에서 사용을 합니다. 이 기능을 Controller 에서 사용한다고 얘기가 달라집니다. 왜냐하면 Client 에서 요청 받을때 파라미터값을 검증을 해야하는데 커스텀 데코레이터는 특수한 경우라 ValidationPipe에서 검증을 해주지 않습니다. 그 방법을 한번 같이 알아보죠

Code

import { ExecutionContext, createParamDecorator } from "@nestjs/common";

export const BodyAndParam = createParamDecorator((data: unknown, ctx: ExecutionContext) => {
  const req = ctx.switchToHttp().getRequest();
  return { body: req.body, params: req.params};
})

일단 전 Controller 에서 요청 받을때 @Params@Body 로 들어오는 값을 하나의 DTO로 받고 싶어서 커스텀 데코레이트를 사용했습니다.

해당 데코레이트를 사용하면 bodypath 로 들어오는 값을 하나의 DTO로 받을 수 있습니다

그럼 커스텀 데코레이트를 통해 들어오는 값을 받는 DTO를 만들어 보겠습니다

export class UserTypeParamsDTO {
    @IsString()
    @IsDefined()
    public username: string;

    @IsString()
    @IsDefined()
    public type: string;
}

export class UserPasswordBodyDTO {
    @IsString()
    @IsDefined()
    public password: string;
}

export class UpdateUserTypeRequest {
  @ValidateNested()
  @Type(() => UserTypeParamsDTO)
  @IsDefined()
  public params: UserTypeParamsDTO;

  @ValidateNested()
  @Type(() => UserPasswordBodyDTO)
  @IsDefined()
  public body: UserPasswordBodyDTO;
}

Path 로 받는 값은 DTO는 UserTypeParamsDTO Body 로 받는값은 UserPasswordBodyDTO 받아 validating 해주고 두 class를 받는 DTO를 만듭니다.

 

@ValidateNested()@Type(() => UserTypeParamsDTO) 를 통헤 TYPE 에 대한 값을 validating 해주는 형식입니다. Controller에 추가 해보겠습니다.

@Post(':username/info/:type')
async updateUserType(@BodyAndParam(new ValidationPipe({ validateCustomDecorators: true })) req: UpdateUserTypeRequest): boolean {
    LogProvider.info(JSON.stringify(req), 'updateUserType');

    return true;
}

이렇게 커스텀 데코레이터를 설정해주고 validating 을 가능하게 하기위해선
new ValidationPipe({ validateCustomDecorators: true }) 를 사용해서 커스텀 데코레이터를 검증하겠다 명시해야 합니다.

 

 

감사합니다

반응형

댓글