내일배움 정리/JS 문법 공부

NestJS - IsDate() vs @IsDateString()

GREEN나무 2025. 2. 13. 04:59
728x90

📌 @IsDate() vs @IsDateString() 예제

NestJS의 class-validator 라이브러리


1️⃣ @IsDate() → Date 타입의 값만 허용

import { IsDate } from 'class-validator';
import { Type } from 'class-transformer';

class ExampleDto {
  @IsDate()
  @Type(() => Date) // 변환 필수!
  birthDate: Date;
}

// 사용 예제
const validData = { birthDate: new Date('2025-01-01') }; // ✅ 유효함
const invalidData = { birthDate: '2025-01-01' }; // ❌ 문자열이므로 유효하지 않음

🔹 주의할 점:

  • @IsDate()는 Date 객체만 허용함.
  • string 값을 Date로 변환하려면 @Type(() => Date)을 반드시 추가해야 함.
  • 일반적인 API 요청에서는 문자열("2025-01-01")로 전달되므로 직접 변환하지 않으면 유효성 검사에서 실패함.

2️⃣ @IsDateString() → 날짜 형식의 문자열 허용

import { IsDateString } from 'class-validator';

class ExampleDto {
  @IsDateString()
  eventDate: string;
}

// 사용 예제
const validData = { eventDate: '2025-01-01T10:00:00.000Z' }; // ✅ 유효함
const invalidData = { eventDate: '2025-01-01' }; // ✅ 이것도 허용됨
const invalidFormat = { eventDate: 'random string' }; // ❌ 유효하지 않음

🔹 주의할 점:

  • ISO 8601 형식의 날짜 문자열을 허용 (YYYY-MM-DD 또는 YYYY-MM-DDTHH:mm:ss.sssZ)
  • Date 객체로 변환하지 않아도 문자열 그대로 사용할 수 있음

✅ 정리 (어떤 걸 써야 할까?)

데코레이터 허용 타입 변환 필요 여부 사용 예

@IsDate() Date 객체 @Type(() => Date) 필요 데이터베이스에서 Date 타입으로 저장할 경우
@IsDateString() string (ISO 8601) ❌ 변환 필요 없음 API 요청에서 날짜를 문자열로 받을 경우

 

💡 API에서 날짜를 받을 때는 @IsDateString()을 추천!
→ 일반적으로 JSON 요청에서 날짜는 문자열로 전달되므로 @IsDate()보다 @IsDateString()이 더 유용함.