Rのつく財団入り口

最近の本や技術系の話などを書いてます。元はTRPG系サイトの入り口でした。

【感想】EclipseではじめるJavaフレームワーク入門 第5版

EclipseではじめるJavaフレームワーク入門 第5版 Maven/Gradle対応』

 まだJavaで消耗してるの?という感じが2018年現在だと若干ありますが、依然として仕事のシーンではJava関連もよく出てくるので読んでみました。
 第5版という通り今までも何度か出てきた本の2016年3月に出た最新版。

Java界隈での執筆時の2016年の最新状況、フレームワークが乱立気味の状況を踏まえ、主要な各フレームワークやツールを総なめ、どういうものか、実際の基本的な使い方の部分をサンプルコードと共に網羅しています。
586ページと分厚く、緑色の表紙が目立つのでよく大きい本屋でも置いてありますね。この記事では内容の整理紹介と、Java界隈のキーワードの最近の情勢をまとめてみたいと思います。

Chapter1 フレームワークとは

 約束のフレームワークとはなんぞやという話、Java関連のフレームワーク一覧。英語の名前にカタカナでフリガナがちゃんとふってあるのがよいですね。開発環境はPleiades日本語化プラグインが入ったEclipse4.5.2(Mars)が基本となっています。

Chapter2 Hibernate

Hibernate. Everything data. - Hibernate

 DBアクセス部分を代行するO/Rマッピングの有名なフレームワーク、ハイバネートの章。インストールはビルドツールのMavenを使った場合も併記されています。接続先DBはMySQL5.7.。
 基本的な使用方法は以下ですが、

  • Hibernate自体の設定ファイルhibernate.cfg.xml を書く
  • テーブルの1レコードに相当する永続化クラスをDTOとしてJavaで書く
  • 永続化クラス-テーブルを繋げるマッピングファイル、xxx.cfg.xmlを書く
  • Javaコードの中でほぼ定型コードとしてDBに繋げて結果を取ってきて...を書く

初心者を意識してかJSP/Servlet/ふつうのJavaクラスの3パターンで書く例がそれぞれ載っています。
後はEclipseから使う場合、ややこしいですがJBossツールのプラグインを入れて、その中に含まれているHibernate Toolsを使う方法。
 Hibernateが持っているSQLのかんたん版的な簡易言語HQL(Hibernate Query Language)の説明もあります。
 そしてJava自体も6あたりからSQL文を書かずともエンティティクラスでDBアクセスできるJPA(Java Persistence API)を内蔵しましたが、すでにHibernateを導入したアプリケーションでこのJPAにスムーズに繋げられるようにする「Hibernate JPA」のサンプルも載っています。

Chapter3 Spring Framework

spring.io  よくキーワードが出てくるスプリング。Spring=Spring Frameworkなのですが、基本に返ってこのSpringのコアになる依存性の注入(DI)とはなんぞやというところからスタート。
 Spring専用の開発ツール、STS(Spring Tools Suite)はSpring公式サイトからのSTSダウンロード、既存EclipseへのSTSプラグインインストールの両方を解説し、設定ファイルのBean定義ファイルをXMLで書いてJavaコードの中で実行する例、アノテーションを使う例までを詳しく載せています。
 また全クラスの処理にあらかじめ用意されたメソッド内の処理を注入してロギングなどを自動化できるSpring AOP、Spring外のライブラリですがより高度なAOP処理ができるAspectJの導入・使用方法も載っています。

Chapter4 Spring MVC/Spring Boot

Spring Boot

 「Spring」という言葉が何回も飛び交うのでよく混乱しがちですがまとめると、

  • Spirng FrameworkはDIとAOPの技術を中核としたフレームワークのコア部分で、これを利用した様々な仕組みがSpringコアの上に作られた。
  • そのひとつがSpring MVCで、標準のMVCアーキテクチャに基づいた、WebアプリケーションをSpirngベースで作るためのフレームワーク
  • しかしSpring MVCは内部で色んなSpringのフレームワークを使ったりで関連が複雑、コードの自動生成もなく、設定が煩雑だったりいろいろ面倒くさい。
  • そこでシンプルに、素早く簡単にSpring MVCで開発できるようにしたのがSpring Boot。ビルドにはApache Mavenを使うので、設定ファイルのpom.xmlを書き換えるだけでスタートできる。

 ということでだいたいSpring MVC≒Sping Bootなんですね。Eclipse上でのSpring Boot用のSpirngスタータープロジェクトの開始方法、設定、pom.xmlの設定方法、コントローラクラスの実装方法から始まります。

 続いてMVCのView部分のテンプレートエンジンは、5種類ほどあるうちから一番使われているThymeleaf(タイムリーフ)を使い、コントローラクラスからの値の渡し方やフォーム関連。このへんはRubyRailsPHPフレームワーク各種、PythonDjangoASP.NET MVCを少しでも知ってる方には馴染みやすいのではないでしょうか。だいたい同じです。

 そしてDBアクセス部分は、

  1. Java言語自体が備えているJPAを使う
  2. JPAを利用したSpirng内のフレームワーク Spring Data JPAを使う
  3. 上をさらに強化したSpring Bootのデータベース機能を使う

