서버 없이 학습 앱을 만든다는 것 — KotoSense의 선택
계정도 서버도 없는 앱은 무엇을 포기하고 무엇을 얻는가. KotoSense 1.0을 그렇게 만든 이유와, 그 대가로 설계에 들어간 것들.
KotoSense 1.0에는 로그인 화면이 없습니다. 서버도 없습니다. 앱을 설치하고 레벨을 고르면 바로 첫 세트가 시작되고, 학습 기록은 기기 안에만 남습니다. 이건 “아직 못 만들어서”가 아니라 처음부터 정한 것입니다. 왜 그랬는지, 그리고 그 결정이 설계의 어디까지 번졌는지를 적어둡니다.
학습 기록은 누구의 것인가
문법 앱의 데이터는 “어떤 문제를 언제 틀렸는지”입니다. 개인정보로서 민감하지는 않지만, 그렇다고 우리가 가져야 할 이유도 없습니다. 서버에 두면 할 수 있는 일이 늘어납니다. 기기 간 동기화, 통계, 랭킹, “다른 학습자의 73%가 이 문제를 틀렸습니다” 같은 문구. 그런데 그 기능들 중 학습에 실제로 도움이 되는 것을 골라내 보면 거의 남지 않았습니다. 랭킹과 스트릭은 학습이 아니라 앱을 여는 습관을 만드는 장치이고, 우리는 재촉하지 않기로 했습니다.
남는 것은 동기화뿐이었습니다. 이건 “설정 > 데이터 > 내보내기”로 대신했습니다. 기기를 바꿀 때 파일 하나를 옮기면 됩니다. 우아하지는 않지만, 그 대가로 개인정보처리방침이 한 줄로 요약됩니다. 계정이 없고, 서버가 없고, 광고도 없습니다.
서버가 없으면 설계가 달라지는 곳
서버가 없다는 건 “저장 위치가 다르다”로 끝나지 않습니다. 몇 가지가 앱 안으로 들어와야 합니다.
콘텐츠 검수 상태. 서버가 있으면 검수된 콘텐츠만 내려보내면 됩니다. 없으면 앱 번들에 초안이 같이 실립니다. 1.0은 사람 검수 전 초안을 그대로 싣고 출시하기로 했고, 대신 화면마다 “검수 전”이라고 표시합니다. 숨기는 대신 적는 쪽을 택했습니다.
정답이 바뀔 때. 콘텐츠 오류를 고쳐서 정답이 바뀌면, 이전에 그 문제를 푼 기록은 어떻게 되는가. 서버가 있으면 마이그레이션 한 번이지만, 기기마다 흩어진 기록은 건드릴 수 없습니다. 그래서 문제마다 answerVersion을 두고, 정답이 바뀌면 번호를 올립니다. 옛 시도는 기록에 남되 통계에서는 빠집니다. 항목과 문제의 ID는 절대 바뀌지 않습니다.
복습 알림. 푸시가 없으니 알림은 기기 안에서 예약합니다. 볼 문형이 있는 날 하루 한 번, 3일치만 미리 잡습니다. 앱을 열지 않으면 알림도 끊깁니다. 처음엔 한계처럼 보였는데, 지금은 이게 맞는 동작이라고 생각합니다. 앱을 안 여는 사람에게 계속 알림을 보내는 건 재촉이니까요.
신고. 오류 신고 버튼은 메일 앱을 엽니다. 서버가 받는 게 아니라 사용자가 보냅니다. 메일에는 앱 버전과 문제 ID가 자동으로 들어가고, 우리는 답장하고 고친 뒤 메일을 지웁니다.
잃은 것
솔직하게 적으면, 두 가지를 잃었습니다. 첫째, 사용자가 얼마나 있는지 모릅니다. 스토어 다운로드 수 외에는 아무 숫자도 없습니다. 둘째, 어떤 문제가 유난히 많이 틀리는지 모릅니다. 콘텐츠를 개선할 가장 좋은 신호를 포기한 셈입니다. 이건 나중에 “이 기록을 익명으로 보낼까요?“를 사용자가 켤 때만 보내는 방식으로 되찾을 수 있다고 봅니다. 기본은 계속 꺼진 채로.
그래도 다시 고른다면
같은 결정을 합니다. 1인 스튜디오에서 서버는 기능이 아니라 부채입니다. 한 번 만들면 계속 지켜야 하고, 지키지 못하면 사용자 데이터가 다칩니다. WhenWeave처럼 두 사람의 시간을 맞추는 앱은 서버 없이는 성립하지 않아서 만들었지만, 혼자 공부하는 앱은 혼자 있어도 됩니다.