初めに
2025年4月よりオンラインスクールでJava / Spring Bootの学習を行い、転職活動に向けてポートフォリオを作成しました。
この記事では、工夫した点や躓いた点をまとめています。
自分のアウトプットとして残すと同時に、今後学習する方の参考になれば幸いです。
今回作成したポートフォリオ【Revox】に関する制作経緯やAPIエンドポイント、ER図などはGitHubリポジトリを参照ください。
工夫した点
READMEにも記載していますが、以下の点はスクールカリキュラム外の独自実装になります。
-
JPA・Flywayの導入
-
外部AI APIの実装
-
Spring Security+JWTを利用した認証認可
-
Dockerによるコンテナ化
-
無料枠サービスを活用したデプロイ(運用継続を想定)
ポートフォリオは私が自力で初めて作ったアプリケーションです。「転職後に使われなくなるのは寂しい」と思い、現場で利用される仕組み+無料で継続運用を条件に設計しました。
苦労した点
ここからが本題です。実際に数日単位で詰まった点を中心に記録します。
- JPAとFlyway
JPAはSpring標準でサポートされており、アノテーションベースでDDLを自動生成できるため、開発効率が非常に高いのが特徴です。
単体ではそこまで苦労しなかったのですが、今回はFlywayを併用していたため、ddl-auto update を使うとマイグレーションスクリプトとの差分を見逃す可能性があることに気づきました。
そのため validate を使用し、スクリプトとの差分があればエラーを出すようにして検証目的で利用しました。
本当に大変だったのは 本番環境(IaaS+コンテナ)でFlywayが起動できなかったことです。
数日間ログを追いかけ、AIに聞いても「依存関係を見直せ」としか返ってこず完全に行き詰まりました。
最終的に調査を重ね、原因は以下でした:
-
Flyway 10.0以降、データベースサポートが flyway-core から分離された
-
flyway-core と flyway-database-postgresql を同時指定していたため、古いドライバが優先され「Unsupported Database」エラーが発生
不要な flyway-core を削除するだけで解決できたのですが、ここに気づくまで数日間溶かしました。
- Spring SecurityとJWT
Spring Securityは依存関係を注入するだけで認証・認可を実現できる強力な仕組みですが、内部の動作が見えにくく、学習に苦労しました。
現在は最低限の設定のみですが、セキュリティ知識はエンジニアとして必須のため、改めて腰を据えて学習し直す必要があると感じました。
- AI機能(Gemini)
無料で利用できるLLMとしてGeminiを選択しましたが、SDKの種類が複数あることが大きな壁になりました。
最初はVertex AI SDKで実装し、動作するがIDEで非推奨警告が消えない問題が発生
調べた結果、公式では「簡易版」「Vertex AI版」に加えて、両方を統合した「GenAI SDK」があることが判明
この時点で、AIが提案してくるコードがどのSDK向けか判断できず大混乱。
そこで公式リファレンスやGitHub READMEを何度も読み込み、AIとも壁打ちを繰り返してようやく実装に成功しました。
「AIを使いながらも、最終的には自分の手で調べ切ることが大事」と痛感しました。
- デプロイ
バックエンド領域外ですが、ポートフォリオを公開するためには必須の工程です。
GCPでの試行錯誤
AWSは学習中に無料枠を使い果たしたため利用不可
GCPのVM(e2-micro)は永年無料だが、性能不足でコンテナビルドできず
Cloud Build+Artifact Registryを活用し、VMにコンテナを展開する方法を検討
しかしサービスアカウント権限や環境変数設定で行き詰まり断念しました。
Render+SupaBaseに切り替え
MySQLでDDLを記述していたが、無料で使えるBaaSに互換性がなくPostgreSQLへ移行
OCIの無料VMも検討したが登録で問題発生し解決に時間がかかるため断念
この移行の過程でも数多くの躓きがありました。
躓き1:リージョン不一致
RenderとSupaBaseのリージョンが異なり、DBアクセス不可に。
数日悩んだ末に発覚し、作り直して解決。
躓き2:DDLが実行されない
DB URLを何度確認しても間違っていないのにDDLが作成されず。調べた結果、RenderはIPv4のみ対応、SupaBaseはIPv6 URLを返していたのが原因。
URLをIPv4に修正して解決。
躓き3:コールドスタート問題
Renderの無料枠では、15分アクセスがないとコンテナが停止。再アクセス時にタイムアウトが発生。
GitHub Actionsで5分おきにcurlを叩くよう設定しましたが、遅延があり完全には防げず。
最終的に外部サービスを使い、安定したウォームアップを実現しました。
終わりに
今回の記事では、特に数日間を費やしたトラブルとその解決方法を中心に記載しました。
まだまだ知識不足を痛感していますし、ポートフォリオも改善や追加機能が必要です。
それでも、ゼロから作り、実際に公開・運用できる形にしたことはこれまでの学習の成果だと思います。
今後も継続的に学習し、より良いシステムを開発できるエンジニアを目指します。
最後までご覧いただきありがとうございました。
注意事項
本記事は学習中の私がポートフォリオ作成の中で得た知見をまとめたものです。内容に不正確な点や誤りが含まれる可能性があります。