가리봉랩스의 기본 전략은 다품종 소량 판매(?)다. 앱 퀄리티를 올려서 다운로드 수를 올리기보다 그 시간에 다른 앱을 더 만드는 전략이다. 하지만 며칠 만에 두 개의 앱을 릴리즈하고 보니 현실은 소량 판매가 아닌 제로에 수렴하고 있다. 그래서 어느 정도는 퀄리티를 올리고 스토어에 푸는 것으로 전략을 살짝 바꿨다. 세 번째 앱은 '독서 잔디'라는 이름의 독서 기록 앱이다. 잔디라는 이름에서 알 수 있듯이 깃헙 잔디에서 아이디어를 얻었다.

개발자 분들은 이미 잘 아시겠지만 깃헙 잔디는 커밋이나 PR 생성(또는 리뷰) 등의 프로젝트 기여도 수에 따라 그날의 잔디가 짙어지는 구조다. 이와 비슷하게 책 읽은 시간이 쌓일수록 잔디 칸의 색이 짙어지도록 구현했다. 구현 시작 전에 아이데이션(Ideation)은 ChatGPT와 함께 했다. 동료와 티타임을 갖는 느낌으로 편하게 대화를 시작했다. 이런저런 문답을 주고받는 중에 자연스럽게 깃헙 잔디가 떠오른 것이다.


기록은 하되 최대한 유저를 번거롭지 않게 하고, 나중에 단순한 형태로 시각화된 기록을 확인할 수 있게 하는 것이 앱의 주요 컨셉이다. 심지어 어떤 책을 읽었는지도 필수 입력 항목이 아니다. 이를 바탕으로 아래와 같은 MVP(Minimum Viable Product) 구현이 완료됐고, 대략 4일 정도 걸렸다.

이번에도 깃헙 저장소를 public으로 생성했다.
https://github.com/Hamjoon/reading-garden-ios
GitHub - Hamjoon/reading-garden-ios: A quiet companion app that lets users log reading without guilt or pressure
A quiet companion app that lets users log reading without guilt or pressure - Hamjoon/reading-garden-ios
github.com
이번 앱도 기능 자체는 간단하지만 기록이 쌓이는 조건을 정하는 데에 시간이 많이 걸렸다. 많은 고민 끝에 대략적으로 아래와 같이 정리해서 구현에 들어갔다.
- 기본 로직 - 독서 시작/종료
- '독서 시작' 버튼을 터치하면 타이머가 작동하며 시간 기록이 시작된다.
- '독서 종료' 버튼을 누르면 타이머가 멈추고 경과 시간이 기록된다.
- 기본 로직은 이보다 간단명료할 수 없다.
- 추가 로직
- 경과 시간을 페이지로 자동 환산해서 함께 기록한다. (내 맘대로) 5분 당 1페이지를 읽은 것으로 친다.
- 잔디 색상 구분을 위해 하루의 독서량을 4단계로 구분한다.
- 1 Level: 1~12 페이지
- 2 Level: 13~24 페이지
- 3 Level: 25~36 페이지
- 4 Level: 37페이지 이상
- 하나의 세션(독서 시작~종료)은 2시간(24페이지)으로 제한한다.
- 기록을 더 쌓고 싶으면 다시 세션을 시작한다. 시작 버튼만 터치하고 실제 독서를 안 했는데 긴 시간이 기록되는 것을 막기 위함이다. 이런 식으로 유저를 귀찮게 하고 싶지 않지만 다른 대안이 떠오르지 않았다.
- 2시간을 초과한 뒤에는 종료 버튼을 터치해도 기본 값(5분, 1페이지)만 기록된다. 무효 처리는 너무 심한 것 같아서 이렇게 했는데 더 약 오르려나..
이 외에도 세션 진행 중 날짜가 바뀌는 경우 등 소소한 예외 처리 조건들이 더 있다. 이상의 로직과 조건들을 잘 정리해서 Claude Code에게 넘겨서 나온 것이 지금의 결과물이다. 깃헙 잔디처럼 독서라는 행위만 하면 최대한 자동으로 기록이 쌓이게 하고 싶은데 아직까지는 해법이 떠오르지 않는다. 종이책은 아예 방법이 없을 듯하고 전자책은 API만 제공된다면 가능할 것 같다. 하지만 잠깐 찾아본 바로는 1위 업체인 '밀리의 서재'는 개인 독서 기록을 얻어올 수 있는 API를 따로 제공하지 않고 있다. 앱 자체적으로 기록의 정확도를 포기하고, 종료 버튼을 터치하지 않아도 기록이 되는 방향을 고민 중이다. 끝.
'개발 일지 > iOS앱 독서잔디' 카테고리의 다른 글
| 독서잔디(iOS) - v1.0 심사 등록 및 통과 (w/ Claude Cowork) (0) | 2026.01.16 |
|---|