UTC 서버에서 날짜가 하루 어긋났다 — 규칙 대신 타입으로 막았다
운영은 8월 4일, 노트북은 8월 5일. 한국 시간으로 통일하는 방식은 이미 두 번 샜다.
같은 전시가 운영 서버에서는 8월 4일, 내 노트북에서는 8월 5일로 떴다. 더 나쁜 건 운영 화면 한 페이지 안에서도 갈렸다는 점이다. 위쪽 제목줄은 8월 4일, 그 위에 뜬 팝업은 8월 5일이었다.
원인 자체는 단순하다. 서버는 세계 표준시로, 내 노트북은 한국 시간으로 돌아간다. 날짜를 화면 글자로 바꾸는 함수들이 자기가 돌아가는 컴퓨터 시간대를 그대로 따르기 때문에, 같은 값이 두 군데서 다르게 보였다.
전수조사에서 더 나쁜 게 나왔다
「진행 중인가 끝났는가」를 판정하는 코드가 여섯 벌 있었고, 서로 조금씩 달랐다.
그리고 이미 심어져 있던 사고를 하나 찾았다. 9월에 열리는 행사의 종료 시각이 **「9월 7일 오전 9시」**로 저장돼 있었다. 즉 행사 마지막 날 오전 9시부터 참가자들이 작업을 못 하게 잠기는 상태였다. 아무도 아직 모르고 있었다.
「한국 시간으로 통일」은 이미 두 번 샜다
처음 떠오른 답은 전부 한국 시간으로 통일하자는 것이었다. 날짜를 다루는 자리마다 시간대를 한국으로 못 박으면 된다.
그런데 기록을 찾아보니 그 방식으로 이미 두 번 고쳤다가 두 번 다 샜다. 채팅 시각을 고칠 때 한 번, 통계를 고칠 때 한 번. 매번 그 자리만 고쳐졌고 나머지는 그대로였다.
이유는 명확했다. 「한국 시간으로 통일한다」는 사람이 매번 기억해야 하는 규칙이라는 점이다. 새 화면을 만들 때마다, 새 사람이 합류할 때마다 그 규칙을 알고 지켜야 한다. 한 번이라도 잊으면 그 자리가 샌다. 그리고 샌 걸 아무도 모른다 — 개발할 때는 한국 시간이라 멀쩡해 보이고, 서버에 올라간 뒤에야 하루 어긋난다.
여기서 방향이 갈렸다. 규칙을 더 잘 지키게 만들 것인가, 아니면 지킬 필요가 없게 만들 것인가.
행사 날짜는 달력에 동그라미 치는 것이다. 뉴욕에서 보든 서울에서 보든 8월 5일은 8월 5일이다. 그런데 우리는 그걸 시간대가 딸려 붙는 그릇에 담고 있었다. 그릇을 시간대라는 개념이 아예 없는 것으로 바꾸면, 규칙을 지킬 사람이 필요 없어진다.
바꾼 것
- 저장하는 그릇을 날짜 전용으로 바꿨다. 시간 정보를 담을 수 없는 종류라 시간대가 끼어들 자리가 물리적으로 사라진다. 기존 데이터 10건도 한국 날짜 기준으로 정리했다.
- 화면에 찍는 함수를 역할로 갈랐다. 「행사 날짜용」과 「시각 기록용」을 이름부터 다르게 만들었다. 잘못 쓰면 글자를 치는 순간 편집기가 빨간 줄을 긋는다. 실제로 이름을 바꾸자 잘못 쓰고 있던 자리 여섯 곳이 자동으로 드러났다.
- 여섯 벌의 판정을 하나로 합쳤다. 규칙이 바뀌면 한 곳만 고치면 된다.
통과하고 있던 테스트가 거짓말이었다
하나 더 있다. 테스트가 이 버그를 못 잡고 있었다.
기존 테스트는 날짜를 만들 때 「2026년 5월 9일」처럼 사람이 읽는 방식으로 썼다. 그러면 테스트도 자기가 돌아가는 컴퓨터 시간대를 따라간다. 그래서 한국에서도 통과하고 세계 표준시에서도 통과한다. 버그를 잡으라고 만든 테스트가 버그를 못 보고 있었다.
날짜를 절대적인 한 순간으로 못 박고, 기대값은 한국 시간 기준으로 적었다. 테스트가 항상 서버와 같은 조건에서 돌게 고정했다. 마지막으로 실제로 나 있던 사고 — 행사 마지막 날 오전에 잠기던 그 상황 — 을 테스트로 박아뒀다. 같은 병이 돌아오면 이제 걸린다.