の3種類が存在。ややこしいですが自然に3.になって1.2.が内包されるそうです。1テーブルの1レコードに相当したエンティティクラスを作り、リポジトリクラス経由でDBから値を取ってきますが、テーブル自体もSpring Bootが作ってくれてしまいます。

 Java縛りである程度の規模のシステムでベースに何か仕組みを……という時、日本でもSpring MVC/Spring Bootを採用するのはよく聞きますが、よくわかるサンプルを含めて丁寧に解説されています。

Chapter5 Play Framework

 Javaは歴史が古いため、たくさんのライブラリをjarで組み合わせるのが大変だったり、Java EEJSP/サーブレットはもはや古い技術だったり、フォルダ構成や設定ファイル書きが大変だったりした。その間に他の言語も発展を続け、かのRuby on Railsが登場して爆発的に普及した……
 ということで、フルスタックである、JSP/サーブレットも使わずに独自実装、Tomcatも使わずに独自のサーバ機能搭載、Railsに習って「設定より規約」の考え方を導入、構成ファイルの自動生成の仕組みも付属。
JavaScalaに対応して、Java系でRailsっぽい開発ができるようにしよう」……というのがこのプレイ・フレームワーク

Play Framework - Build Modern & Scalable Web Apps with Java and Scala

 インストール方法、railsコマンドやartisanコマンドにあたるactivatorコマンドの実行方法、Play Frameworkで作られたJavaプロジェクト一式のEclipseプロジェクトへの変換方法……と続きます。
 コントローラクラスはJava/Scalaで普通の実装。ビューのテンプレートが拡張子は *.html ですが書き方が独特。
 そしてモデルは、application.confという設定ファイルにDB情報を書き、テーブルの1レコードに対応したカラムをメンバ変数、独自のメソッドを実装したモデルクラスを書くと、読み書きができる……というActiveRecordパターンのいつもの方式。PHPフレームワークのメソッドチェーンのように、

{モデルクラス}.find.where().ilike(...); 

のように書いてSQL文なしでDBアクセスができます。

 このJavaRails風の開発ができるようにする発想は面白いですね。手順を見た中では、ビューのテンプレートの書き方がちょっと煩雑で分かりにくく、Javaでやろうとしているために複雑になっているのかなと思いました。
 Play Framework自体の解説本としては、同じく掌田 津耶乃さん著者の2対応の本が2013年に出ていますがそれきりですね。

 日本だとサーバ側にScala言語があってフレームワークが必要な場合以外あまり採用事例も見かけませんし、1から作るなら突き詰めるとRubyRails自体とかPHPフレームワーク各種やPythonDjangoやればいいじゃんという話にもなってきます。2010年代前半は注目されましたが、結局あまり流行らなかったのかなという感じです。

Chapter6 Java EE(JAX-RS/JSF/JPA)

 今度はJava Entierprise Edition、Java言語自体の標準環境に含まれているフレームワークの話。

JAX-RS

 JavaでRESTfulなサービスを作ってWebAPI通信するために定められた標準仕様がJAX-RS(Java API for RESTful Services)。JAXの「X」はどこから出てきたのか謎ですが、これを実装したライブラリで有名なのがOracleが公開しているJersey。

Jersey

 Mavenでの設定、Eclipseでの始め方、pom.xml、web.xmlへのサーブレット登録、クラスの実装……と一通り解説されています。Javaクラスの実装はJAX-RSのためのアノテーションを活用することでコード量を減らす工夫をしています。
 近年WebAPI通信は盛んに行われるようになっています。この辺の情報はどこかでもう見た、既に使っているという方も多いのではないでしょうか。

JSF

 JavaServer Faces、JとSの間は空かずにSとFの間は空けるのが正式なJSFGUIとロジックが混在できてしまうJSP/サーブレットの欠点を克服したMVCでいうとV-Cの部分を内包するフレームワークで、Java EE5からJava自体に組み込まれるようになってきました。

