📝

Spring Boot + Docker + MySQL + MyBatis + Flyway構成のアプリケーションを生成AIで作成してみた

に公開

はじめに

Rehab for JAPANレセプトバックエンドエンジニアの @aragane です!
生成AIの活用が高まる中で、業務で使用している技術スタックを含めて0から作ってみたらどれくらいのものが出来るのかなと気になり、キャッチアップも兼ねて試してみました。

試してみての記録・備忘録に近い内容のため、気軽に読んで頂ければと思います。
後述の記事内でプロンプトや作成したソースコードを公開していますので、興味がある方は覗いてみてください☀️

使用した生成AI

  • ChatGPT-4o(Plus)
  • Claude 3.7 Sonnet(無償版)

対象読者

  • 生成AIの活用に興味がある方
  • SpringBootのアプリケーション開発を検討・学習している方

使用したプロンプト

AI_prompt_init.txt
Spring Initializrを使って後述の設定を含めたSpringbootプロジェクトを作成してほしいです。
作成作業が完了後、プロジェクトファイル一式をZIPファイルで出力してください。

#プロジェクトの目的
Mysqlのgroupbyによる集計処理と、Java StreamAPIのcollectors.groupingByによる集計処理の速度を比較する

#集計対象データの設定
・洋服の販売管理システムを想定システムとする
・利用者テーブルの年齢別の数を集計する処理で比較する
・利用者テーブルの想定データ数は100万行とする
・利用者テーブルのインデックスは、集計時に参照されるカラムに対して、適切に設定されていることを前提とする
・Javaでの実装方針は、①利用者テーブルから全件データリストを取得、②全件データリストに対して、StreamAPIで集計する

#検証環境
MacBook Air M1
IntelliJ IDEA 2023.2.5 (Community Edition)

#ビルドツール
Gradle Wapper(Gradle-Groovy)

#Javaバージョン
Java17(Amazon Corretto 17)

#Springbootバージョン
3.4.4

#サードパーティライブラリ・ツール
・Docker Compose
・Mybatis,MybatisGenerator
・flyway
・lombok

#Dockerコンテナに含めるもの(現段階での想定。必要に応じて追加・削除してください)
・Springbootアプリケーション
・Mysql
・flyway

#ソース管理
github

#その他要望
・「.gitignore」ファイルを作成する
・MySQLからのリソース取得はMybatisGeneratorで生成されたMapperを使用する
・MysqlのDDL及び利用者テーブルの初期データ100万の登録は、flywayにて実施する
・bootRun時のビルドでflyway migrateを行うようにする
・プロジェクト名:記事に基づいた任意のプロジェクト名を設定すること(githubのリポジトリ名にも使用する)
・REST APIを用いる
・READMEを作成する
・gradlew bootRunが成功すること

補足📝

  • Spring Initializr : SpringBootの雛形を簡単に作成してくれるツールのため指定してみた
  • 依存関係を合わせてほしかったため、JavaバージョンとSpringBootバージョンを記載
  • Macbookプロセッサの違いによって、前提となるJDKが変わるため記載(コンテキストに記憶させる狙いもある)
  • 「Dockerコンテナに含めるもの」については、前提知識の自信がなかったため、生成AI側に委ねる記載とした
  • 参考にしたプロンプト等は特になし。プロジェクトを開いた段階でbootRunができる状態を期待して記載

ChatGPT生成直後の成果物

コミット: 🔗0eb180e 参照

生成されたソースコードとREADMEを眺めてみての所感

生成されたREADME
# benchmark-mysql-vs-stream

このSpring Bootプロジェクトは、MySQLの `GROUP BY` 集計処理とJavaのStream APIによる `Collectors.groupingBy` 集計処理のパフォーマンスを比較することを目的としています。

## 利用技術

- Java 17(Amazon Corretto)
- Spring Boot 3.4.4
- Gradle(Groovy DSL)
- MyBatis & MyBatis Generator
- Flyway
- Lombok
- Docker Compose
- MySQL

