모래게임 Sandrop TIL 30
고쳐도 또 안 되는 로그인
네 번을 고치고서야 뚫렸다
앞선 TIL 27에서 클라우드 저장은 실제로 요청이 들어올 때 붙이기로 미뤘다. 속으로는 출시하고 나서 붙일 생각이었는데, 막상 게임을 내고 보니 폰을 바꾸면 깬 레벨이 다 사라진다는 게 걸렸다. 깬 레벨을 지키는 건 요청을 기다릴 일이 아니었다. 그래서 첫 업데이트를 낸 날 바로 붙이기로 했다. 저장하려면 먼저 게임 서비스(Play 게임즈 — 구글이 게임용으로 제공하는 계정·저장 서비스)에 로그인이 돼야 한다.
붙인 뒤 내 폰으로 로그인을 해 보니 안 됐다. 하나를 고치고 다시 해 보면 또 안 됐고, 네 번을 고치고서야 뚫렸다. 원인이 넷이었고, 콘솔 쪽은 내가 직접 들어가 하나씩 맞췄다.
- 서명 지문 — 앱이 어떤 열쇠로 서명됐는지로 신원을 확인하는데, 개발 중에 쓰는 열쇠를 등록하지 않아 내 폰에서만 안 됐다
- 초기화 — 앱이 켜질 때 서비스를 한 번 깨워야 하는데 그게 빠져 있었다
- 동의 화면(로그인할 때 뜨는 권한 확인 화면) — 정식으로 공개하지 않으면 목록에 등록된 사람만 로그인된다
- 콘솔 설정 — 저장 기능을 켜고 테스터를 등록해야 했다
넷은 사는 곳이 다 다르다. 그런데 겉으로 보이는 건 “로그인이 안 된다” 하나였다.
- 하나를 고쳤는데 증상이 그대로면 “안 고쳐졌다”가 아니라 “원인이 또 있다”일 수 있다. 여러 시스템이 맞물린 기능일수록 그렇다
- 외부 서비스를 붙이는 일은 코드보다 콘솔 쪽 준비가 많다. 일정을 잡을 때 그 몫을 따로 본다
환영 인사는 떴는데 앱은 실패라고 했다
넷을 다 맞추고 다시 해 보니 화면에 구글 환영 인사가 떴다. 그런데 앱 안내는 “연결하지 못했습니다”였다.
한 화면에 성공과 실패가 같이 떠 있는 게 단서였다. 로그인 자체는 됐는데, 앱이 결과를 거꾸로 읽고 있었다. 그래서 로그인 뒤에 해야 할 동기화와 보상 지급을 통째로 건너뛰었다.
- 겉으로 성공한 것과 앱이 성공으로 읽은 것은 다르다. 화면이 서로 다른 말을 하면 그 틈이 원인이 있는 자리다
광고가 검게 뜨고 게임이 버벅였다
증상은 셋인데 원인은 하나였다
테스트하다 보니 전면 광고가 타이머와 닫기 버튼만 있고 안이 검었다. 게임도 평소보다 버벅였다.
원인은 화면 아래 배너였다. 게임 화면은 모래가 움직여야 하니 초당 60번 다시 그리는데, 배너가 그 안에서 매번 새로 만들어지고 있었다. 광고 뷰(광고 회사가 그리는 화면 조각으로, 앱이 직접 그리는 것보다 훨씬 무겁다)가 초당 60번 새로 만들어진 셈이다. 전면 광고도 배너와 같은 기반을 써서, 배너가 무너지면 같이 무너졌다. 배너를 한 번만 만들어 두게 하니 셋이 다 사라졌다.
- 증상이 여러 개면 원인도 여러 개일 거라 짐작하기 쉽다. 먼저 그것들이 무엇을 같이 쓰는지 본다
- 게임처럼 쉬지 않고 다시 그리는 화면에 광고 같은 남의 화면을 얹을 때는 그 비용을 따로 본다
며칠 전에 괜찮다고 보류한 항목이었다
버벅임은 앞선 TIL 27에서 한 번 짚었던 문제다. 그때 성능을 재 보려다 못 쟀는데, 실기기에서 해 보니 버벅임이 없어서 그 항목을 보류로 내리기로 했다.
그런데 그때 내가 확인한 빌드에는 배너가 없었다. 원래 있던 문제가 아니라 그 뒤에 넣은 배너가 만든 문제였다.
- “괜찮다고 확인했다”는 그 시점 빌드에 대한 판정이다. 그 뒤에 무엇을 넣었는지가 그 확인의 유효기간을 정한다
- 무거운 것을 새로 넣었으면 예전 확인을 근거로 넘기지 않고 다시 본다
클라우드 저장을 설계하며
앱에서 로그아웃을 시킬 수가 없었다
연동 해제 기능을 넣으려는데, 이 게임 서비스에는 앱이 부를 수 있는 로그아웃이 아예 없었다. 계정 관리는 서비스가 가져가 있다.
그래서 되는 것(올라간 기록 삭제)은 버튼으로 두고, 안 되는 것(계정 연결 해제)은 어디서 하는지 안내하기로 했다. 연동을 끄는 스위치도 넣어 봤다가 빼기로 했다. 스위치가 있으면 “끄기”와 “삭제”가 어떻게 다른지 설명해야 하고, 연동 상태도 셋으로 늘어난다.
- 앱이 못 하는 일은 “안 된다”로 끝내지 않고 어디서 되는지까지 알려 준다
- 기능 하나를 더하면 설명·상태·경우의 수가 같이 는다. 그것까지가 그 기능의 값이다
두 기기의 기록을 합칠 때 충돌이 없었다
클라우드 저장을 붙이며 내가 걱정한 건 충돌이었다. 두 기기에서 따로 놀다 합치면 어느 쪽이 최신인지 정해야 한다.
그런데 앞선 TIL 1에서 코인·하트를 지금 값이 아니라 변화 기록(코인 +50, 하트 -1)으로 쌓기로 정해 뒀다. 그러면 두 기기의 기록을 합집합으로 합치기만 하면 된다. 순서가 섞여도 전부 더한 값은 같으니 “어느 쪽이 최신인가”를 정하는 규칙 자체가 필요 없었다.
- 저장 구조를 정할 때 나중에 붙일 기능의 값까지 같이 정해진다. 값을 저장하면 합칠 때 규칙이 필요하고, 변화를 쌓으면 대개 필요 없다