JavaServer Faces - Wikipedia

 Eclipseでのプロジェクトの始め方、画面のファイルの作り方、Java側の管理Beanの作り方が短いながら一通りまとまっています。画面側は .jsp / .xhtmlの両方で書けて、JSF2.0から .xhtml の方が推奨のはずでしたが、本書の例だとなぜか .jsp になっていますね。

 僕が今まで読んだ本の中で、JSFに一番詳しいのは2015年5月発行の『わかりやすいJava EE ウェブシステム入門』でした。

わかりやすいJavaEEウェブシステム入門

わかりやすいJavaEEウェブシステム入門

 このJSFも、Strutsの後継者として期待されましたが、2010年代後半の現在は結局あまり流行らず終わっちゃったかなという感じです。

JPA

Java Persistence API - Wikipedia

 Java Persistence APIJava言語自体に組み込まれるようになったデータ永続化API。これもActiveRecordパターン的で、クラスを使ってSQL文を書かずにDBアクセスができる仕組みです。
 本書ではDBには著名なRDBではなくPure JavaHSQLDBを例にとり、初期設定、persistence.xmlの設定、エンティティクラスの書き方をさっと流しています。まあJPAは最近の技術なのでWeb上の情報や最近のJava本にもよく載っていますし、基本を押さえたら詳しくはそちらをという感じでしょうか。

Chapter7 軽量フレームワーク Apache Wicket

Home | Apache Wicket

 様々なフレームワークが登場したが、機能が追加されてだいたい巨大化する。Javaの場合は設定ファイルを書くことが多くXMLのお化けになりがち。ここで原点に返って軽量フレームワークJavaに回帰してすべてをJavaコードで書き、オブジェクト指向の基本に従って作ろう……というアプローチが、このアパッチ・ウィケット。2007年にApacheのトップレベルプロジェクトになりました。

 インストール、フォルダ構成、Tomcat等を使わない内蔵サーバ機能での実行方法。実装側はWebApplicationクラス継承のクラスにロジックを書き、WebPageクラス継承のクラスに値と画面の紐づけを書き、クラスと同じ名前の*.htmlファイルにHTMLを書く、という方法です。ラジオボタンやセレクトボックスは所定の書き方でJavaコード側から生成できる、というあたりも他のフレームワークでもよく見かけます。
 本書でのサンプルはセッション処理や一覧表示、ページングやバリデーションまでと詳しめに載っています。

 このWicketも着眼点は面白いのですが、2000年代後半には注目されましたが結局日本では情報も少なく流行らず終わってしまった感じです。本も2009年に1冊出たきりですね。

オープンソース徹底活用WicketによるWebアプリケーション開発

オープンソース徹底活用WicketによるWebアプリケーション開発

Chapter8 Google App Engine (GAE)とSlim3

GAE(Google App Engine)

 Googleクラウド上で(現在は)PHP/Python/Java/Go言語でアプリを作り、DBはGoogleBigTable専用で作るとサーバ構築なしで動かせるGAE。AWSMicrosoft Azureと同じようなサービスですね。2018年現在はGoogle Cloud Platformの中の1サービスでPaaSを提供するもの、という位置づけになっています。

cloud.google.com

 このGAE上でJavaで開発する時の流れを一通り見ることができます。最初に歴史が書いてあるのですが、2008年のGAE公開時は言語がPython縛りだったというあたりが懐かしいですね。まだ今ほどPythonが流行る前でした。
 Google App Engine SDKをインストール、ブラウザでGAEの画面から申し込み、アカウント作成、Eclipse用のプラグインのインストールとEclipse側の設定、SDK内蔵のサーバによるローカルでの実行方法、GAEサーバ上へのデプロイ方法……と続きます。

 他のフレームワークと違うのが、データの格納先がRDBでなくGoogle謹製のBigTableのみということ。アクセス方法は大まかに2通り。

GAE付属のEntity機能を使う:

  • Entityクラスを使う。Entityには好きなキー名をつける。(これがテーブル名+レコードIDのような感じ)
  • ひとつのEntityには名前:値の組で好きなプロパティをつけられる。(1レコード内の各カラムの値のような感じ)
  • Entityを保存すると一意な数字のIDがGAE側で振られるので、IDでも検索できるし、プロパティでも検索できる。

JDO(Java Data Object)を使う:

  • 継承なし、アノテーションで色々指定したJDOクラスを作る。メンバ変数がテーブルのカラムに対応したいつものJPAのような形。
  • 処理を書く普通のJavaクラス(一般的にはDAO)で、GAE側のPersistenceManagerFactoryクラス経由でこのJDOクラスを使って検索したり保存したりする。