## 起動方法

```bash
docker compose up --build
./gradlew bootRun
```

## 提供API

- `GET /api/aggregation/mysql` - MySQLによるGROUP BY集計を実行
- `GET /api/aggregation/java` - Java Stream APIによる集計を実行

## データ生成

Flywayマイグレーションにより、以下の手順でデータベースが初期化されます:

1. `users` テーブルの作成(`V1__create_users.sql`)
2. 100万件のランダムなユーザーデータを挿入(`V2__insert_users.sql`)


## ディレクトリ構成とファイルの説明

```
benchmark-mysql-vs-stream/
├── build.gradle                         # 依存関係やビルド設定
├── docker-compose.yml                  # MySQLとアプリのDocker連携設定
├── Dockerfile                          # Spring BootアプリのDockerビルド定義
├── mybatis-generator/
│   └── generatorConfig.xml             # MyBatis Generatorの設定ファイル
├── src/
│   ├── main/
│   │   ├── java/com/example/performance/
│   │   │   ├── PerformanceApplication.java       # Spring Bootエントリーポイント
│   │   │   ├── controller/AggregationController.java # REST API定義
│   │   │   ├── service/AggregationService.java   # 集計処理のロジック
│   │   │   ├── mapper/UserMapper.java            # MyBatisによるSQLマッピング
│   │   │   └── model/User.java                   # エンティティモデル
│   │   └── resources/
│   │       ├── application.yml                   # アプリケーション設定(DB接続など)
│   │       ├── db/migration/
│   │       │   ├── V1__create_users.sql          # usersテーブルの作成
│   │       │   └── V2__insert_users.sql          # 100万件の初期データ投入
│   │       └── mybatis/                          # 必要に応じてMyBatisのXMLマッピングを追加可能
└── README.md                          # プロジェクトの概要と使用方法
```

### 各ファイルの目的と必要性

- **build.gradle**  
  Spring Bootアプリの依存ライブラリやビルド構成を定義します。

- **docker-compose.yml**  
  MySQLとSpring Bootアプリを同時に起動し、開発・検証環境を構築するための定義ファイルです。

- **Dockerfile**  
  Spring BootアプリをDockerコンテナとしてビルド・起動するために使用します。

- **Flywayのマイグレーションスクリプト**  
  データベースのバージョン管理を行い、再現性のあるデータセット(100万件)を自動生成します。

- **MyBatis Generator設定**  
  テーブル構造からモデルクラスやMapperを自動生成し、SQLの定義を簡潔に保つために利用します。

- **AggregationController / AggregationService**  
  REST APIを介して、MySQLによる集計とJava Streamによる集計を切り替えて実行できるようにします。

- **User.java**  
  `users` テーブルのレコードに対応するエンティティ。SQLとJavaのデータ対応のために必須です。

- **UserMapper.java**  
  `@Mapper` を使いMyBatisと連携し、SQL文をJavaメソッドとして呼び出せるようにします。

### その他補足
- **AI_prompt_init.txt**  
  本プロジェクトを作成した際に利用した生成AI用プロンプト  
  ChatGPT(4o)会話履歴;https://chatgpt.com/share/67f3bf1d-07f0-8010-bf77-b001871d1667

うまくいった👌

  • Spring InitializrによるSpringboot雛形作成
  • Docker Compose.ymlの生成
  • ディレクトリ構成も違和感ないものが出来上がっている
  • サードパーティライブラリ,ツールに指定したものの認識OK
  • 「Dockerコンテナに含めるもの」について生成AIに判断を委ねた結果、flywayを対象外としてくれていた。
    (Spring Boot アプリケーションの起動時に自動実行できる仕組みがあり、今回のプロンプトの情報からだと不要と判断されていても納得はいく)
  • その他要望に記載した内容については8割方認識OK

