date-fns 마이그레이션은 테스트를 통과했지만, 미국 고객들에게 청구서가 하루 일찍 발송됨
Our date-fns migration passed every test and invoices still showed up a day early for US customers
핵심 요약
Claude Code를 이용한 마이그레이션 중 에이전트 간 정보 공유 실패로 타임존 오류가 발생해 청구서 발송일이 어긋난 사례.
- 에이전트 협업 오류 — 서브 에이전트 간 정보 전달이 누락되어 타임존 설정이 깨짐
- 타임존 처리 주의 — UTC 자정 기준 날짜를 로컬 시간으로 변환하면서 발생한 오류
- 인간의 검토 필요 — 자동화된 마이그레이션이라도 코드 변경 사항에 대한 인간의 최종 확인은 필수적임
- 테스트 환경 한계 — CI가 UTC 환경에서만 실행되어 실제 지역별 시간대 문제를 잡아내지 못함
지난주 화요일, 드디어 우리 결제 앱에서 Moment.js를 싹 다 걷어냈다. 파일 180개 정도에 얽혀 있었는데, 3년 동안 아무도 건드리기 싫어하던 놈이었다.
Claude Code를 코딩 플랜의 glm-5.3 모델에 연결해서 돌렸다. 먼저 마이그레이션 계획을 짜게 시켰고, 그 뒤로 결제 모듈은 서브 에이전트 하나한테, 프론트엔드는 또 다른 놈한테 맡기는 식으로 일을 분담시켰다. 오후 내내 돌아가더라. 테스트는 다 통과했고, diff 양은 엄청났지만 대충 훑어보고 머지한 뒤 수요일 배포에 태워 보냈다.
목요일 아침, 고객센터에 청구서 마감일이 하루 일찍 떴다는 문의가 6건 들어왔다. 전부 미국 고객들이었다.
우리 마감일은 UTC 자정 기준으로 저장된다. 기존 코드는 결제 쪽에서 moment.utc를 썼고 프론트엔드도 똑같이 포맷팅을 맞췄었다. 근데 새로 짠 프론트엔드 코드는 이걸 로컬 날짜로 포맷팅해버린 거다. 그래서 미주 지역 사람들은 하루 전날로 보였던 거지. 우리 CI는 UTC 환경에서 도니까 테스트에서 걸러질 리가 없었다.
나중에 서브 에이전트 11개 기록을 다 뒤져봤는데, 결제 담당 에이전트는 이걸 눈치챘더라. 마감일은 UTC 날짜 전용 값이라 그대로 유지해야 한다고 적어놨더라고. 근데 메인 에이전트한테 넘긴 요약본에는 '결제 모듈 변환 완료, 테스트 통과'라고만 적혀 있었고, 프론트엔드 담당 서브 에이전트는 그 노트를 아예 보지도 못한 거다.
난 계획서만 대충 읽고 나머지는 신경도 안 썼다. 만약 주니어 개발자가 이런 PR을 올렸으면 바로 반려했을 텐데.
이제 UTC 관련 내용은 CLAUDE.md에 박아뒀다. 문의 넣은 6명한테 답장부터 보내고, 내일 프론트엔드 쪽 다시 돌릴 생각이다.