Slim3

 Java版のGAEであるGAE/Jで開発するには画面系のフレームワークStrutsJSFに相当するものがない。そこで作られたのが「Slim3」というフレームワーク。インストールから簡単な画面の作り方まで一式載っています。

sites.google.com

sites.google.com

 しかしこのSlim3も日本だと2010-2011年に本が出たきりで結局あまり流行らなかった感じです。

オープンソース徹底活用Slim3onGoogleAppEngineforJava

オープンソース徹底活用Slim3onGoogleAppEngineforJava

 ちなみに「Slim3」でググると、ややこしいのですがPHP言語の軽量マイクロフレームワーク「Slim」のバージョン3の情報が先に来るのでご注意ください。(笑)

Documentation - Slim Framework

Chapter9 Struts2について

 MVCのV-Cの部分のフレームワークとしてかつてはJavaデファクトスタンダードになりつつも、2008年に開発終了で引退したStrutsの後継者、2007年から始まったStruts2の話。最新は2.5でまだ続いています。

Welcome to the Apache Struts project

 構成や*.jspに書けるStruts2の新タグ、エラー処理など諸々。まあStruts2なら本もいろいろ出ているし詳しくは別に1冊そちらをとなりますが、要約がまとまっているので参考になるでしょう。

 このStruts2も2017年3月に脆弱性がまた発見されたりして、Google検索では「Struts2 脆弱性」とヒントが出るぐらいそっちでも有名になってしまい、レガシーないかにも過去の遺物的なイメージも強まってきてます。過去にはあれだけ栄華を誇って広く使われたし、僕もJavaエンジニアとして成長する過程でたくさんのシステムを作ってきたので寂しくもあります。
しかしこれも祗園精舎の鐘の声、諸行無常の響きあり。娑羅双樹の花の色、盛者必衰の理をあらはすのでございまする……(ごごーん)

Chapter10 Grails

 Java仮想マシンJVM上で動くJava類似言語、AltJavaやBetter Javaと呼ばれる言語で最近流行りなのはScalaとKotlinですが、その前に一時期注目を浴びたのがGroovy(グルーヴィ)。スクリプト記述に使ったりする型宣言のない動的言語です。2003年に開始、現在がバージョン2.4で一応今も続いています。

Groovy - Wikipedia

 このGroovy言語を使って書くWebアプリケーションフレームワークGrails。2005年にスタート、2017年のバージョン3.3が最新でまだ続いています。