うまくいかなった🚀

  • MyBatis Generatorによる自動生成ModelクラスとSQLマッパークラス(**Example.java)を使用することを期待していたが、伝わっていなかった(builde.gradleにMyBatis Generatorの実行すら含まれていなかった)
  • Gradle Wrapperは存在しなかった(新規プロジェクトであれば、開発者がGradleからインストールするツールのため、含まれていなかったと推測🤔)
  • gradlew bootRunが成功する状態ではなかった
  • 動作前提となる開発環境の状態については考慮されていない(fix詳細は後述参照)

最終的な成果物 🌟

bootRun を成功させるまでにやったこと

✅ 以下赤枠のfix (コミット履歴)

commit

fixの補足
  • fix アプリのコンテナ化を削除(722b27c)
    • プロンプトでアプリケーションのコンテナ化を指示していたが、ローカル動作させる上で不要だったため削除
  • fix flywayの依存関係を修正(cabdc3b)
    • bootRun後の No database found to handle jdbc:mysql://... エラーを受けて、flywayの依存関係を修正
    • Flyway migrate を Spring Bootアプリ起動で実行する構成に修正
    • MySQLコンテナの起動エラー対応 (default-authentication-plugin は現行バージョンで無効のため削除)

✅ 開発環境の構築

セットアップ内容
  • JDK(Amazon Corretto 17)のインストール
  • JAVA_HOME の設定
    • .zprofileに以下を追加(必要に応じてzshrcにも)
      eval "$(/opt/homebrew/bin/brew shellenv)"
      export JAVA_HOME=$(/usr/libexec/java_home -v 17)
      export PATH=$JAVA_HOME/bin:$PATH
      
  • intellijにてLombokプラグインのインストール
    • Preferences > Plugins > Marketplace からLombokをインストール
  • Gradle本体とGradle Wrapperのインストール
    brew install gradle
    cd {プロジェクトルート}
    gradle wrapper
    
  • Docker Desktopのインストール

気づき・感想 💡

  • 今回扱った技術スタックであれば、1日かからない程で動くものはできました。やはり強い,,⚡️
    • すぐにビジネスロジックの実装にも入れそうなので、試作アプリの叩き台を作成するシーンなので活用していきたい
  • 関連技術のキャッチアップをスピーディに出来ることの恩恵は大きい
    • Why分析のハードルが低く、点と点を繋げやすい
    • 全ての回答を鵜呑みにはできないが、とりあえず修正→動作検証までのサイクルを早く回せる
    • 公式ドキュメントを読む上での足がかりをすぐに得られる
  • 今後の活用に向けて、システム開発におけるプロンプト例は色々と調べてみたい
  • 生成AIを効率的に活用するためにも、基礎となる技術知識・語彙力を高めていく必要があると感じた(知っていることが多いとそれだけAI活用の効率は上がるはず)

小話 Claude 3.7 Sonnet(無償版)でも試してみた 🍪

Claude 3.7 Sonnet(無償版)にも同じプロンプトを投げてみました。
生成されたプロジェクトファイルについて、ClaudeではZIP等で一式に固めて出力はできないようだったので、一旦READMEとbuilde.gradleの紹介になります🙏
興味のある方は↓覗いてみてください!
🔗README
🔗builde.gradle

ChatGPTと比較したときの所感として,,

  • 起動方法や前提条件がより詳細に追記されており、開発者フレンドリーな印象
  • builde.gradleはほぼ似通ったもので作成されていた。MyBatis Generatorの実行が含まれていなかった点も同じ(つまりプロンプトが悪いということか,,笑)
  • Claude 3.7 Sonnetはコーディングに強いという話は聞いていたが、今回の実装規模だと明確な差は感じられなかった(有償版の拡張思想が気になるところ,,)

最後に

やはり、生成AIを活用しない理由はないなということを改めて実感しました!
またこの試みを通して、普段業務で使用している技術スタックの理解も深められて、面白かったです✨
長くなりましたが、最後までご覧いただきありがとうございました☀️

Rehab Tech Blog

Discussion