Skip to Content

어긋나는 시계

시간은 왜 하나로 합의되지 않는가

새벽 2시에 두 번 실행된 배치, 하루가 25시간이던 날, 두 서버의 로그가 뒤바뀐 순서 — 이 모든 어긋남 뒤에는 시간을 하나로 합의하려던 수천 년의 역사와, 끝내 합의하지 못한 분산 시스템의 현실이 있다.

이 책은 시간을 “그냥 now() 찍으면 되는 것”으로 다뤄온 백엔드 개발자를 위해 썼다. 정답을 외우는 대신, 시간이 어긋나던 세계의 고통에서 출발한다. 하늘이 정하던 시간, 기차가 통일한 표준시, 원자시계가 세운 UTC, 그리고 아무도 시간을 정하지 못하는 분산 시스템까지 따라가며, 왜 오늘의 시간 API가 그 모양으로 태어났는지를 이야기로 풀었다.

관통하는 한 문장은 이것이다. 시간은 처음엔 하늘이 정했고, 다음엔 나라가, 다음엔 원자시계가 정했다. 그런데 분산 시스템에서는 아무도 정하지 못한다.

각 장은 배경 → 스토리 → 핵심 세 걸음으로 나아가고, 개념마다 실행 가능한 Java·SQL 코드와 그 장을 한 컷으로 요약한 삽화가 함께한다.

목차

제1부 · 시간을 정하는 자

  1. 하늘이 정하던 시간 — 해시계에서 그레고리력까지
  2. 기차가 시간을 통일하다 — 표준시와 타임존의 탄생
  3. 원자가 시간을 정하다 — GMT에서 UTC로, 그리고 윤초

제2부 · 컴퓨터의 시간 4. 1970년 1월 1일 — epoch와 2038년 문제 5. 타임존은 파일이다 — IANA tz 데이터베이스의 실체 6. 없는 시각, 두 번 오는 시각 — DST의 두 얼굴 7. 문자열로 시간을 적는 법 — ISO 8601과 RFC 3339

제3부 · 언어의 시간 8. Date와 Calendar는 왜 실패했나 — java.time 이전의 세계 9. Instant vs LocalDateTime — 무엇을 언제 쓰는가 10. ZonedDateTime과 OffsetDateTime — 시간대를 품은 시각 11. 벽시계를 믿지 마라 — 단조시계와 경과 시간 측정 12. 포맷과 파싱의 함정 — DateTimeFormatter, 로케일, withZone

제4부 · 저장과 현장 13. DATETIME vs TIMESTAMP — MySQL은 시간을 어떻게 저장하나 14. JPA와 시간 매핑 — 엔티티에서 컬럼까지 15. 서버는 UTC, 표시만 로컬 — 경계에서 변환하기 16. 배치와 스케줄러가 무너지는 자리 — cron·DST·중복 실행

제5부 · 아무도 시간을 정하지 못할 때 17. 시계는 흐른다 — NTP와 클록 드리프트 18. 순서가 시각보다 중요하다 — Lamport 논리적 시계 19. 인과를 기록하다 — 벡터 클록 20. 불확실성을 인정한 시계 — TrueTime과 Spanner 21. 분산 시스템에서 시간을 다루는 규칙

닫는 글 — 다시, 시계 앞에서


▶ 여는 글부터 읽기 — 새벽 2시가 두 번 온 날

Last updated on