피드로 돌아가기
I almost gave up on timezones — the day a Casablanca salon couldn't book a London client
Dev.toDev.to
Backend

Wall-clock과 Instant 분리를 통한 DST 대응 예약 시스템 설계

I almost gave up on timezones — the day a Casablanca salon couldn't book a London client

Youssefroop2026년 6월 3일16intermediate

Context

전 세계 사용자를 대상으로 하는 예약 시스템에서 모든 시간을 UTC로만 관리함에 따라 발생한 데이터 렌더링 오류 분석. 특히 DST(Daylight Saving Time) 변경 시 UTC 고정 값과 실제 현지 영업시간 간의 괴리로 인해 예약 시간이 어긋나는 구조적 한계 식별.

Technical Solution

  • 시간을 'Wall-clock'과 'Instant'라는 두 가지 독립적 모델로 분리하여 설계
  • Recurring Availability는 판매자의 현지 시간대(IANA Timezone)와 Wall-clock 시간(Postgres time column)으로 저장하여 DST 변동성 해결
  • 특정 예약 시점은 Buyer의 선택 시간을 UTC로 변환하여 timestamptz 타입으로 저장함으로써 절대적 순간을 보존
  • 렌더링 단계에서 Intl.DateTimeFormat에 판매자 또는 구매자의 Timezone을 명시적으로 전달하여 디스플레이 레이어의 정밀도 확보
  • 데이터베이스 계층에서 availability_rules 테이블을 통해 영업시간 기준점(Anchor)을 판매자 Timezone으로 고정

- 반복 일정/영업시간 저장 시 UTC 변환 전의 Wall-clock 시간과 IANA Timezone을 함께 저장했는지 확인 - 절대적 시점(Event Moment)과 상대적 시간(Business Hours)을 구분하여 서로 다른 데이터 타입과 컬럼으로 관리 - Client-side 렌더링 시 단순 Local 타임존 의존 대신 `Intl` API를 통한 명시적 Timezone 지정 적용

원문 읽기