[個人開発] 立て替え管理アプリを開発しました
概要
個人開発でiOSアプリを作りました。開発開始から半年程度経過しているため忘れている部分は多いですが、思い出しながら背景や使用した技術などを書いていきます!
作ったアプリ: Tateca - ずっと使える立て替え管理アプリ
Tatecaは、友達やカップルとの立て替えを簡単に管理できるアプリです。一度グループを作成すれば、そのまま長期的に使い続けられます。グループ内で立て替えの記録を追加し合うことで、実質的な返済を行います。
個人的にはかなりアイコンがお気に入りです!
App Store
特徴
誰にいくら返すか一目でわかる
自分が関係している返済は色分けされます。返済する側は赤、される側は緑で表示。タップすると返済ができます。
立て替え一覧
トップ画面では最新5件を表示。”もっと見る”から全履歴が確認可能です。
簡単入力
割り勘の場合はワンタップで内訳の入力完了。細かい調整も可能です。
外貨にも対応
外貨での入力時に日本円とのレートを自動計算。返済予定額を日本円で表示します。
複数グループに参加可能
友達用・パートナー用など複数のグループを簡単に切り替えられます。
開発背景
- 実務でバックエンド開発のチャンスが!でも経験ゼロ...
- プライベートでの立て替え管理に悩んでいた
→よし、バックエンドの勉強がてら立て替え管理アプリを作ろう!
ターゲットユーザー
- 自分
- 立て替えの管理に悩むすべての人
- カップルや友達との日々の支払い
- 大人数での旅行や飲み会などの清算
- など
技術スタック
分野 | 使用技術 |
---|---|
iOS | Swift, SwiftUI |
バックエンド | Java, Spring Boot |
DB | MySQL, Redis |
インフラ | Docker, DigitalOcean |
CI/CD | GitHub Actions |
その他 | Firebase, OpenAPI |
iOS
アプリ開発のメインの目的はバックエンドの勉強。そのためクライアントの実装にはあまり時間を割きたくありませんでした。インターンを含めiOSは2年程度実務経験があります。その経験をもとに特に使い慣れているSwiftUIを選択しました。
アーキテクチャはMVVM。APIはURLSession、非同期処理はSwift Concurrencyで実装しているためロジックでサードパーティのライブラリは使用していません。実務ではAlamofire、Combineを使用しているので新しい学びがあり楽しかったです。アプリの規模にもよりますが、スレッドセーフなどを考えてこれからのアプリではSwift Concurrencyを採用したいなと思いました!
TatecaではUIデザインを開発前にあまり行なわなかったため、開発中にデザイン+iOSの実装を行う必要がありました。あーでもないこーでもないと奮闘しているうちに最終的にバックエンド以上の工数がかかってしまいました。大反省です。
バックエンド
言語はJava、フレームワークにはSpring Bootを選択。
当時iOSエンジニアとして働いていましたが、運よくバックエンドエンジニアとしてプロジェクトに配属される機会をいただきました。勉強のため、使用するであろう技術スタックを用いてAPIを開発しました。
- Tatecaの開発でバックエンドの知見を得る
- 実務で同じ様なプログラムを書いてみる
- シニアからレビューを受ける
- Tatecaに3を反映
上記を何度も繰り返すことで、早いスピードでバックエンドの技術的な成長をすることができました。
Javaはいわゆる”モダン”な言語ではないという認識だったため学習に抵抗がありましたが、SpringBoot・IntelliJの恩恵が凄まじく、普段Swiftを書いているときには考えられない体験を得られました。
特にアノテーションが衝撃で、ドラクエやモンハンでコードフリークを使用していた頃を思い出しました!
DB
DatabaseにはMySQLとRedisを選択。バックエンドと同様に実務で使用する予定だった技術を選択しました。
最初の数ヶ月程度はSQLの勉強のため、DBクライアントアプリを使用せずにあえてコマンド直打ちをしていました。
テーブルやkey設計はAPIの勉強と並行してチームのテックリードに協力をいただきました。やりたいこと・詰まっていることを説明して、複数の選択肢の良し悪しを壁打ちをしてもらうことで学習をしました。職場のメンバーは教えるのが好きな人が多く、完全プライベートなアプリにも関わらず協力をしてくれました。
とても感謝をしています。
インフラ
インフラにはDocker, DigitalOceanを選択しました。開発環境でDockerを使用しているので、アプリケーションは本番でもコンテナでの運用になります。
実務では社内のプライベートクラウドを使用しているため、Tatecaのインフラに関しては自分の興味から技術の選定をしました。
バックエンドエンジニアならAWSは使える様になりたいという謎の思いがあり、基本的なマネージドサービスの勉強から開始しました。
CaasとしてはECS・EKSなどがありますが金額・オーバーエンジニアリングを考えて、一旦EC2を使用することにしました。
しかし、docker compose up でサーバーが落ちない程度のスペックを確保するとEC2であっても月に$30程度のコストが発生してしまうことがわかりました。
そこで最終的にDigitalOcenanの使用を決定し、現在は月$10程度の費用でアプリケーションの運用を行なっています。運用開始後、ネットワークが原因で特定のキャリアから通信ができない問題に直面しました。この辺はネットーワークの勉強兼備忘録として後日記事にしようと思います。
(なんだかんだ各パブリッククラウドの無料枠でどうにかなりそうな気もするのでもうちょと調べてみます...)
CI/CD
実務ではJenkinsを使用する予定でしたが、さすがに今の時代GitHub Actionsを使用したいという思いがありこれを選択しました。yamlはGPT-4が書いてくれたので、ほとんど苦労することなくパイプラインの作成が可能でした。
その他
Firebase Authentication
APIの認証に使用。FirebaseAuthから取得したトークンをバックエンドに渡し、検証をしています。
Firebase Hosting
クライアントがiOSのため、メンテナンスモードや強制アップデートのためのConfigをデプロイ。また、Universal Linksのデプロイ先としても使用しています。
Firebase Analytics・Crachlytics
iOSのログを送信。
OpenAPI
APIの仕様書を管理。
今後の開発案
その1
問題点
外貨を取得するために外部のAPIを呼んでいる。無料枠では回数の制限があるため、現状の実装だとアプリがスケールした場合リミットに到達する。
改善案
クライアントからAPIを直接呼び出すのではなく間に何か挟む。そもそも無料枠では一日一回しか価格の更新を取れないため、毎回APIを叩く必要はない。Config Serverなどを用意して定期的に値を取得するのが良さそう。
Batchと組み合わせてFirebase Cloud FunctionやAWS Lambdaを一日一回発火?ちょっと考えてみる
その2
問題点
インフラに毎月$10かかっている。
改善案
Cloud FireStoreなどを使用すれば無料で済むがバックエンドの勉強のためにはサーバーを使用したい。より良い選択肢があるはずなので探してみる。
その3
問題点
マネタイズ動線が0。普通に赤字。
改善案
広告やサブスクを導入してみる
その4
問題点
レビュー動線が弱い。ASOで競合に勝てない。
改善案
アプリ内レビューの動線を改善し、ユーザーに星だけでもつけてもらえる様にしたい!!
その5
問題点
iPhoneを持っている人でないと使用できない。
改善案
Webで閲覧専用などを作る。React/Next.jsの勉強もしたいのでv0と協力して作成してみる
その6
問題点
iOSの作り込みが甘い
改善案
時間を見つけて改善する
その他
後日追記
あとがき
Tatecaの開発を始めてからリリースまで半年くらいかかりました。
- バックエンドの勉強をするぞ
- やっぱりアプリをリリースしたい
- どうせならみんなにも使ってもらいたい
上記の様な流れで目的がブレブレになったことが原因です。途中で変なことをし始めた場合にそれを正すのが目的のはずなのに、目的をコロコロ変えてしまって本末転倒でした。改めて目的、目標設定の重要性を学びました。
現状のダウンロード数は90、デイリーアクティブユーザーは5。当初は10回でもダウンロードされればすごいと思っていたのでめちゃめちゃ嬉しいです!今後もユーザーが増える様頑張ります!!
最後まで読んでいただきありがとうございました。Tatecaに興味を持っていただけた方は、ぜひApp Storeからダウンロードしてみてください!感想やフィードバックもお待ちしています!!
Discussion