Skip to content
tutorials

JavaScript의 Date 객체는 공식적으로 구식이 되었습니다

수십 년 동안 JavaScript의 Date 객체는 버그와 좌절의 원인이었습니다. 새로운 네이티브 API의 등장으로 Moment.js나 Luxon과 같은 라이브러리 전체가 불필요해질 전망입니다.

Marcus Lee
JavaScript의 Date 객체는 공식적으로 구식이 되었습니다

모든 개발자가 new Date()를 싫어하는 이유

왜 거의 모든 JavaScript 개발자가 날짜를 다룰 때 Luxon이나 date-fns 같은 라이브러리를 찾는지 궁금한 적이 있나요? 내장된 Date 객체는 악명 높을 정도로 신뢰할 수 없으며, 끝없는 좌절의 원인이 됩니다. 이제 이 객체가 왜 그토록 많은 고통을 주는지 이해해야 할 때입니다.

간단한 쿼리를 생각해 봅시다. new Date('0')은 무엇을 반환할까요? Unix 에포크인 1970년 1월 1일을 예상할 수도 있습니다. 하지만 JavaScript는 문자열 "0"을 2000년으로 해석합니다. 반면 new Date(0)은 정확히 1970년 1월 1일을 반환합니다. 이러한 일관성 없는 파싱은 위험한 함정입니다.

Date.parse()를 사용하면 문제는 더 심각해집니다. 이 메서드는 문자열에서만 작동합니다. 따라서 Date.parse(0)을 호출하면 JavaScript는 숫자 0을 문자열 "0"으로 암묵적으로 변환합니다. 결과적으로 Date.parse(0)Date.parse("0")과 마찬가지로 2000년을 반환합니다. 이러한 암묵적 타입 변환은 디버깅하기 매우 어려운 조용하고 예측 불가능한 버그를 생성합니다.

역사적으로 Date 객체의 설계는 시작부터 문제가 있었으며, 1995년에 도입된 Java의 java.util.Date를 그대로 모방했습니다. Java조차도 결함 때문에 1997년에 이 API를 폐기했습니다. 이러한 유산으로 인해 JavaScript는 변경 가능한(mutable) 날짜 객체를 갖게 되었고, 이는 연산 시 원본 값이 예기치 않게 변경될 수 있음을 의미합니다. 게다가 불충분하고 일관성 없는 타임존 지원은 정확한 글로벌 날짜 및 시간 처리를 거의 불가능하게 만듭니다.

Temporal: 날짜 처리를 위한 새로운 시대

Temporal은 JavaScript의 오랜 날짜 관련 고민에 대한 해답으로 등장했습니다. 9년의 개발 끝에 2026년 3월 Stage 4에 도달한 프로젝트입니다. 설계 철학의 핵심은 불변성(immutability)입니다. 모든 연산이 새로운 객체를 생성하므로 기존 Date 객체를 괴롭혔던 예기치 않은 부작용이 제거됩니다. 이러한 예측 가능성은 원본 날짜 값이 그대로 유지됨을 의미하며 디버깅을 획기적으로 단순화합니다.

거대한 Date 객체는 사라지고, 명시적이고 강력하게 타입이 지정된 객체 제품군으로 대체되었습니다. 이러한 명확한 역할 분리는 의도를 즉시 파악할 수 있게 합니다. 하나의 객체가 모든 것을 어설프게 처리하려던 대신, Temporal은 특정 작업을 위한 전문 도구를 제공합니다:

  • PlainDate: 시간이나 타임존이 없는 달력상의 날짜.
  • PlainTime: 날짜나 타임존이 없는 벽시계 시간.
  • Instant: 타임존이나 달력이 없는, Unix 에포크 이후 나노초 단위로 측정된 고유한 시간의 지점.
  • ZonedDateTime: 실제 타임존에서의 완전한 날짜와 시간으로, 일광 절약 시간(DST)을 완벽하게 이해합니다.
  • Duration: 수동으로 밀리초를 계산할 필요 없이 정확한 날짜 산술 연산을 가능하게 합니다.

이 새로운 구조는 날짜 산술 연산과 비교를 획기적으로 단순화합니다. 더 이상 밀리초를 계산하거나 타임존 동작을 추측할 필요가 없습니다. Temporal은 일광 절약 시간 전환과 같은 복잡한 문제를 자동으로 처리합니다. 예를 들어, 타임존을 넘나드는 비행기 착륙 시간을 계산하는 작업은 API가 추가 노력 없이 시간 변경을 고려하므로 신뢰할 수 있고 읽기 쉬워집니다.

불가능했던 타임존 수수께끼 해결

타임존과 일광 절약 시간(DST)은 역사적으로 개발자들에게 엄청난 좌절의 원인이었습니다. 기존 Date 객체는 이러한 복잡성을 처리하도록 설계되지 않았기 때문에, 우리는 복잡한 우회 방법을 사용하거나 대규모 외부 라이브러리에 의존해야 했습니다. 다행히도 Temporal은 한때 불가능해 보였던 이러한 수수께끼를 놀랍도록 간단하고 예측 가능하게 만듭니다.

