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
로 받고 싶어서 커스텀 데코레이트를 사용했습니다.
해당 데코레이트를 사용하면 body
와 path
로 들어오는 값을 하나의 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 })
를 사용해서 커스텀 데코레이터를 검증하겠다 명시해야 합니다.
감사합니다
'Nest js' 카테고리의 다른 글
[Scalar] nestjs API 문서 작성 하기 (feat swagger) (0) | 2024.03.21 |
---|---|
[Adminjs] nestjs 에서 어드민 만들기 (0) | 2024.03.20 |
eb-cli 사용해서 elastic beanstalk 로컬에서 배포하기 feat Nest JS (0) | 2023.08.08 |
[CloudWatch] CloudWatch로 검색 최적화 Json Formatting 하기 (0) | 2023.05.17 |
댓글