어긋나는 시계
시간은 왜 하나로 합의되지 않는가
새벽 2시에 두 번 실행된 배치, 하루가 25시간이던 날, 두 서버의 로그가 뒤바뀐 순서 — 이 모든 어긋남 뒤에는 시간을 하나로 합의하려던 수천 년의 역사와, 끝내 합의하지 못한 분산 시스템의 현실이 있다.
이 책은 시간을 “그냥 now() 찍으면 되는 것”으로 다뤄온 백엔드 개발자를 위해 썼다.
정답을 외우는 대신, 시간이 어긋나던 세계의 고통에서 출발해 — 하늘이 정하던 시간,
기차가 통일한 표준시, 원자시계가 세운 UTC, 그리고 아무도 시간을 정하지 못하는 분산
시스템까지 — 왜 오늘의 시간 API가 그 모양으로 태어났는지를 이야기로 따라간다.
관통하는 한 문장은 이것이다. 시간은 처음엔 하늘이 정했고, 다음엔 나라가, 다음엔 원자시계가 정했다. 그런데 분산 시스템에서는 아무도 정하지 못한다.
각 장은 배경 → 스토리 → 핵심 세 걸음으로 나아가고, 개념마다 실행 가능한 Java·SQL 코드와 그 장을 한 컷으로 요약한 삽화가 함께한다.
목차
제1부 · 시간을 정하는 자
제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. 분산 시스템에서 시간을 다루는 규칙