JavaScript의 Date API가 지겨워서 고쳤다

발행: (2025년 12월 10일 오전 02:39 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

WristWatch 소개

WristWatch 은 JavaScript의 날짜 문제에 대한 나의 해답입니다. 10 KB 미만의 아주 작은 라이브러리이며 의존성이 전혀 없고, 네이티브 Date API를 실제로 의미가 있는 방식으로 감싸줍니다(적어도 나에게는).

Moment.js 같은 거대한 프레임워크를 만들고 싶지는 않았습니다. 단지 다음을 할 수 있는 무언가가 필요했죠:

  • 매번 문서를 확인하지 않고 날짜 포맷하기
  • 눈물 없이 날짜 연산하기
  • JavaScript 고고학 박사 수준의 지식 없이 함수 이름 기억하기
  • 실수로 날짜를 변형시켜 모든 것을 깨뜨리지 않기

재미있는 부분

직관적인 월

네이티브 Date.getMonth() 은 0‑11을 반환합니다. WristWatch에서는 월이 1‑12로, 일반 사람이 기대하는 대로 동작합니다:

const date = new WristWatch('2025-12-05');
date.getMonth(); // 12 (December, not 11!)

별로 안 구리는 포맷

날짜를 포맷하고 싶나요? 원하는 형식을 알려주기만 하면 됩니다:

const now = WristWatch.now();
now.format('YYYY-MM-DD');      // "2025-12-06"
now.format('MMMM D, YYYY');    // "December 6, 2025"
now.toRelative();             // "just now"

수십 개의 메서드를 체인하거나 전체 포맷팅 라이브러리를 가져올 필요가 없습니다.

실제로 동작하는 날짜 연산

날짜에 일수를 더하는 것이 쉬워야 합니다. WristWatch에서는 그렇습니다:

const today = WristWatch.now();
const tomorrow = today.add(1, 'day');
const nextWeek = today.add(1, 'week');
const nextMonth = today.add(1, 'month');

모든 것이 불변(immutable)이라 원본 날짜를 실수로 망가뜨릴 수 없습니다. 또한 “1월 31일에 한 달을 더하면 어떻게 될까?” 같은 엣지 케이스도 처리합니다(답: 2월 28일, 3월 3일이 아니라).

생각 없이 할 수 있는 비교

한 날짜가 다른 날짜보다 이전인지 확인하고 싶나요? 바로 할 수 있습니다:

if (tomorrow.isAfter(today)) {
  console.log('Tomorrow is in the future!');
}

if (date.isBetween(start, end)) {
  console.log('Date is in range!');
}

타임스탬프를 빼거나 머리로 계산할 필요 없이 직관적인 비교만 하면 됩니다.

기술적인 부분

의존성 제로

WristWatch는 정확히 의존성이 없습니다. 네이티브 Date API를 얇게 감싸는 구조라 빠르고, 신뢰성이 높으며, 어떤 의존성이 폐기되더라도 깨지지 않습니다.

완전 타입 지원

처음부터 TypeScript 로 작성되었습니다. 모든 함수, 모든 매개변수, 모든 것이 타입이 지정되어 있습니다.

트리‑쉐이킹 가능

필요한 것만 가져오세요.

// 메서드 체이닝 스타일
import { WristWatch } from '@lukelowers/wrist-watch';
const ww = WristWatch.now();
ww.add(1, 'day').format('YYYY-MM-DD');

// 함수형 스타일
import { now, format, add } from '@lukelowers/wrist-watch';
const date = now();
format(add(date.getDate(), 1, 'day'), 'YYYY-MM-DD');

원본 솔루션과 밀접한 관계

원본을 그대로 재현하고 싶지는 않았습니다. 기존 방식을 떠올리게 하면서도 더 큰 라이브러리와 경쟁하려 하지 않는 래퍼가 목표였습니다.

실제 테스트 완료

fast-check 을 이용한 프로퍼티 기반 테스트를 통해 모든 것이 정상 작동함을 보장합니다. 수백 개의 무작위 테스트 케이스가 각 함수마다 실행되며, 코드는 누구든지 추가 테스트를 할 수 있도록 공개돼 있습니다.

솔직한 이야기

모두가 날짜 라이브러리를 직접 만들지 말라고 합니다. “Moment만 써!” 라고 하고, “date‑fns만 써!” 라고도 합니다.

Moment는 이제 폐기되었습니다. date‑fns는 좋지만 규모가 큽니다. 때때로 npm 절반을 가져오지 않고도 정확히 필요한 것만 하는 간단한 것이 필요합니다.

WristWatch는 모든 사람을 위한 모든 것이 되려는 것이 아닙니다. 작고, 집중적이며, 실제로 사용하기 즐거운 라이브러리가 되고자 합니다.

사용해 보고 싶나요?

npm install @lukelowers/wrist-watch

GitHub 레포지토리 에는 전체 문서와 예제가 있습니다. 깨진 부분을 발견하거나 기능을 추가하고 싶다면 PR을 환영합니다.

Back to Blog

관련 글

더 보기 »