10월 24일 일요일 오후 8시에 뉴욕을 출발하여 7시간 동안 비행하는 뉴욕발 런던행 항공편을 상상해 보세요. 런던은 5시간 빠릅니다. 단순하게 계산하면 런던에 오전 8시에 도착할 것 같지만, 이 항공편은 일광 절약 시간제(DST)로 인해 시계가 '뒤로' 조정되는 시간대를 통과합니다. Temporal의 ZonedDateTime은 이를 정확히 계산하여 런던에 오전 7시에 도착함을 보여주며, 전환 시간을 자동으로 고려합니다. getTimeZoneTransition()을 사용하여 정확한 변경 시간을 확인할 수도 있습니다.

또 다른 일반적인 시나리오인 회의 일정 변경을 고려해 보세요. 오전 11시 회의를 하루 뒤로 미뤘는데 밤사이에 DST로 인해 시간이 변경되었다면, 갑자기 오전 10시가 되는 것을 원치 않을 것입니다. ZonedDateTime은 사용자가 달력 날짜와 벽시계 시간을 다루고 있음을 이해합니다. DST 변경 여부와 관계없이 오전 11시 회의 시간을 지능적으로 유지합니다.

이러한 수준의 정밀도와 자동 처리는 날짜 계산을 획기적으로 단순화합니다. 이전에는 개발자들이 복잡한 수동 오프셋 계산이나 Moment.js, Luxon과 같은 무거운 라이브러리가 필요했습니다. Temporal의 명확하고 예측 가능한 API는 이러한 복잡성을 완전히 제거합니다. 기능에 대한 포괄적인 개요는 공식 제안 문서인 Temporal - TC39를 참조하세요.

이 글이 마음에 드셨나요? 매일 아침 이런 글을 메일로 받아보세요.

하루 한 통 · 두 번의 클릭으로 구독 취소 · 제3자 추적 없음

날짜 그 이상: ES2027의 다른 업그레이드

날짜 외에도 ES2027은 using 키워드를 통한 Explicit Resource Management를 도입합니다. 이 우아한 추가 기능은 파일 핸들이나 데이터베이스 연결과 같은 중요한 리소스의 자동 정리를 보장합니다. 수동으로 try-finally 블록을 작성하는 대신, JavaScript는 이제 범위를 벗어날 때 객체의 Symbol.dispose 메서드를 자동으로 호출하여 메모리 누수를 방지합니다. 비동기 정리를 위해서는 await usingSymbol.asyncDispose와 함께 유사한 보장을 제공하며, DisposableStack은 순차적인 해제를 위해 여러 리소스를 관리합니다. 이 기능은 5월에 Stage 4에 도달했으며, 현재 Chrome, Firefox, Node.js, Bun 및 Deno에서 사용할 수 있습니다.

다음으로, Iterator.zip을 통해 일부 헬퍼 라이브러리 의존성을 제거하세요. 이 기능은 여러 배열이나 이터러블을 병렬로 깔끔하게 병합하여 대응하는 값들의 배열을 제공합니다. 이름이 지정된 결과를 원할 경우 zipKeyed가 객체 기반의 출력을 제공합니다. 또한 mode 옵션을 통해 길이가 다른 이터러블도 사려 깊게 처리합니다:

  • "shortest" (기본값): 가장 짧은 이터러블에서 중단
  • "longest": 가장 긴 이터러블이 끝날 때까지 계속하며, 선택적으로 padding 가능
  • "strict": 길이가 다를 경우 TypeError 발생

이는 이터레이터 헬퍼의 진화를 이어가는 것으로, 일반적인 데이터 변환을 위해 Lodash와 같은 라이브러리가 필요했던 상황을 줄여줍니다.

마지막으로, 다른 흥미로운 제안들도 주목해 보세요. Stage 3의 Promise.allKeyed는 병렬 프로미스를 처리하는 더 깔끔한 방법을 제공하며, 위치 기반 배열 대신 이름이 지정된 결과가 포함된 객체를 반환합니다. 더 나아가 Stage 1의 Signal 제안은 네이티브 반응성을 약속하며, JavaScript 프레임워크가 상태와 업데이트를 관리하는 방식을 혁신할 잠재력이 있습니다. 이러한 업그레이드는 Temporal과 함께 언어의 중요한 진전을 의미합니다.

자주 묻는 질문

JavaScript의 Temporal API란 무엇인가요?

Temporal은 현대적인 날짜 및 시간 기능을 위한 최상위 네임스페이스 역할을 하는 JavaScript의 새로운 내장 전역 객체입니다. 이는 문제가 많았던 기존의 Date 객체를 대체하기 위해 포괄적이고 불변하며 사용자 친화적인 API를 제공합니다.

Temporal API가 Moment.js나 Luxon 같은 라이브러리를 대체하나요?

네, 대부분의 핵심 날짜/시간 조작, 파싱 및 시간대 관리 측면에서 Temporal은 Moment.js, Luxon, date-fns와 같은 라이브러리의 네이티브 대체제로 설계되었으며, 많은 프로젝트에서 이러한 외부 의존성의 필요성을 제거합니다.

Temporal API는 언제 사용할 수 있나요?

Temporal은 2024년 3월 Stage 4에 도달했으며, Chrome, Firefox, Edge 및 Node.js(v26+)의 최신 버전에서 기본적으로 사용할 수 있습니다. Safari 지원은 진행 중입니다.

Temporal API는 불변(immutable)인가요?

네, 모든 Temporal 객체는 불변입니다. 날짜나 시간을 수정하는 모든 작업(예: 하루 추가)은 완전히 새로운 Temporal 객체를 반환하므로, 의도치 않은 부작용을 방지하고 코드를 더 예측 가능하게 만듭니다.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$500 · AI tools & software only