javaScript/nestJs
데이터 검증하기 dto
부엉이사장
2025. 6. 14. 05:20
Introduction
express 사용할때는 각 함수마다 받아오는 데이터를 직접 검증했음.
예를들어 로그인하려는데 아이디 길이나 비밀번호 이런거 정규식 주로 사용함.
nestJs에서는 dto라는게 있어서 매우 편한거같음. 이걸 소개할까함
# 먼저 설치
npm install class-validator class-transformer
# main.ts 수정
app.useGlobalPipes(new ValidationPipe({
transform: true, // DTO 타입 자동 변환
whitelist: true, // DTO에 정의되지 않은 속성 제거
forbidNonWhitelisted: true, // 정의되지 않은 속성이 있으면 400 에러
}));
# 디렉토리 구조
이런식으로 dto 디렉토리에 원하는 검증 dto듣을 넣어주샘
# 검증값 / test.dto
import {
IsDefined,
IsString,
MinLength,
MaxLength,
Matches,
IsNotEmpty,
} from 'class-validator';
export class BaboDto {
@IsDefined({ message: '이름을 입력해주세요.' })
@IsString()
@MaxLength(4, { message: '이름은 5자 미만이어야 합니다.' })
@Matches(/^[가-힣a-zA-Z0-9]+$/, {
message: '이름에는 특수문자를 포함할 수 없습니다.',
})
name: string;
@IsDefined({ message: '메시지를 안 받았어요.' }) // 이게 꼭 있어야 함
@IsString({ message: 'message must be a string' })
@IsNotEmpty({ message: '메시지를 안 받았어요.' })
@MinLength(10, { message: '메시지는 10자 이상이어야 합니다.' })
message: string;
}
test.dto꺼
해당 프로퍼티들을 어떻게 검증할건지 체크해주는거임.
1. IsDefined 얘는 이 값이 있어야하는거. 없으면 message 응답
2. isString 얘는 문자열타입이어야 하는거
3. MaxLength 는 최대길이. 안맞으면 메세지 응답
4. Matches는 정규식으로 검사까지
이런식으로 여러가지 dto를 만들고 재사용할 수 있음
타입을 따로 정해뒀으면 타입을 임포트해서 class에 implements로 할수도 있을듯
# 컨트롤러에서 설정
@Post('babo')
PostBabo(@Body() dto: BaboDto) {
//여기부터는 dto검사 끝난 상태임
return {
message: '데이터 잘 받았어요!',
data: dto,
};
}
babo라는 post요청을 받았을때,
body를 BaboDto로 검증한다는 거임
# 테스트
정상요청시
비정상 요청시
1. 프로퍼티 하나 더 추가
2. 프로퍼티 하나 뺴기
3. 아이디 규격위반
뭐 이런식으로 400번대 에러 던져줌. 매우매우 편리할것같다
예전에 하드코딩할떄는 아예 규격 미들웨어 다 정해서 힘들었는데
nestJs로 하면 데이터 받아오는걸 컨트롤러단에서 검증하고 끊어줄 수 있음.