Flutter 앱 개발기 (3/5) — 콰이어트 개발기: Riverpod와 Play Store 등록
Flutter로 텍스트 뷰어 앱을 만들고 Play Store에 올리기까지의 과정
핵심 요약
- Flutter + Riverpod + Hive 스택으로 텍스트 북리더 앱 "콰이어트"를 개발했다
- Claude Code와의 페어 프로그래밍으로 개발 속도를 높였고, 하네스 구조를 앱 개발에도 적용했다
- Play Store 등록 과정에서 구글 심사 기준과 메타데이터 준비의 중요성을 경험했다
배경
텍스트 파일로 소설이나 기술 문서를 읽을 때 기존 앱들이 만족스럽지 않았습니다. 기능은 많은데 정작 텍스트를 편하게 읽는 데 집중한 앱이 드물었습니다. 배경, 폰트, 줄간격, 페이지 넘김 — 읽기에 집중할 수 있는 최소한의 설정만 제공하는 깔끔한 앱을 만들고 싶었습니다.
동시에 Flutter 앱 개발 경험을 쌓고 Play Store 등록까지 경험하고 싶었습니다. 콰이어트는 이 두 가지 목표를 위한 프로젝트입니다.
본문
1. 기술 스택 선택
Flutter: 크로스플랫폼 개발이 가능하고, UI 커스터마이징이 자유롭습니다. 텍스트 뷰어는 UI가 핵심이기 때문에 Flutter의 위젯 시스템이 적합했습니다.
Riverpod: 상태 관리 라이브러리. Provider의 후속 버전으로, 타입 안전성과 테스트 용이성이 개선되었습니다. 텍스트 뷰어에서 관리해야 할 상태(현재 페이지, 폰트 설정, 밝기, 책갈피)가 많아서 체계적인 상태 관리가 필요했습니다.
Hive: 로컬 저장소. 사용자 설정, 읽기 진행 상황, 책갈피를 기기에 저장합니다. SQLite보다 설정이 간단하고, 키-값 저장에 적합합니다.
2. UX 설계 — "읽기"에만 집중
콰이어트의 UX 원칙은 단순합니다: 화면의 90%는 텍스트에 할당합니다.
핵심 기능: - 파일 불러오기: .txt, .epub 파일 지원 - 커스텀 폰트/줄간격/배경: 5가지 테마 제공 (기본, 세피아, 다크, 블랙, 그린) - 페이지 넘김: 탭, 스와이프, 볼륨 버튼 선택 - 책갈피: 위치 저장 및 복원 - 진행률 표시: 현재 위치 백분율
뺀 기능이 더 중요합니다: - 소셜 기능 없음 (공유, 댓글, 리뷰) - 서버 연동 없음 (로그인 불필요) - 광고 없음 (읽기 방해 요소 제거)
"조용히 읽는다"는 앱 이름 그대로의 경험을 제공하는 것이 목표입니다.
3. Riverpod 상태 관리 실전
텍스트 뷰어에서 관리해야 할 상태:
- ReadingState: 현재 파일, 현재 위치, 전체 길이
- ThemeState: 폰트 크기, 줄간격, 배경색, 글자색
- BookmarkState: 저장된 책갈피 목록
- SettingsState: 페이지 넘김 방식, 화면 꺼짐 방지 등
Riverpod의 StateNotifier로 각 상태를 독립적으로 관리합니다. 상태 간 의존성은 ref.watch로 반응형으로 처리합니다.
실전에서 배운 점: 상태를 너무 세분화하면 Provider가 폭발적으로 늘어납니다. 관련 있는 상태는 하나의 StateNotifier로 묶는 것이 관리하기 편합니다. 예를 들어 폰트 크기와 줄간격은 별도보다 ThemeState 하나로 묶는 것이 낫습니다.
4. Claude Code 페어 프로그래밍
콰이어트 개발에서 Claude Code의 역할: - 위젯 구현: 복잡한 커스텀 위젯(페이지 뷰어, 설정 패널)의 초안 작성 - 상태 관리 설계: Riverpod Provider 구조 설계 및 리팩토링 - 버그 수정: Flutter 빌드 에러, 상태 불일치 문제 진단 - 테스트 작성: 위젯 테스트, 상태 테스트
하네스 구조(CLAUDE.md, 스킬, 메모리)를 앱 개발에도 적용했습니다. 기술 에이전트와 동일한 구조로, 프로젝트의 규칙, 결정 사항, 시행착오를 체계적으로 관리합니다.
5. Play Store 등록 과정
앱 개발보다 Play Store 등록 준비가 더 까다로웠습니다.
준비물: - Google Play Developer 계정 (등록비 $25) - 앱 아이콘 (512x512) - 스크린샷 (최소 2장, 권장 8장) - 기능 그래픽 (1024x500) - 앱 설명 (한국어 + 영어) - 개인정보 처리방침 URL
심사 과정에서 주의할 점: - 콘텐츠 등급: 설문 기반으로 결정됨. 텍스트 뷰어는 "모든 연령" 가능 - 타겟 연령대: 어린이 대상이 아님을 명시해야 함 - 데이터 수집 선언: Hive 로컬 저장소만 사용, 외부 전송 없음을 명시
등록 후 심사까지 약 3일 소요되었습니다.
시행착오
epub 파싱의 복잡성: .txt는 간단하지만 .epub은 HTML + CSS + 이미지가 포함된 압축 파일입니다. epub 파서 라이브러리에 의존하면서도 커스텀 렌더링이 필요해서 예상보다 시간이 많이 걸렸습니다.
볼륨 버튼 페이지 넘김: 안드로이드에서 볼륨 버튼을 캡처하려면 플랫폼 채널이 필요합니다. Flutter 순수 Dart로는 불가능하고, Kotlin 네이티브 코드를 추가해야 했습니다.
마무리
콰이어트는 "간단한 텍스트 뷰어"로 시작했지만, Flutter 앱 개발의 전 과정(설계, 구현, 테스트, 배포)을 경험하는 프로젝트가 되었습니다. 기술적으로 화려한 앱은 아니지만, 하나의 기능(읽기)에 집중한 덕분에 완성도를 높일 수 있었습니다.
댓글
댓글 쓰기