Date는 사라지고 Temporal이 온다

4 weeks ago 11

  • JavaScript의 기존 Date 객체의 불완전성과 비일관성을 지적하며, 이를 대체할 Temporal API의 등장을 소개
  • Date는 가변 객체(mutable object) 로 동작해 실제 날짜 개념과 어긋나며, 파싱 오류·시간대 처리 한계 등 구조적 문제가 있음
  • Temporal은 불변성 기반의 새로운 날짜·시간 처리 모델을 제공하며, PlainDate, ZonedDateTime, Duration 등 세분화된 클래스 포함
  • Temporal의 메서드는 기존 객체를 수정하지 않고 새로운 객체를 반환, 명확하고 안전한 체이닝 연산 가능
  • Temporal은 현재 표준화 단계 3(Stage 3) 에 있으며, Chrome과 Firefox 등 최신 브라우저에서 실험적으로 지원 중

JavaScript의 Date 객체 문제점

  • Date 생성자는 불일치한 파싱 규칙비직관적 인덱싱으로 혼란을 초래
    • 예: 월(month)은 0부터 시작하지만, 일(day)과 연도(year)는 1부터 시작
    • 문자열 "99"는 1999년으로, "100"은 0100년으로 해석되는 등 일관성 결여
  • Date는 시간(time) 을 중심으로 설계되어 있으며, 내부적으로 Unix 타임스탬프(밀리초 단위) 로 저장
  • 시간대(time zone) 지원이 제한적이며, 서머타임(DST) 이나 비그레고리력을 인식하지 못함
  • 이러한 한계로 인해 Moment.js, date-fns 등 대형 서드파티 라이브러리 의존이 일반적이며, 이는 성능 저하로 이어짐

불변성과 참조 개념의 충돌

  • JavaScript의 원시값(primitive) 은 불변이며 값 자체로 저장되지만, 객체(object) 는 참조(reference)로 저장되어 변경 가능
  • Date는 생성자(constructor) 를 통해 만들어지는 객체이므로 가변적
    • 예: setMonth()나 setDate() 호출 시 원본 객체가 직접 변경됨
  • 이로 인해 동일한 객체를 참조하는 변수 간에 예상치 못한 값 변경이 발생
    • 예: today를 인자로 전달한 함수가 내부에서 날짜를 수정하면, 원본 today도 변경됨

Temporal: 새로운 날짜·시간 API

  • Temporal은 생성자가 아닌 네임스페이스 객체(namespace object) 로, Math와 유사한 구조
    • 주요 구성: PlainDate, PlainDateTime, PlainTime, ZonedDateTime, Duration, Now 등
  • Temporal.Now는 현재 시점의 다양한 형태를 반환
    • plainDateISO() → ISO 형식의 날짜
    • zonedDateTimeISO() → 시간대 포함 시각
  • Temporal 객체는 명확한 메서드 체계를 제공
    • add({ days: 1 }), subtract({ years: 2 }) 등으로 명시적 단위 연산 수행
    • 기존 객체를 수정하지 않고 새로운 객체를 반환, 불변성 유지

Temporal의 동작 방식과 장점

  • Temporal 객체는 여전히 객체형이지만, 의도된 불변적 사용 패턴을 따름
    • 예: today.add({ days: 1 })는 새로운 날짜 객체를 반환하며, 원본 today는 변경되지 않음
  • Date 대비 간결하고 명확한 구문 제공
    • 예: const today = Temporal.Now.plainDateISO(); console.log(`Tomorrow will be ${ today.add({ days: 1 }) }. Today is ${ today }.`); // 결과: Tomorrow will be 2026-01-01. Today is 2025-12-31.
  • 시간대 지정, 기간 계산, ISO 포맷 유지 등 현대적 요구에 부합
  • add, subtract, since, until 등 메서드 체이닝으로 복잡한 날짜 계산을 간결하게 표현 가능

표준화 현황과 향후 전망

  • Temporal은 ECMAScript 제안 단계 3(Stage 3) 에 도달, 브라우저 구현이 권장되는 상태
  • ChromeFirefox에서 이미 실험적 지원이 시작되었으며, 다른 브라우저도 도입 예정
  • 개발자들은 현재부터 테스트 및 피드백 제공을 통해 사양 개선에 참여 가능
  • Date는 여전히 존재하겠지만, 향후에는 Temporal이 기본 날짜 처리 방식으로 자리잡을 전망
  • 글은 “1995년에 교체했어야 했지만, 지금이라도 Temporal.Now가 최적의 시점”이라며 마무리

Read Entire Article