最近、Webアプリケーションフレームワークを使ってみながら比較している。比較、といっても深い考察ができているわけではなく素人レベルで色々試しているだけ。
TODOアプリケーションという同じ題材を、複数のフレームワークを使って実装してみて、実際に開発してみるまでの入り易さや開発のし易さ、等々を肌で感じてみよう、という取り組みをしている。
https://github.com/ksoichiro/todo
現在は、Spring BootとPlay Frameworkを使ってみたところ。
(なぜこれ?というのはさておき)以下、雑感。
総じてPlayが良さそうな感じに見えてしまうが、素人意見であり、どちらが絶対に良いとか悪いとかの話ではなく単なる感想なので注意。
カテゴリを分けて整理して書いてしまうと、体系立ててチェックしたように見えてしまう気がするので、あえて列挙して書いてみる。
- 成り立ちからすれば当然だが、PlayはRailsにかなり近い感じ。Java/Scalaな分、事前にシンタックスレベルのエラーは取り除かれるのが良い。
- PlayはCoffeeScriptやLESSなど、フロントエンドまで統合されている。Spring Bootはそこまでは入っていない(たぶん)
- Spring Boot、というかThymeleaf、はそのままHTMLとして開けるのが良い感じだが、ちょっと凝ったformを作ろうとするとなかなか難しい。Spring向けのIntegrationが余計なことをしている感じもする。ネストしたformなんかは上手く動かない。
- かといってPlayの方はformがddタグなどでレイアウトされてしまうのでformのテンプレートをカスタマイズしないといけない、というのがやや面倒。
- Thymeleafで変数を色々使うと、シングルクォートとダブルクォートが沢山あって見にくい。Playの
@
をつけるという単純なルールはわかりやすい。
- Playがリバースルーティングを用意していてURLを直接書くのを回避しているのが良い。Viewを含めて本当にIDEでリファクタリングができたりするのかは分からないが、少なくとも
routes.
、@routes.
などで検索すれば参照箇所を特定することはできそうなので、URLの変更には対応しやすそう。
- Playは既にScalaで開発されていることもあり、そのうちJava対応はなくなってしまわないかな…というのがやや心配。(Java言語を使う前提で考えると)
- フロントエンド周りに疎く、Playでjshintを初めて使ったが、JavaScriptのlintをコンパイルエラー扱いしてくれるのは助かる。まぁPlayのものではないにしろ、Webテンプレート、CSS、JavaScript、ルーティング、等々、全体的に動かす前に全てチェックすることを目指しているのが読み取れる。
- Spring、というよりHibernateなのだろうが、初期データをSQLで流せるのが手軽で良いと思った(同じDBに他のアプリケーションからアクセスするケースを考えると、DDLは自動生成ではなくDDLとして表現されていた方が助かることもある)。PlayでもEBeanとYAMLでテーブルとシードデータを作ることはできたが、SQLを直接読ませるのは難しい模様。手作りできるレベルではあるが、ちょっと残念。
- 個人の慣れの問題だとは思うが、PlayだとGradleでなくSBTなのがやりにくい。
- GradleではGradle wrapperを使うことで各マシンへのインストール作業なしにGradleが使えるのが良いが、Playでもactivatorのスクリプトは生成されるので、この点は変わらない。
- Play、というかactivatorが何だかすごい。チュートリアルなどが簡単に閲覧できたり動かせたりするのが楽。
- Spring Boot、というかSpring?はURLのマッピングが散在してしまったり、基本的なディレクトリ構成があまり決められていなかったりする点が良くもあり悪くもある。きちんと規約を作らないと多人数では秩序が保てない感じ。
- Spring Bootは、Springを自力でセットアップするよりお手軽になっているのはよく分かるのだが、
./gradlew dependencies
などとすると依存関係がありすぎて大丈夫かな…とちょっと不安になる。
- Spring Boot (Spring)はアノテーションや見えない(?)規約が多い感じがする。Springを理解すれば解消されるのかもしれないが…何というか、そのルールを知らなかった時に類推して解決する、というのが効かない感じ。
- どちらもJavaで、IDEが使えて、大体のコードは書いた時点でOK/NGが分かる(コンパイルされる)、という点でRailsよりは書いているときの安心感はある。
- このアプリケーションでは、記述量はどちらも大差ない印象。SpringはGroovy、PlayはScalaを使うともっと簡潔になりそう。
- コンテナレス、1 fat-jarでデプロイ、というのは流行りなのかな?Twelve Factor Appで提唱されているような考え方に合う、というのは分かるが、当然のようにJavaのWebアプリはServletコンテナに乗っけるものと思っていたので、本当に良いのか?とまだ違和感がある。複数アプリケーションをデプロイする場合などはどういう構成にしたら良いのか、とかは検討してみたい。
…本当にまとまりがないが、今回はここまで。