습관만들기 Pawbit TIL 7
초반 경제를 숫자로 돌려 보니 3주가 나왔다
앱 전체를 놓고 개선안 리포트를 뽑아 보게 했다. 맨 앞에 온 건 초반 경제였다. 초기 포인트 0에 케어 비용을 올린 조합으로 돌려 보니, 습관이 1개뿐인 사용자는 3일째에 강아지가 아프고, 치료(꿈 조각 5개)와 재발을 되풀이하다 첫 퍼즐을 완성하기까지 약 3주가 걸렸다.
- 판단: 밸런스는 느낌보다 숫자로 먼저 돌려 본다. 가장 적게 쓰는 사용자로 돌려 보면 만든 사람이 못 느끼는 바닥이 보인다.
막 데려온 강아지는 7일간 아프지 않게
그래서 입양(최초 케어 기록) 뒤 7일을 보호 기간으로 두기로 했다. 그동안은 강아지가 아프지 않는다. 막 데려온 강아지라는 설정과도 맞는다.
건강으로 묶어 두면 끝나는 날 한 번에 아파진다
보호 중에 상태를 0(건강)으로 고정하면 문제가 생긴다. 보호가 끝나는 순간에는 마지막 케어로부터 이미 7일이 지나 있어서, 건강에서 아픔으로 한 번에 뛴다.
그래서 0으로 묶지 않고 단계 2에서 멈추게(캡) 했다. 배고픔 표시는 그대로 진행돼서 케어가 필요하다는 건 보여 주되, 아픔(퍼즐 잠금과 치료비)만 막는다. 보호가 끝났을 때 이미 기준을 넘었으면 그때부터 아프다. 상태가 끊기지 않고 이어진다.
- 판단: 예외를 둘 때는 예외가 끝나는 순간을 먼저 그려 본다. 값을 통째로 고정하면 끝나는 날 몰아서 터진다. 필요한 것만 막는 쪽이 자연스럽다.
알림도 같은 규칙으로 옮겨야 했다
상태 알림은 앞선 TIL 6에서 상태가 바뀌는 시점을 미리 계산해 걸어 둔 것이다. 규칙에 보호 기간이 생겼는데 알림을 그대로 두면, 보호 중인데 아프다는 알림이 온다. 그래서 보호 기간 안에 걸린 아픔 알림은 보호가 끝나는 시점으로 옮겼다.
- 판단: 미리 걸어 둔 알림은 상태의 미래를 계산해 둔 사본이다. 상태 규칙이 바뀌면 사본도 같은 규칙으로 고쳐야 어긋나지 않는다.
광고는 하루 세 번까지
리포트의 다른 우선순위는 광고 파밍이었다. 광고로 슬롯·보너스 포인트·수정권을 얻을 수 있으니, 광고를 반복해 재화를 찍어 낼 수 있다. 셋을 합쳐 하루 3번으로 제한했다. 다 쓰면 버튼이 “내일 다시”로 꺼지고 상점 위에 “오늘 광고 N/3”이 뜬다.
카운터를 자정에 0으로 돌리는 코드는 따로 없다. 값을 2026-07-08:2처럼 날짜와 함께 저장하고, 읽을 때 날짜가 오늘이 아니면 0으로 본다. 날짜가 바뀌면 저절로 0부터 시작한다.
횟수는 광고를 끝까지 봐서 보상이 확정됐을 때(onUserEarnedReward)만 올린다. 광고를 열 때 올리면, 중간에 닫거나 불러오기가 실패해도 한 번이 날아간다.
- 판단: 날짜가 바뀌면 초기화되는 값은 날짜를 값 안에 같이 넣어 두면 초기화 작업 자체가 필요 없다. 보상과 관련된 셈은 보상이 확정된 자리에서만 한다.
실광고 ID는 배포 빌드에서만
AdMob 실제 광고 ID를 넣었다. 개발 중에 실광고를 띄워 누르면 무효 트래픽으로 계정이 제재될 수 있어서, 실 ID는 배포(release) 빌드에서만 쓰고 개발 빌드는 구글 테스트 ID로 갈라지게 했다. kReleaseMode는 지금이 배포 빌드인지 알려 주는 값이다.
ID는 두 종류라 헷갈렸다. 물결(~)이 붙은 앱 ID는 광고 SDK를 초기화할 때 쓰고 AndroidManifest에 넣는다. 슬래시(/)가 붙은 광고 단위 ID는 광고를 불러올 때 쓰고 코드에 넣는다. 단위 ID만 실 ID로 바꾸고 매니페스트를 테스트 앱 ID로 두면 실광고가 안 나온다. 광고 단위 하나를 슬롯·포인트·수정권 세 자리에서 같이 써도 된다.
광고 단위 ID를 공개 저장소에 올려도 되는지도 확인했다. 이 ID는 배포된 앱 파일에서 누구나 꺼내 볼 수 있는 클라이언트 식별자라 숨길 대상이 아니다. 숨겨야 하는 건 새어 나가면 권한이 생기는 것들, 곧 API 키·토큰·키스토어 비밀번호다.
- 판단: 코드에 넣으면 안 되는 것의 기준은 보이느냐가 아니라, 새어 나가면 남이 내 권한으로 무엇을 할 수 있느냐다.