はじめに
育休中、ギャン泣き育児の合間に**自分のメンタル状態をスコア化&グラフで可視化できるWebアプリ「TOFU NOTE」(豆腐ノート)**を個人開発し、バージョン0.1.0をリリースしました!
- サービスURL: https://tofunote.takoscreamo.com/login
- UIサンプル:
自己紹介
- 文系卒 → エンジニア歴9年(Webエンジニア6年)
- バックエンドを中心にうっすらフルスタックエンジニア
- 主な技術スタック:
PHP(Laravel)3年 / Vue.js3年 / C# 3年 / PL/I 3年
個人開発やヘルプ業務でGo, Next.js, Flutter, Unityも経験 - 現在は育休中。ギャン泣き育児の片手間でコツコツ開発中
アプリを作ろうと思ったきっかけ
- 自分は豆腐メンタルでよく落ち込みます。なので普段からiPhoneのメモに「その日の元気度(1〜10)」と日記を記録しています。
- これをすると気分が沈んだ時でも「今どれくらい落ち込んでるか?」「以前の自分と比べてどう?」と俯瞰できて少し冷静になれる気がします。
- ただiPhoneのメモだと記録は手軽でも、過去との比較や平均の見える化ができないので、「自分が欲しいアプリを作ろう」と思ったのが、開発のきっかけです。
- 加えて現在ゆるめに転職活動中なので、ポートフォリオ作成も兼ねて開発しました。
技術スタック
分類 | 技術 |
---|---|
バックエンド | Go, Gin, 軽量DDD・オニオンアーキテクチャ |
フロントエンド | React, Next.js (App Router), TailwindCSS |
インフラ | Terraform, AWS Lambda, Neon, Vercel, Cloudflare |
“実務で使える”を意識して選定しました。
Githubリポジトリ一覧
技術的なこだわり・工夫
バックエンド
-
- スコア記録という超シンプルなデータ構造のアプリですが、学習のためにあえて軽量DDDとオニオンアーキテクチャを採用しています。
- 依存関係はオニオンアーキテクチャ準拠
- ドメイン層:他のどの層にも依存しない
- ユースケース層:ドメイン層にのみ依存
- リポジトリ層:インターフェースに従って永続化処理を実装
- ドメイン設計
- メンタルスコアは値オブジェクトとして定義しバリデーションルールやJSON変換を集約しました。
- 現状はドメインルールが少ないですが、今後のバージョンアップでルールの追加やユースケース分離を検討しています。
-
JWT認証
- セッション認証の実装経験はありましたが、今回はステートレスなJWT認証を学習目的で導入しました。
- また、サーバーレス環境(Lambda)との相性からもステートレスな認証方式が適していました。
- 使用ライブラリは golang-jwt/jwt。
- トークンからユーザーIDを検証・抽出し、リクエストのコンテキストに格納することで、後続処理で簡単に参照できる設計にしました。
-
テスト
- テーブル駆動テストで可読性・保守性UP。
- OpenAPI+SwaggerUIでAPIの手動テストもブラウザから可能。
フロントエンド
-
最小の操作で記録できるUX設計
-
自動リフレッシュ付きAxios
- JWTの有効期限切れ(401エラー)に備え、リフレッシュトークン機構をAxiosに組み込みました。
- 具体的には、401時の自動リフレッシュ、多重リフレッシュ防止、失敗リクエストの自動リトライを実装しました。
-
型安全なAPI通信
- openapi-typescript を用いて、OpenAPI仕様書(YAMLファイル)からAPIの型定義を自動生成。
- API設計と型のズレによるバグを防ぎ、型安全に開発できるように意識しました。
インフラ
-
コスト最重視
- 個人開発はインフラ費用で死にがちなので、
- なるべく無料
- でもスケール可能
- サーバーレス(AWS Lambda+API Gateway)で従量課金
- Neon, Vercel, Cloudflareも無料で活用
- 実際にかかった費用は「ドメイン取得770円+API Gateway 0.01ドル/月」のみでした。
- 個人開発はインフラ費用で死にがちなので、
-
運用の手間も最小化
GUIで手動構築するよりもコードで管理した方が、AI(Cursor等)のサポートが受けやすいと思ったためTerraformを採用しました。
その他
-
個人情報は一切持たない設計
メールアドレス・パスワード不要のゲストログイン。
今後もOAuth連携で個人情報は持たない方針。 -
利用規約
日記データはセンシティブな情報&AI分析で外部API連携も予定しているため、利用規約で明記。
苦労した点・学び
-
GoとDDDの相性問題
- Goでオニオンアーキテクチャ(クリーンアーキテクチャ)を実現する際に、以下のような課題に直面しました:
- コンストラクタやinterface経由の操作を自分で設計・実装する必要がある
- 構造体の不変性が保証されないため、フィールドの非公開化が必要
- Goはシンプルな言語仕様の一方で、設計ルールや慣習を自ら定義して守る必要があり、知見と判断力が問われると実感しました。
- こちらの記事が参考になりました。
- Goでオニオンアーキテクチャ(クリーンアーキテクチャ)を実現する際に、以下のような課題に直面しました:
-
AIの使い方
- 設計や技術選定が甘いと、AIに頼ってもイケてない実装になりがち。
- 結局普段からの学習が超重要だと思います。
-
Lambdaのログが見づらい
- Cloudwatchのログが追いづらく、オートマイグレーション失敗時などログすら出ずに苦戦しました。もっと良い方法があると思うので調べていきます。
-
Terraform難しい
- Terraformの初学者としては、構文やベストプラクティスがわからずCursorにおんぶに抱っこ状態でした。もっと理解を深めていきたいです。
-
育児との両立
- 開発の進捗が子供のご機嫌に左右されることが多々ありました。
- なので子供が寝てる時が実装のチャンスのそこでまとめて実装し、起きてる時間帯は子供を抱っこしながらスマホで設計や技術選定をChatGPTに相談というスタイルで進めました。
- 育休中に開発をしてみて復職後のイメージがかなり湧きました。子供が家にいる時の開発は横槍の頻度がエゲツないので保育園は必須。。
- いかにスマホと脳内だけで進められる仕事を細かく切り出すか が重要だと感じました。
- なお子供は順調にデカくなってて万々歳です。妻の多大な協力に圧倒的感謝・・・!!
インプット
- Go/Gin:
- React/Next.js:
-
DDD
- 過去に本を何冊か読んでて、実践するのは初めてでした。
- 書籍はドメイン駆動設計 モデリング/実装ガイドが内容がギュッとまとまっていてオススメです。
-
Terraform
- 概要だけ調べて、あとはAIとトライ&エラー
今後やりたいこと
- フロントエンドのPWA化でスマホアプリっぽく使えるように
- 睡眠時間や運動時間も記録してメンタルとの相関を見える化
- LLM API連携でAI分析機能を追加
- 日記にはタグ登録もできるようにしてより効果的に分析
- OAuth連携で複数端末対応
- コードレビューもAIを使っていきたい
- 正式リリースに向けて、データの永続性や安定運用を強化
- ※現在ベータ版につき、予告なくデータが削除される可能性があります(利用規約にも記載済み)あくまで“お試し版”として、気軽に使っていただけたら嬉しいです!
まとめ・感想
-
実際の開発期間は約2ヶ月ほどでした。AIの支援で爆速に感じていましたが、意外にも体感より長くかかっていました。
-
GoやTerraform初挑戦、Reactの復習、軽量DDDの導入、育児しながらの時間活用の工夫など、学びの多い個人開発でした。
-
もしこの記事やアプリが良かったと思っていただけたら、LGTM・ストックしていただけると励みになります!
-
X(@takoscreamo)でもゆるく発信中です!今後ともどうぞよろしくお願いします!