【Spring Initializr 読解】ソースコードの読み始め

SpringBoot で開発を始める際に、Spring 公式が提供している Spring Initializr というプロジェクトの雛形生成ツールを使うのが一般的だと思います。

https://start.spring.io/

このツールですが、これ自身も SpringBoot で開発されており、Netflix とかは社内でカスタマイズして、生産性を爆上げさせている話もあったりします。[^1]
[^1]: https://github.com/benwilcock/axon-initializr

そういった背景があり、以前から中身はどんな感じなんだろうと気になっていたので、このアドベントカレンダーを機に実装を見て、気づきを Qiita に残していこうと思います。

# リポジトリの構成を理解する

Initializr のリポジトリは spring-io という Organization 配下にあります。
Spring 本体の Organization である spring-projects とはまた別の Organization です。

[start.spring.io - GitHub](https://github.com/spring-io/start.spring.io)
[initializr - GitHub](https://github.com/spring-io/initializr)

ただ、メンバー見る限り Spring の中の人が開発していると言ってよい感はあります。

README を見る限り、 start.spring.io が実際にサービスをデプロイするときの UI だったり、サーバー側の設定のカスタマイズを行っているようです。
initializr は本体という印象。

ちなみに、公式ドキュメントはこちらのようです。

https://docs.spring.io/initializr/docs/current-SNAPSHOT/reference/html/

docs.spring.io なので、 spring.pleiades.io で日本語訳される範囲からは外れている模様。

# README を読む

それぞれのリポジトリに記載されている README を読んで、もうちょっと細かい情報を把握していきます。

## start.spring.io の README

**主なモジュールの説明**

1. start-client: クライアントサイドのアセット
1. start-site: サーバーインフラとメタデータの設定
1. start-site-verification: メタデータの妥当性を検証するテスト

**使い方**

1. ユーザとしての使い方マニュアルは [USING.adoc](https://github.com/spring-io/start.spring.io/blob/main/USING.adoc) で整理されている
1. ローカル環境でビルドや実行するまでのコマンドは README.adoc に記載されている通り

Bash ライクなシェルで実施と書いているけど、 `mvnw.cmd` があるので PowerShell とかでも可の雰囲気があります。

**その他**

1. Web UI に関しては提供しているけど、 Spring Initializr ライブラリと同等のサポートレベルはない
1. ライセンスは Apache 2.0 のため、無償の範囲で商用利用可能で改変や再配布も OK

## initializr の README

**基本的なコンセプト**

1. Java、Kotlin、Groovy などの基本的な JVM 言語のプロジェクト生成に対応
1. Apache MavenとGradleのビルドシステムをサポート
1. .gitignoreファイルの自動生成
1. カスタムリソース生成のための拡張ポイントを提供

**使い方**

1. ローカル環境でビルドや実行するまでのコマンドは README.adoc に記載されている通り
1. CLI（Spring Boot CLI, cURL, etc）や IDE（VSCode, Eclipse, IntelliJ IDEA（有償版）, NetBeans）、Web UI（https://start.spring.io）で利用可能
1. initializr-web モジュールを使えば、独自にカスタマイズしたインスタンスを簡単に立ち上げられる

**その他**

バージョン 1.0 より前だから大規模なリファクタリングが発生する可能性はあるそうです。ただ、GitHub の milestones 見る限り、そういった予定は計画されてはなさそう。

# git clone する

一旦、リポジトリ２つとも git clone してソースコードの全体像を把握してみます。
Git の履歴とかは不要なので、直近のソースコードの情報だけにしたいため `--depth=1` を付けて clone しています。
こうすると、ファイルサイズが節約できるので。

```bash
mkdir ~/repos/spring-io && cd ~/repos/spring-io

git clone --depth=1 https://github.com/spring-io/start.spring.io.git
git clone --depth=1 https://github.com/spring-io/initializr.git
```

:::note info
もし、この記事で読んでいるバージョンと同じにしたい場合、以下のコマンドで合わせられます。（12月7日時点で最新のコミットハッシュです）

```bash:実行するかは任意
cd ~/repos/spring-io/start.spring.io
git fetch --depth=1 origin db5dc08e67104a06fe2cd850d10cefa96c7db386
git checkout db5dc08e67104a06fe2cd850d10cefa96c7db386

cd ~/repos/spring-io/initializr
git fetch --depth=1 origin ad03a71a30b89457fb97dff11dcb103565735fba
git checkout ad03a71a30b89457fb97dff11dcb103565735fba
```
:::

また、今後コードが修正された際に、自分が知っているソースコードとの差分を確認できると後々便利なので、git の tag を付けてどのバージョンでコードを読んだのかわかるようにしておきます。

```bash:実行するかは任意
cd ~/repos/spring-io/start.spring.io
git tag -a reading_202412 -m "ソースコード読解用（2024年12月）"

cd ~/repos/spring-io/initializr
git tag -a reading_202412 -m "ソースコード読解用（2024年12月）"
```

# tokei で行数カウントする

IDE（今回は VSCode を使用予定）で開く前に、 tokei でプロジェクトの規模感を確認します。

https://github.com/XAMPPRocky/tokei

tokei は Rust 製のソースコードの行数カウンタツールです。
数年前は、 cloc という Perl 製の行数カウンタや、それを Go で置き換えした go-cloc を使っていましたが、tokei が速いのでこれを使うようになりました。

```bash
cd ~/repos/spring-io
tokei start.spring.io
===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 AsciiDoc                4          516          383            0          133
 Batch                   1          149          134            0           15
 Java                  337        20259        10497         7019         2743
 JavaScript             70         6800         6336           62          402
 JSON                    5         1854         1854            0            0
 Mustache                7          126          105            0           21
 Sass                   14         3449         3213           46          190
 Shell                   1          259          184           49           26
 SVG                     1           28           26            0            2
 Plain Text              1          202            0          169           33
 XML                     6          540          480           31           29
 YAML                   26         1994         1990            0            4
-------------------------------------------------------------------------------
 HTML                    1           87           83            0            4
 |- CSS                  1          162          162            0            0
 (Total)                            249          245            0            4
===============================================================================
 Total                 474        36263        25285         7376         3602
===============================================================================

tokei initializr
===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 AsciiDoc               11         1992         1535            2          455
 Batch                   3          392          341            0           51
 CSS                     1          599          548           34           17
 Java                  590        62314        36471        17085         8758
 JSON                   21         2269         2269            0            0
 Kotlin                  2           29           23            0            6
 Mustache               12          157          139            0           18
 Shell                   4          873          556          219           98
 Plain Text              1          202            0          169           33
 XSL                     1           27           27            0            0
 XML                    35         2334         2210           37           87
 YAML                   10          442          438            0            4
===============================================================================
 Total                 691        71630        44557        17546         9527
===============================================================================
```

なかなかの規模感ですが、よく見る現場の Java コード資産と比べるとかなり軽量な気がします。initializr に Kotlin のコードが 23 行だけあるのが若干気になります。

# なぜ、Initializer ではなく Initializr なのか？

気になったので調べてみました。GitHub の Issue とかには検索した感じ、こういった質問はこれまで飛んで来てなさそうです。

そのため、これから記載することはあくまで私の推測ですが、おそらく以下の記事に書かれているような背景でわざと e を取り除いたように見えます。

https://www.campaignlive.co.uk/article/why-flickr-dropped-e-started-trend/1341902

どうやら 2004 年に写真共有サービスの Flickr が、本当は flicker にしたかったけど、ドメインが取れなかったから flickr にしたのが最初らしいです。その後、Flickr が順調に成長すると、新しいテック企業（Blendr や Tumblr など）も真似たため、「eの欠落」が今どきのイケてる新しい企業の商標的な存在になり、 Spring Initilizr もそれにあやかった感じだと思います。へぇー。