자바스크립트(JavaScript) Date 파서(Parser), 어디까지 허용할 건가요?

by DD
2개월 전
조회수 18

자바스크립트(JavaScript)의 `Date` 객체는 다양한 문자열 형식을 날짜로 변환하려 시도하며, 예상치 못한 결과를 초래함

`new Date()` 생성자는 ISO 8601 형식 외에, 엔진별로 레거시 파서를 사용하여 문자열에서 날짜를 추출함

주소나 회사명과 같은 문자열이 날짜로 변환되는 버그 발생 사례를 통해 `Date` 생성자의 문제점을 지적함

`Date` 생성자를 유효성 검사기(Validator)로 사용하지 말 것을 권고하며, `date-fns` 또는 Temporal API와 같은 안전한 파서 사용을 제안함

자바스크립트(JavaScript) Date 파서(Parser)의 광범위한 동작 방식

자바스크립트(JavaScript)의 `Date` 객체는 문자열을 날짜로 변환하는 과정에서 ISO 8601 형식 외에도 다양한 형식을 허용한다. 특히, V8 및 SpiderMonkey 엔진은 레거시 파서를 통해 문자열에서 날짜 정보를 추출하려 시도한다. 이러한 유연성은 개발자에게 편리함을 제공하지만, 예상치 못한 문자열이 날짜로 변환되는 부작용(Side Effect)을 발생시킨다. 예를 들어, 'Route 66'과 같은 문자열이 1966년 1월 1일로 해석될 수 있다.

레거시 파서(Legacy Parser)의 문제점: 시간대 처리

레거시 파서는 ISO 8601 형식과 다른 시간대 처리 규칙을 적용하여 문제를 야기한다. ISO 형식의 '2020-01-23'은 UTC로 해석되지만, 레거시 파서는 로컬 시간을 기본으로 사용한다. 이러한 차이로 인해 동일한 날짜 문자열이 서로 다른 시간대(Time Zone)에서 다르게 해석될 수 있다. 이는 개발자가 예상하지 못한 버그를 발생시키는 주요 원인이 되며, 디버깅(Debugging)을 어렵게 만든다.

Date 생성자의 유효성 검사(Validation) 문제

게시물에서는 `Date` 생성자를 유효성 검사기(Validator)로 사용하는 것을 지양하고, 입력 형식에 대한 엄격한 제어를 강조한다. 특히, 사용자 입력을 처리할 때는 정규 표현식(Regex)을 사용하여 형식을 검증하거나, `date-fns`의 `parseISO()`와 같은 엄격한 파서(Strict Parser)를 사용하는 것이 권장된다. 이는 예상치 못한 문자열이 날짜로 변환되는 것을 방지하고, 애플리케이션의 안정성을 높이는 데 기여한다.

Temporal API를 통한 개선 가능성

커뮤니티에서는 자바스크립트(JavaScript)의 `Date` 객체 문제를 해결하기 위한 대안으로 Temporal API에 주목한다. Temporal API는 `Date` 객체의 문제점을 개선하고, 더욱 직관적이고 안전한 날짜 및 시간 처리를 제공할 것으로 기대된다. 특히, Temporal API는 엄격한 형식 검사(Strict Format Validation)를 통해 예상치 못한 동작을 방지하고, 개발자가 날짜 및 시간을 보다 정확하게 제어할 수 있도록 지원한다.

JavaScript's date parser is out of control and needs to be stopped