사용자로부터 "2024-05-27"
과 같은 형식의 날짜 문자열을 입력받아야 하는 상황이 발생했습니다.
일반적으로 <input>
의 type="date"
를 사용하면 브라우저에서 자동으로 유효성을 검사해주지만, 특정 상황에서는 문자열로 날짜를 직접 입력받아야 할 필요가 있었습니다. 이때, 잘못된 날짜(2월 30일 등)가 입력되지 않도록 유효성 검사를 구현해야 했습니다.
처음에는 JavaScript의 Date
객체를 활용하여 문자열 형식의 날짜 유효성을 직접 검사하는 방법을 구현했습니다. 이를 위해 입력된 날짜 문자열을 연, 월, 일로 분리한 후 Date
객체로 변환하고, 변환된 날짜가 실제로 유효한지 비교하는 로직을 작성했습니다.
1. 수동 유효성 검사 구현
const isValidDate = (dateString: string): boolean => {
const [year, month, day] = dateString.split('-').map(Number);
const date = new Date(year, month - 1, day);
if (
date.getFullYear() !== year ||
date.getMonth() !== month - 1 ||
date.getDate() !== day
) {
return false;
}
return true;
};
// 사용 예시
console.log(isValidDate("2024-02-29")); // 윤년이므로 true
console.log(isValidDate("2024-02-30")); // 존재하지 않는 날짜이므로 false
2. date-fns
라이브러리 활용
수동으로 유효성 검사를 구현하는 과정에서 코드의 복잡성과 유지보수의 어려움을 느꼈습니다.
이를 해결하기 위해 날짜 처리에 특화된 date-fns
라이브러리를 도입하여 유효성 검사를 간소화할 수 있음을 알게 되었습니다.
date-fns
를 이용한 유효성 검사 구현
import { parse, isValid } from 'date-fns';
const isValidDateWithDateFns = (dateString: string): boolean => {
const parsedDate = parse(dateString, 'yyyy-MM-dd', new Date());
return isValid(parsedDate);
};
// 사용 예시
console.log(isValidDateWithDateFns("2024-02-29")); // 윤년이므로 true
console.log(isValidDateWithDateFns("2024-02-30")); // 존재하지 않는 날짜이므로 false
date-fns
라이브러리를 도입한 후 다음과 같은 개선 효과를 얻었습니다: