기도모임 앱에 처음부터 꼭 넣고 싶었던 기능이 있었어요. 매일 정해진 시간에 알림이 한 번 울려서, 그 시간 동안만이라도 모임 사람들 기도제목을 한 번 들여다보게 해주는 거요. 카톡으로 제목 나누다 보면 시간 좀 지나서 다른 톡 사이에 묻혀 안 보이는 게 늘 아쉬웠거든요. 출시하고 며칠 동안 가장 잘 굴러가는 것처럼 보였던 게 그 알림이었고, 모임 안에서 "알림 뜨니까 잊지 않고 들여다보게 돼서 좋다"는 말이 한두 번 돌아오는 걸 보면서 첫 앱에서 가장 의미 있는 한 줄이라고 속으로 좀 으쓱했어요.
문제는 그 다음 주 어느 아침이었어요. 평소처럼 출근 준비하면서 폰을 들여다봤는데, 받은 알림 목록에 "기도모임" 알림이 하나 새로 떠 있었어요. 그게 이상한 시간에 와 있었어요. 분명히 앱 설정 화면에서 저녁 시간으로 맞춰 둔 알림인데, 새벽에 와 있었던 거죠. 처음엔 "내가 시간을 잘못 맞춰 뒀나" 하고 설정 화면에 들어가 봤어요. 시간은 그대로였어요. 그러면 알림은 왜 저 시간에 왔지. 그 자리에 한참 서서 알림 트레이를 다시 내려봤어요.
9시간이라는 숫자가 왜 익숙하지
설정에 저장된 시간과 폰에 실제로 도착한 시간 사이 간격을 손가락으로 세어 봤어요. 저녁 어느 시간으로 맞춰 뒀는데, 도착은 새벽 어느 시간이었어요. 머릿속에서 그 차이를 빼봤더니 아홉 시간이 났어요. 그 아홉 시간이라는 숫자가 어디서 본 듯 익숙했어요. 한국이랑 어디 시차가 아홉 시간이었더라. 출근길 지하철에서 그 숫자를 가지고 한참 생각했어요. 그게 UTC라는 단어랑 한국 시간 사이의 차이라는 게 머릿속에 떠오른 건 회사 들어가기 직전쯤이었어요.
회사 갔다 와서 저녁 먹고 책상에 다시 앉았어요. 클로드한테 상황을 그대로 적었어요. "기도모임 앱 알림이 사용자가 설정한 시간보다 아홉 시간 늦게 옵니다. 한국에서 쓰는 앱이고, 폰 시간은 정상이에요." 답이 길게 오기 전에 한 줄짜리 짐작이 먼저 떴어요. "코드 안에서 시간을 다룰 때 시간대(timezone) 처리가 빠진 것 같아요" 였어요. 그 말이 머릿속에 들어왔을 때 뭔가 한 번 가라앉았어요. 알림을 예약하는 그 줄이 사용자가 누른 "저녁 어느 시간"을 그대로 UTC 기준으로 저장하고 있었던 거예요. UTC로 저녁 어느 시간이면, 한국에선 그 다음 날 새벽 어느 시간이 돼요. 한국 사람이 한국에서 한국 시간으로 맞춰 둔 알림이, 코드 안에선 영국 어디쯤에 사는 사람을 위해 예약되고 있었던 셈이었어요.
그 사실이 머릿속에 박히는 동안 몇 가지가 한꺼번에 떠올랐어요. 하나는 출시 전 며칠 동안 알림 테스트를 한다고 실제로 1분 뒤, 5분 뒤 같은 짧은 간격으로 코드를 임시로 박아 놓고 돌렸던 시간들이었어요. 그 짧은 간격에서는 시차 아홉 시간이 묻혀버려서 "9시간 후 + 1분"이나 "9시간 후 + 5분"이나 똑같이 그냥 "아 안 오네" 또는 "아 왔다"로만 보였거든요. 출시 직전에 진짜 사용자가 쓰는 방식대로 "저녁 어느 시간"으로 맞춰서 다음 날까지 기다려 보는 검증을 한 번도 안 한 거였어요. 그 며칠 동안의 테스트가 사실은 다 시간 차이 안에서 도는 같은 미로였다는 게 그날 저녁에 좀 부끄럽게 보였어요.
또 하나는 모임 사람들 중에 그 알림이 어느 아침에 떴을 사람이 한두 명은 더 있었을 거라는 점이었어요. 그분들 중에 누구도 "이거 이상해요"라고 따로 말해 주지 않았어요. 본인이 본인 폰의 알림 트레이를 우연히 본 그 아침이 없었다면, 그 버그는 다음 며칠 동안 모르는 채로 계속 굴러갔을 수도 있다는 생각이 그 자리에 잠깐 머물렀어요.
한 줄짜리 고침, 한 단락짜리 흔적
그 다음에 클로드가 내려준 처방은 정말 한 줄짜리 코드였어요. 알림을 예약하는 함수 들어가기 전에, 시간대를 먼저 한국으로 잡아 놓고 가라는 거였어요. 어느 라이브러리의 어느 함수에 "서울"이라는 도시 이름을 한 번 박아 두기만 하면, 그 다음부터 예약되는 시간이 다 한국 기준으로 자리를 잡는다는 흐름이었어요. 코드 안에서 그 한 줄을 추가하고, 빌드를 다시 돌리고, 폰에 새로 깔았어요. 설정에서 알림 시간을 일부러 가까운 시간으로 맞춰 두고 폰을 옆에 놓은 다음, 빨래를 개거나 설거지를 하면서 그 시간이 오기를 기다렸어요. 그 시간이 됐을 때 폰이 진짜로 한 번 떨었어요. 정해 둔 시간 그대로요. 다음 날 아침 알림도 정상이었고, 그 다음 날도 그랬어요.
코드 한 줄로 풀린 사건이라 처음엔 좀 어이없었어요. 사흘을 잡아먹은 카카오 IAM 같은 건 풀리고 나서도 "그래도 사흘은 들 만했네" 같은 위안이 있는데, 이건 한 줄짜리라 "왜 이런 한 줄이 그동안 빠져 있었던 거지" 하는 자조가 더 컸어요. 도구가 알아서 다 해줄 줄 알았는데, 도구는 제가 시킨 것까지만 해주고 시키지 않은 영역에선 평범하게 빠뜨려요. "한국에서 쓰는 앱"이라는 사실은 제가 머릿속에서만 알고 있었지, 도구한테는 한 번도 그 한 줄을 말한 적이 없었던 거예요.
그 자리에서 한 가지가 같이 떠올랐어요. 그 며칠 전, 카카오 IAM 풀린 다음 날 아침에 글로벌 메모리 파일이라는 데에 한 단락을 처음 적어 봤다는 사실이었어요. 그 노트가 나중에 CLAUDE.md라는 매뉴얼로 자라는 얘기는 따로 적어 뒀는데, 시작은 딱 이 두 줄이었어요. 그땐 그 메모를 한 번 추가하고는 한동안 잊고 살았어요. 두 번째 앱에서 카카오 붙일 때 클로드가 그 메모대로 "지난번 적어두신 거대로 IAM 항목부터 같이 보겠습니다" 하고 들어가는 걸 보면서 잠깐 신기해했고, 그 이후로 또 한동안 안 건드리고 있었거든요. 알림 사건이 풀린 그 밤에 그 메모 파일을 다시 열었어요. 카카오 한 단락만 외롭게 들어가 있는 파일이었어요. 그 밑에 칸을 하나 더 만들었어요.
적은 내용은 짧았어요. "로컬 알림 시간이 한국에서 9시간 늦게 옴 → 시간대 설정 누락. 알림 초기화 시 tz.setLocalLocation(tz.getLocation('Asia/Seoul')) 같은 한 줄 먼저 박아 둘 것." (그 시간대 한 줄까지 통째로 정리해 둔 알림 붙이는 프롬프트는 나중에 따로 만들어 뒀어요.) 그 한 줄에 사건이 일어났던 정황도 같이 적었어요. "짧은 간격 테스트로는 안 잡힘. 사용자가 설정하는 그 시간 그대로 다음 날까지 기다려 보는 검증을 거쳐야 잡힘." 카카오 단락 밑에 알림 단락이 한 칸 더 늘어난 그 화면이 좀 묘하게 든든했어요. 두 개짜리 표가 된 거예요. 처음 한 줄짜리였던 노트가 그날 두 줄짜리 노트가 됐어요.
며칠 뒤에 두 번째 앱 만들 때 알림 기능을 또 붙이게 됐어요. 매칭 앱이었는데, 거기도 정해진 시간에 "오늘의 매칭" 같은 알림이 가야 했거든요. 클로드한테 알림 기능 붙여 달라고 한 줄을 보냈더니, 답이 한 줄로 끝나지 않고 시작부터 "지난번 적어 두신 메모대로 시간대 설정부터 같이 잡고 가겠습니다" 하고 들어가더라고요. 그 다음에 알림 예약하는 줄을 만들고, 빌드 한 번 돌리고. 폰에 깔고 다음 날까지 기다렸어요. 그대로 왔어요. 한 번에요.
그 한 번에 정확한 시간으로 알림이 떴다는 사실이 그날 저녁에 좀 묘했어요. 같은 함정이 두 번째 앱에서 처음부터 풀려 있었어요. 카카오 메모를 처음 적었던 그 아침엔 "이게 진짜 일을 할까" 싶었던 게, 두 번 연속으로 일을 하는 걸 보면서 "아, 이게 일을 하는구나" 하는 게 손에 잡혔어요. 그 다음부터는 큰 사건이 한 번씩 풀릴 때마다 "이건 그 노트에 한 단락 더 넣어야겠다" 하는 게 거의 반사가 됐어요. 거창한 정리가 아니라, "언제 이런 증상이 났고, 원인이 뭐였고, 다음에 같은 자리에서 빠지지 않으려면 어디부터 손대야 한다" 정도의 메모 한 단락씩요.
지금 그 노트엔 표 비슷한 게 한 칸씩 늘어나 있어요. 카카오 INTERNAL, 알림 9시간, 그 뒤로 붙은 안드로이드 예약 알림, 아이폰 뱃지, 시뮬레이터 빌드 직후 아카이브를 만들면 마켓에 못 올린다는 자리 같은 거요. 사건 하나하나는 그 자리에서 풀고 나면 또 잊혀요. 한두 달 지나서 다른 앱에서 비슷한 자리에 다시 들어가면 "어, 이게 뭐였더라" 하는 자리가 또 와요. 그때 그 노트가 일을 해요. 제가 한 번 풀었던 길을 제가 다시 찾아 들어가는 게 아니라, 도구가 그 길을 기억해 두고 다음 앱에서도 그대로 깔아주는 식이에요.
알림 사건이 풀린 다음 며칠 동안 한 번씩 떠올랐던 게, 만약 그 아침에 제가 폰을 안 봤다면 어떻게 됐을까였어요. 모임 안의 다른 분들 중에 "알림이 새벽에 와요"라고 따로 톡 주실 분은 아마 거의 없었을 거예요. 그분들 입장에선 "아 알림이 좀 이상하게 오네" 하고 끄거나, 아니면 그냥 알림 자체를 꺼두거나 했을 가능성이 높잖아요. 그러면 첫 앱에서 가장 의미 있다고 스스로 으쓱했던 그 기능이 사실은 가장 망가져 있는 기능이었던 채로 한 달이고 두 달이고 굴러갔을 거예요. 코드 한 줄이 빠져 있다는 이유로요.
알림 사건 풀린 그 밤에 클로드가 마지막에 한 줄 더 보탰던 게 기억나요. "같은 패턴이 안드로이드 12 이상에서 또 다른 형태로 나타날 수 있어요" 같은 한 줄이었어요. 그땐 그 한 줄을 "그래요 그것도 봐둘게요" 정도로만 받고 노트엔 따로 안 적어뒀어요. 그 한 줄이 진짜로 일이 됐다는 건 그 다음 주 어느 저녁에 알게 됐고, 그건 또 다른 한 단락이 노트에 추가되는 사건이 됐어요. 노트가 그렇게 한 줄씩 한 줄씩 자라요. 처음 카카오 한 줄로 시작한 게 지금은 한 화면을 채우는 표가 됐어요. 거기 적힌 사건들이 다 한 번씩 새벽을 잡아먹은 자국이고, 그 자국이 다음 앱에선 한두 시간으로 줄어드는 자리이기도 해요.
기도모임 앱이 그 주에 "앱답게" 살아가기 시작한 느낌이 들었어요. 빌드가 폰에 깔리는 거랑, 그 안에서 정해진 시간에 알림이 한 번 떠 주는 거랑은 또 다른 무게였어요. 잠금 화면에 "기도모임"이라는 글자가 적힌 알림이 정확한 시간에 한 번 떠 있는 걸 그 다음 주 어느 저녁에 봤어요. 그게 어쩌면 그 두 달 동안 본 화면 중에 첫 빌드가 폰에서 돌던 그 새벽 다음으로 묘한 한 컷이었어요.

