はじめに
2020年、日本に住んで日本語を勉強していたとき、「こんなアプリがあったらいいな」と思いました。でも、仕事や勉強が忙しくて、なかなか作る時間がありませんでした。リポジトリだけ作って、何もしない時間が3年半も続きました。
2026年、AIを使う開発(Claude Codeなど)を始めてから、少しずつ形になっていきました。まるで一緒に考えてくれる友達ができたようで、6年間止まっていたプロジェクトが、やっと完成しました。それが日本語マスター(Nihongo Master)です。漢字と文法をSRS(何回も復習する方法)で勉強できて、リスニングの問題やN5からN1までの模擬試験もできるアプリです。
一人で、バックエンド・Web・アプリ・管理画面・インフラを全部作りました。技術を選ぶときの参考になればうれしいです。
5つのリポジトリに分けました
リポジトリ内容
backend
API(Spring Boot)
frontend
勉強する人が使うWebサイト(React)
app
スマホアプリ(Expo / React Native)
admin
管理画面(React)
infra
AWSへのデプロイ(CloudFormation)
Web・アプリ・管理画面は同じバックエンドを使っています。3つとも同じ作り方(アーキテクチャ)にしたので、直すときにやりやすいです。
バックエンド:Spring Boot + DDD + TDD
- Java 21 / Spring Boot 3.3 / Maven
- ログイン:Spring Security + JWT
- データベース:PostgreSQL 16 + Flyway、キャッシュ:Redis 7
- ファイルの保存:S3、メール送信:Amazon SES
- テスト:JUnit + H2(43個のテストファイル)、データベースの変更履歴36個
JWTの仕組み: ログインしたら15分だけ使えるトークンと、7日間使えるトークンをもらいます。トークンを新しくするたびに、古いトークンをRedisから消して、新しいトークンに変えます。こうすると、もしトークンを盗まれても、気づきやすくなります。
Web・アプリ・管理画面の作り方
使った技術
Web
React 19, Vite, TanStack Query, Zustand, React Router v7, Tailwind CSS v4
管理画面
上と同じ + TanStack Table, Recharts
アプリ
Expo SDK 57, Expo Router, NativeWind, Zustand, TanStack Query
主な機能は、漢字の勉強(書く順番のアニメーションもあります)、文法の勉強、リスニング、進み具合が見られるダッシュボード、模擬試験(有料)、支払いの管理です。
スマホアプリだけの機能
- 指紋や顔でロックできる機能(
expo-local-authentication) - プッシュ通知、通信を安全にするSSLピンニング、エラーを見つけるSentry
- 支払いはRevenueCatを使っています。Webhookが来たら、まず本物かどうか確認してから、支払いの情報をデータベースに保存します
- アプリを更新するとき、JSやファイルだけならすぐに配信できます。でも、ネイティブの部分を変えたときは、いつも通りストアの審査が必要です
インフラ:CloudFormationで5つに分けてデプロイ
1つの大きいスタックにしないで、5つの独立したスタックを順番にデプロイしています。理由は、途中で失敗しても(多いのはECSやALBのヘルスチェックの問題です)、失敗した部分だけをロールバックできるからです。もうできているデータベースやフロントエンドには影響しません。
- ECSを作る前にECRを先にデプロイします。そうすると「イメージがない」というエラーを防げます
DeploymentCircuitBreakerを使って、うまくいかないときは早めに失敗させます- GitHub ActionsとAWSはOIDCでつなぎます。長く使えるアクセスキーを保存しなくてすみます
- 構成:ECS Fargate + API Gateway、RDS PostgreSQL + ElastiCache Redis、S3 + CloudFront、アプリのビルドはExpo EAS
CloudFormationのテンプレートは、全部で12個あります。
おわりに
技術は、Web、アプリ、管理画面、API、AWSという、よくある組み合わせです。でも、これを一人で(しかも働きながら)作れたのは、AIと一緒に開発したからだと思います。3つのアプリを同じ作り方にすることや、JWTの仕組みを決めることなど、AIと話しながら決められたことがとても役に立ちました。
2020年に「こんなアプリが欲しい」と思ってから6年、やっと自分でも使えるアプリになりました。「作りたいものはあるけど、時間がない」という人の参考になればうれしいです。