— 건강 기록 앱에서 “언제”의 의미를 다시 묻다
오늘 하루를 돌아보면, 코드보다 더 많이 만진 건 시간이었다.
정확히 말하면, 숫자로 찍히는 시간이 아니라 의미를 가진 시간.
문제는 사소해 보였다
처음 시작은 단순했다.
- 모바일에서 회원가입이 안 된다
- 회색 레이어가 화면을 덮고 클릭이 안 된다
- 기록 시간이 현재 시간이 아니다
- 수정했다는데 여전히 반영이 안 된다
흔한 버그처럼 보였다.
CSS 문제일 수도 있고, 캐시 문제일 수도 있고, 배포 실수일 수도 있었다.
그런데 이상했다.
하나씩 고칠수록, 문제는 점점 더 근본적인 질문으로 나를 끌고 갔다.
“이 앱에서 시간은 도대체 뭘 의미하지?”
데이터는 거짓말을 시작한다.
기록한 시간과, 실제로 일어난 시간
건강 기록 앱을 만들다 보면 꼭 부딪히는 질문이 있다.
- 병원에 가서 지금 혈압을 재고 기록했다
- 하지만 증상은 어제 밤에 있었다
- 혹은 며칠 전부터 계속 이어지고 있었다
그럼 이 기록의 시간은 언제여야 할까?
- 기록 버튼을 누른 시간?
- 증상이 시작된 시간?
- 증상이 끝난 시간?
처음엔 아무 생각 없이 recorded_at을 썼다.
“기록한 시간이면 충분하지 않을까?” 싶어서.
그게 오늘의 모든 문제의 씨앗이었다.
시간이 섞이면, 신뢰가 무너진다
오늘 발견한 가장 중요한 사실은 이것이다.
시간이 하나로 섞이면, 데이터는 거짓말을 하기 시작한다.
- CSRF 문제도, SSL 문제도 결국은 “언제”의 문제였고
- 모바일에서만 안 되던 이유도 “보안 정책이 언제 적용되느냐”의 문제였고
- 기록 시간이 어긋나 보이던 문제도 “무슨 시간을 보여주고 있느냐”의 문제였다
결국 나는 결론을 내렸다.
시간을 분리하기로 했다
이 앱에서 시간은 이렇게 나뉜다.
1. 기록 시간 (created_at)
- 언제 적었는가
- 시스템이 책임진다
- 사용자는 수정할 수 없다
- 로그와 감사, 신뢰의 기준이 된다
2. 발생 시간 (occurred_at / occurred_end_at)
- 언제 실제로 증상이 있었는가
- 사용자가 선택적으로 입력한다
- 모르면 비워도 된다
- 의료적 의미를 가진 시간이다
이 두 시간을 섞지 않기로 했다.
대신, 의미를 분리해서 보여주기로 했다.
작은 UX 결정 하나가 철학이 된다
그래서 나는 이런 선택을 했다.
- 기록 화면에서
기록 시간 입력 필드를 제거했다 - 상세 화면에서는 두 시간을 색과 영역으로 분리해 보여준다
- 발생 시간이 있으면 노란색으로, 없으면 “기록되지 않음”으로 표시한다
그리고 중요한 원칙 하나를 세웠다.
AI는 시간을 결정하지 않는다. 제안만 한다.
AI가 “어제 오후 3시쯤”을 파싱해줄 수는 있다.
하지만 적용 버튼은 항상 사람의 손에 남겨둔다.
오늘 가장 중요했던 한 줄
오늘 작업 중, 내가 가장 마음에 들었던 코드는 이거다.
diff_count = HealthRecord.where("recorded_at != created_at").count
그리고 이어지는 CSV 백업.
이건 기술이 아니라 태도였다.
“데이터가 다를 수도 있다는 가능성을
코드보다 먼저 인간이 인정하는 순간”
이 한 줄 덕분에,
이 앱은 “빨리 만드는 앱”이 아니라
“되돌릴 수 있는 앱”이 됐다.
되돌릴 수 있는 앱을 만든다.
이 앱을 누군가에게 권한다면
지금 이 앱은 완벽하지 않다.
솔직히 말하면, 아직 불편한 점도 많다.
그래도 누군가에게 이렇게 말할 수는 있을 것 같다.
“이 앱은 네 몸을 대신 판단하지 않는다.
대신, 네 기억과 시간을 정직하게 보관해준다.”
그리고 그게 지금의 나에겐 중요하다.
마무리하며
오늘 하루는 버그를 고친 날이 아니라,
기준을 세운 날이었다.
- 시간이 섞이지 않게
- 책임이 흐려지지 않게
- 사람이 마지막 결정을 하게
이 앱은 아마도
아주 빠르게 커지지는 않을 것이다.
하지만 천천히,
사람이 믿을 수 있는 방향으로 갈 것이다.
그리고 나는
그런 앱을 만들고 싶다.
늦게 시작했지만,
시간만큼은 함부로 쓰지 않는 사람으로서.
내일은 또 다른 문제가 기다리고 있을 거다.
괜찮다.
오늘은 오늘대로 충분히 잘 왔다.
