冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

SpringBootCampの予習がてらSpring Bootを味見してみた

Spring Boot Camp@岡山に参加キメた割にはSpring Bootそもそもよくしらないので、予習を兼ねて少し触ってみました。フレームワーク味見の第2弾です。今回も闇を見ずに終わりたいと思います。

okajug.doorkeeper.jp

なお、そもそもSpring Bootを新しいアプリケーションフレームワークだと誤解していた模様です。どちらかというとSpring frameworkを使ったプロジェクトの構成とデプロイを楽にする方面の話なんですね。

予習の予習

gvmでSpringBootCLIをインストールできるようなのでやってみます。インストール後、springというコマンド名でSpringBootCLIを使えます。

プロジェクトの作成

ビルドシステムにgradleを指定してプロジェクトを作ってみましょう。

> spring init --build=gradle my-app

何に使って良いんだかわからない空っぽのプロジェクトが作成されました。

依存関係を指定しないとアプリケーションの構成がされないわけですね。デフォルトでWebアプリケーションなのかと思った。。。それからベースパッケージ名やアプリケーション名が指定されておらず、問答無用でdemoパッケージが作られたり、jarファイル名がdemoになっていたりします。とりあえず、依存関係やパラメータをlistオプションで確認できるようです。

> spring init --list

で、これでずらーっと一覧が出てくる訳ですが、パラメータの指定ができない。helpにもオプションが載ってないし、試しに指定してみてもエラーになるしで、このコマンドを使うワークフローが把握できずに微妙に使いづらいです。

で、このような流れとなり、今回時間を使うところではないな、と判断しました。

「はじめてのSpring Boot」で予習

根本さんに借りました。とりあえず写経して、後でgradleで少し試してみます。その前にmavenがそもそもいなかったので、おもむろにbrew install mavenしました。

一通り写経した上で感じたあれこれを(内容は書籍読んだ方が正確なので割愛)。

プロジェクト立ち上げて動かすまでが速い

それがなかったら何が美味しいの?という突っ込みが入りそうですが、実感してみると美味しさはわかります。特に私が旨味を感じたのは以下の点です。

最近のフレームワークの美味しい所をSpringに取り込んだ感じがして、Springってこんなにスピード感あるフレームワークだっけ?と思ってしまいます。とりあえずデフォルトが通用したり、まずは動かして確認できる、だったり。

また、ライブラリの依存関係が目的別に管理されている(Spring Bootの枠内では)というのは大きいです。複数のライブラリがある目的の為に関連するというのは当たり前の話であって、依存関係の依存関係みたいなものもあります。最初に書いたときは目的わかってますからまとまりがわかるんですけど、時間が経ってくると。。。それに、目的別の依存関係ごとに動作確認済みライブラリがセットで提供される(ですよね?)というのは、運用面とか考えると楽かな、と。

そこかしこにエンジニアを楽にしようという気概が感じられて非常に良いです。

その他

それ以外の所でちょいちょい気になった所があるので、合わせてメモしておきます。

DataSourceの作成に失敗する

「はじめてのSpring Boot」は1.1.8をベースに書かれてあったのですが、写経時には1.2.4が安定版最新になっていたのでそちらで進めていました。で、AppConfigクラスに同じDataSourceを返すBeanメソッド複数あるとアプリケーションの起動に失敗します。

これは、Spring Bootのバージョンによるものらしく、1.2.2までは問題ないとのこと。著者の槙さんのGithubリポジトリワークアラウンドがありました。

github.com

専用IDEがある

試してないのですべて伝聞形式。Spring Tool Suiteというeclipseベースの専用IDEがあるようです。プラグインとしても提供されているみたいですね。カタログスペックだけ見てるとアプリケーションの構成を可視化してくれたり、configファイルなども含めたリファクタリングツールを提供したり、クラスの依存関係をクラス図で可視化したりしてくれるらしいです。ううむ、なかなかの高機能。

ただ、今回は味見する程度だったので、慣れたIDEを使ってました。より深く触ることがあれば、考えてみたいと思います。

Spring Loaded

サーバを実行状態にしたまま、Hot Reloadingできるようになるプラグインです。何かSeasar2思い出しますね。IDEAではコンパイル時のクラスの出力先が若干違うようで、うまく変更を拾ってくれませんでした。深入りしていないので、何とも言えませんが以下が参考になるかも知れません。

qiita.com

hirooka.pro

テンプレートエンジン「Thymeleaf」

素のHTMLに属性をつけることで動的にHTMLを生成するタイプのテンプレートエンジンですね。これもSpringBootで選択することができます。

ちなみに、閉じタグのないものでもスラッシュちゃんとつけないとパースエラーになります。IntelliJで自動生成したHTMLファイルとかmetaタグに閉じ記号なかったりするので注意しましょう。

それと、私の環境ではテキストの通り実装しているとAppConfigの文字コードフィルタリングする前が日本語は文字化けしませんでした。テキストの通りAppConfigの文字コードフィルタリングを実装すると逆に文字化けします。どこに問題があるのか、までは追えませんでした。すみません。

後はBootstrapがwebjarsから取得できなかったり、色々ありましたがBootCampまでに時間が取れそうにないので、勉強会のときにちょっと質問してみたいと思います。

gradle使う場合のプロジェクト立ち上げ

pom.xmlの記述って冗長ですよね?XMLってちょっと面倒というかなんというか。というわけでビルドツールをgradleにしてしまいたいと思います。おもむろにgradle init --type basic叩きます。

以下を参考にbuild.gradleを変更します。

qiita.com

リポジトリmavenLocal()mavenCentral()の指定が明示的に必要だというところに軽くハマりつつ、プロジェクトの生成は上手く行きました。また、公式だとQuickStartにgradleプラグインのインストールが書かれてないので、上記の方が参考になりそうです。mavenプラグインと同様、開発に伴う各種タスクが追加されるのでプラグインは入れておいた方が良いと思います。

最初のサンプルを実装して実行してみます。実行はgradle bootRunです。

で、少し調べてみた所、mavenで作ってgradle initで乗り換えも可能、ということもわかったり。

backpaper0.github.io

groovyでgradle?grails 3.0を使えば良いんじゃないですかね。。。

www.infoq.com

みんなでSpringBootCampいこうぜ

というわけで、長々とお試ししてみました。実際に手を動かしてみないとわかんないですか?そんなあなたにうってつけのイベントがあります。是非、参加しませう。

okajug.doorkeeper.jp