Grails Framework

 本書ではインストール方法、Eclipseプラグイン方式で提供される開発ツールのGGTS(Groovy/Grails Tool Suite)の導入方法、そして実装へと続きます。基本は

  • grails create-controller xyzコマンドでコントローラクラスのひな型が生成、アクションメソッドを実装。ビューテンプレートに値を渡すところを書く。
  • ビューテンプレートはJSPのGroovy版的なGSP(Groovy Server Pages)で拡張子*.gsp。中にHTMLや変数部分を書く。カスタムタグが色々ある。
  • O/RマッピングはGORM(Grails's Object Relational Mapping)という機能あり。ドメインクラスに1レコードに対応するメンバを書いて、ActiveRecordパターン的にアクセスできる
  • XML設定ファイルの山がなくて設定より規約、grailsコマンドで色々できて……

と、こちらもRailsライクな感じ。GrailといえばHoly Grail、かの円卓騎士団の高潔なる騎士たちが探し求めた伝説の聖杯の名。日本のエンタメ作品だとよくあちこちで聖杯戦争が起こったりしてるアレですな。
 世界に一つしかないので複数形のGrailsにはならないし、やはりフレームワーク名の「Grails」はGroovy言語でRailsぽいのを目指したからG+Railsなのかな……とも読めますがどうやらその通り。最初は「Groovy on Rails」という名前だったのですがRails側の要求で「Grails」に名前を変えたそうです。Groovy版のRailsそのものではないので確かにこの名前だとまずいですね。

Grails徹底入門

Grails徹底入門

  • 作者: 山田正樹,山本剛,上原潤二,永井昌子,杉山清美,杉浦孝博,笠原史郎,香月孝太,福岡竜一,伊堂寺北斗
  • 出版社/メーカー: 翔泳社
  • 発売日: 2008/08/26
  • メディア: 大型本
  • 購入: 3人 クリック: 42回
  • この商品を含むブログ (28件) を見る
Groovyイン・アクション

Groovyイン・アクション

 Railsのよいところを受け継いだこのGrailsフレームワークも2000年代後半は注目されましたが、2008-2009年ごろに本が数冊出たきりで結局日本では情報も少ないまま、あまり流行りませんでした。
まあGroovy言語自体がビルドツールのGradle以外であまり使われなかったというのもありますね。ゆるやかに栄光を失い衰退に向かいつつある(かもしれない)Javaを救う聖杯とはならなかったようでございまする……(魔術師マーリン語る)

Chapter11 Maven/Gradle

 Java系のビルドツールの話。

Apache Maven

Maven – Welcome to Apache Maven  大きめのJavaプロジェクトなどでもよく出てくるMavenApache Project製、Antの後継者のビルド管理ツールです。僕もよく「メイヴン」と発音しちゃうしそういう人が多いですが、英単語の正式な発音は日本語だと「メイヴェン」「メイヴァン」で「メイ」にアクセントを置くのが一番近いようです。
 インストールからフォルダ構成、pom.xmの修正、Eclipseへの入れ方……など。MavenJava開発の現場ではよく使いますしWebの情報も多いので、詳しくはそちらへ。

Gradle

gradle.org  こちらはGroovy言語によるビルド管理ツールのGradleの導入方法、Eclipseへの入れ方……など。拡張子*.gradleのスクリプトファイルにJavaっぽいGroovyのコードを書いて、コマンド実行で様々なタスクを実行できます。
 Gradleは2007年スタート、現在4.4ですが比較的新しい技術ですしWeb上でも情報は多いので、詳しくは調べていくとよいでしょう。

Chapter12 これからのフレームワーク

 最後は、全体を俯瞰するには大事な今後の話が書いてあります。雑にまとめますと

  • JSFは消えるのか:コンポーネントベースでMVCアーキテクチャと異なるので、単体より他のフレームワークと融合していきそう。
  • Hibernate:表面上は見えなくてもフレームワークの中に組み込まれることも多く、Java系ORMのスタンダード。NoSQLの世界だといらなくなる。
  • Spring:Spring Bootの登場で勝負あり、今Javaで使うなら一択。
  • Google App Engine:PaaSでなくIaaSのGoogle Compute Engineの中に組み込まれるかもしれないので動向を要チェック。(2018年現在は、Google Cloud Platformの一部になっています)
  • Play Frameworkは普及するのか:Scalaが流行れば大化けするかも。
  • Wicketは使われているのか:新鮮味なし、地味に継続利用。
  • Struts2負の遺産となりつつあり将来に不安。
  • Grails:開発元の引継ぎ先がどこになるのかによる。
  • ビルド管理ツール:MavenとGradleを両方知っておくと良い。
  • Gitとクラウドサービスも学んでおくと良い。
  • Eclipse:巨大化しEclipseベースの独自環境も増えてきた。Android StudioのベースにもなったIntelliJ IDEAがライバル。クラウドEclipseは対応が遅れているのもネック。

 と本書では未来を予測しています。
中でもIntelliJ IDEAはJava専門でなくJava/Scala/Groovy/Kotlin/クロージャと紛らわしいClojure言語 とJVM系言語にオール対応したIDEですが、最近ネット上の情報でもよく見かけます。何より開発元のプラハ本拠のJetBrains社は最近Kotlin言語の発表で勢いに乗っています。Java開発ツールのIDEとしてはEclipseにますます迫って2択で今後勝つかもしれませんね。

まとめ:Java系のフレームワークの最新情報・概観が1冊でよくわかる本

 著者の掌田津耶乃さんの本は誤植が多いことがよくあるようですが、本書は見た感じそうでもなく安心して読めます。個々のフレームワークでの開発方法は1冊専門に扱った本よりは当然情報量は少ないですが基礎は一通り書いてあり、また1冊の本に凝縮してあって比較できるという所にも本書の意味があるでしょう。2016年3月時点の本ですが、複数のフレームワークを比較できるのはこの本が最新ではないかと思います。

  • Java言語縛りで何か作ることになり、フレームワーク選定をしなければならなくなった方
  • Java界隈全体の情報を俯瞰しなおす必要のある方
  • Java開発がメインの現場で周囲をいろんなキーワードが飛び交っており、調べようと思った若手の方

などが読むと参考になるのではと思います。現状、まずはSpring Boot(≒Spring MVC)を選ぶのが鉄板という感じですね。僕も仕事であれこれ見てきた中ではこの選択が多かった気がします。