JavaScript의 시간 관리, Temporal로 새롭게 태어나다!

by DD
2개월 전
조회수 20

Date API의 문제점을 해결하기 위해, 불변성, 시간대 지원, 캘린더 지원을 포함하는 Temporal API가 제안됨.

TC39를 통해 9년간의 표준화 과정을 거쳐, ES2026에 정식 포함될 예정임.

불변성(Immutability)을 강조하며, 기존 Date 객체의 변경 가능성(Mutability)으로 인한 버그를 방지함.

API 디자인에 대한 비판과 함께, 서버 환경에서의 적용 및 기존 데이터 직렬화(Data Serialization) 문제에 대한 우려가 제기됨.

Date API의 근본적인 문제점과 Temporal의 해결책

기존 Date API는 불변성을 지원하지 않아, 개발자가 의도치 않게 객체를 변경하는 버그(Bug)가 빈번하게 발생했다. Temporal은 불변성을 기본으로 하여, `setMonth()`와 같은 메서드가 새로운 객체를 반환하도록 설계되었다. 또한, 시간대(Time Zone) 처리가 명시적이지 않아 발생하는 문제점을 해결하기 위해, `ZonedDateTime`과 같은 시간대 관련 타입을 제공한다. 이러한 설계는 코드의 예측 가능성(Predictability)을 높이고, 시간 관련 오류를 줄이는 데 기여한다.

Temporal API의 설계 및 사용성 논쟁

일부 개발자는 Temporal API의 사용성에 대해 비판적인 시각을 보였다. 특히, `Temporal.Now.zonedDateTimeISO()`와 같은 구문이 기존 `new Date()`보다 복잡하다는 지적이 있었다. 반면, Temporal은 다양한 시간 관련 타입을 제공하여, 개발자가 필요에 따라 적절한 타입을 선택할 수 있도록 지원한다. 또한, 캘린더(Calendar) 지원을 통해, 그레고리력 외에도 다양한 캘린더 시스템을 사용할 수 있도록 설계되었다.

서버 환경에서의 Temporal 적용 및 데이터 직렬화 문제

커뮤니티에서는 Temporal 객체의 데이터 직렬화(Data Serialization) 문제에 대한 우려가 제기되었다. Temporal 객체는 함수를 포함하고 있어, JSON과 같은 형식으로 쉽게 변환하기 어렵다. 이는 클라이언트와 서버 간의 데이터 전송 시 문제를 발생시킬 수 있다. 이러한 문제를 해결하기 위해, 개발자는 데이터 격리 아키텍처(Data Isolation Architecture)를 고려하거나, Temporal 객체를 순수한 데이터 객체로 변환하는 로직을 구현해야 한다.

Temporal의 구현 및 생태계 영향

Temporal은 여러 JavaScript 엔진 간의 협력을 통해 구현되었으며, temporal_rs라는 공유 라이브러리를 통해 일관성을 확보했다. temporal_rsV8Boa를 포함한 여러 엔진에서 사용되며, 테스트 및 유지보수 효율성을 높였다. TemporalES2026에 포함될 예정이며, Firefox, Chrome, Edge, TypeScript 등에서 이미 지원된다. 향후 Date Picker와 같은 기존 웹 API와의 통합이 과제로 남아있다.

Temporal: A nine-year journey to fix time in JavaScript