습관만들기 Pawbit TIL 8
옛 색이 파스텔 타일 사이에서 튀었다
습관 색 팔레트를 파스텔로 바꿨는데, 이미 만들어 둔 습관에는 옛 진한 색 값(colorHex)이 그대로 남아 타일 배경에서 튀었다.
DB 구조는 그대로 두고 저장된 값만 바꾸면 된다. Drift의 마이그레이션(앱이 새 버전으로 올라갈 때 DB를 옮겨 주는 단계)은 보통 표에 칸을 더할 때 쓰지만, 이미 저장된 값만 고치는 데도 쓸 수 있다. 스키마 버전을 7로 올리고, 옛 8색을 파스텔 8색으로 하나씩 바꾸는 UPDATE만 넣었다.
- 판단: 팔레트나 설정을 바꿀 때는 앞으로 만들 것만이 아니라 이미 저장된 것도 같이 옮겨야 한다. 배포된 데이터를 정정하는 것도 마이그레이션의 일이다.
새 습관이 맨 앞에 끼어들었다
습관 순서를 손으로 바꾼 뒤 새 습관을 추가하면 맨 앞에 끼어들었다. 새 습관의 순서 값(sortOrder)이 기본값 0이라서다.
그렇다고 새 습관에 늘 맨 뒤 값(가장 큰 값 + 1)을 주면 반대쪽이 깨진다. 순서를 한 번도 안 바꾼 사람은 모든 습관이 0이고, 순서 값이 같으면 만든 시간순으로 선다. 여기서 새 습관만 1을 받으면 시간순 줄에서 튕겨 나간다. 그래서 전부 0이면 0을 그대로 주고, 순서를 바꾼 적이 있을 때(가장 큰 값이 0보다 클 때)만 맨 뒤 값을 주게 나눴다.
- 판단: 기본값 0이 아직 안 정했다는 뜻까지 겸하고 있으면, 새로 추가하는 쪽이 그 뜻을 깨지 않는지 봐야 한다. 순서를 바꾼 사람과 안 바꾼 사람 둘 다로 확인한다.
받침 있는 이름 뒤엔 ‘이가’
강아지 상태 알림은 “○○가 배고파요” 꼴이라 받침 있는 이름 뒤에서는 어색했다. 문법대로라면 ‘이’를 써야 하지만 ‘구름이가’처럼 ‘이가’를 붙이기로 했다. 그게 더 귀여워서다.
받침은 유니코드로 판별한다. 한글 음절은 유니코드에 규칙적으로 늘어서 있어서, 음절 코드에서 ‘가’(0xAC00)를 뺀 값을 28로 나눈 나머지가 받침 번호다. 0이면 받침이 없다. 한글이 아닌 이름에는 ‘가’를 붙인다.
- 판단: 규칙대로가 늘 정답은 아니다. 이 앱의 말투에는 문법보다 귀여움이 맞다. 다만 일부러 그렇게 정한 건 적어 두지 않으면, 다음에 누군가 문법대로 고친다.
DEV 패널은 왜 배포본에서 빼야 하나
개발하면서 홈 화면 맨 아래에 디버그 패널을 붙여 뒀다. 포인트와 꿈 조각을 공짜로 넣는 버튼, 케어 날짜를 하루씩 되감는 버튼, 잔고와 온보딩을 초기화하는 버튼이 들어 있다. 배포 빌드에서 이 패널을 빼는 한 줄 가드를 넣었는데, 이게 왜 꼭 필요했는지 물었다.
두 가지가 무너진다. 하나는 경제다. 재화를 공짜로 끝없이 찍을 수 있으면 습관을 하거나 광고를 볼 이유가 사라지고, 짜 둔 밸런스와 광고 수익이 통째로 무너진다. 다른 하나는 데이터다. 초기화 버튼은 확인도 없이 포인트와 습관 전체를 지운다. 사용자가 잘못 누르면 되돌릴 수 없다.
그래서 화면에서 숨기는 게 아니라 배포본에 아예 없어야 한다. kDebugMode는 지금이 개발 빌드인지 알려 주는 값인데, 빌드할 때 이미 정해지는 상수다. 배포 빌드에서는 이 조건이 거짓으로 접히고, 쓰이지 않는 코드를 걷어 내는 트리 셰이킹(tree shaking)으로 패널 코드가 앱 파일에서 통째로 빠진다.
- 판단: 사용자가 못 보게 하는 것과 앱에 없게 하는 것은 다르다. 개발용 도구는 숨기지 말고 뺀다. 한 줄 가드는 임시 안전핀이고, 출시 전에는 코드째 지운다.
되돌리기 힘든 구매엔 한 번 더 묻는다
스티커는 30포인트라 잘못 누르면 아깝다. 사기 전에 확인 창(showDialog, Flutter 기본 대화상자)을 띄웠다. 구매를 눌렀을 때만 진행하고, 취소하거나 창 바깥을 눌러 닫으면 멈춘다.
습관을 완료하는 순간에는 가벼운 진동(HapticFeedback.lightImpact)을 넣었다. 도장 애니메이션과 겹치면 찍었다는 손맛이 산다.
- 판단: 되돌리기 힘든 행동에는 확인을, 자주 하는 기분 좋은 행동에는 손맛을 붙인다. 둘 다 비용은 거의 없고 체감은 크다.