読者です 読者をやめる 読者になる 読者になる

とあるSEの備忘録

音楽が大好きなとあるSEの備忘録です。プログラムから、音楽、雑記をあげていきます。

新人研修や書籍では教えないJava  ~JJUG CCC 2016 Fall その1~

Java

先日、会社の後輩とJJUGに行ってきました!セッションを聞いて学んだことや、セッションに対する意見をざっくりとあげていきます。

間違った内容があったら指摘していただけると助かります!

 

www.java-users.jp

 

★新人研修・本では教えないJava

ライブラリを簡単に扱うためにはどうすれば良いか

基本的にJava開発において、オープンソースのライブラリを多量に扱います。その際、以下のような、2つの問題点があります。

1. 利用するライブラリの中には、そのライブラリから更に別のライブラリを利用しているものがあり、それら一つ一つのライブラリを調べて、読み込まなくてはいけない。

2. 利用しているライブラリのバージョンが上がり、そのライブラリが利用しているライブラリもバージョンが上がっている場合、そのライブラリも合わせてバージョンを上げないといけない。

そんな問題を解決するべく、登場したのが「Maven」というビルドツール。

 「Maven」では、必要なライブラリをXMLに記述するだけで、自動的にダウンロードする。しかも利用したいライブラリをXMLに書いておけば、そのライブラリに必要なライブラリも自動的にダウンロードしてきてくれる。

また、XMLにバージョン番号も記述するため、バージョン番号を書きかえれば、自動的に最新バージョンの必要なライブラリを取得してくれる。

ライブラリの取得元は以下の

Maven Central Repository」

http://search.maven.org/

 

Mavenインストール方法

Mavenのインストール方法は公式サイトからzipをダウンロードしてbinの中身を環境変数にパスを通すだけでOK。

eclipseにはすでにMavenが入っているが、コマンドから利用することも多いため、個別にダウンロードして利用したほうが良い。

 

設定ファイルの記述

pom.xmlに利用したいライブラリを記載するだけでそのライブラリが依存しているライブラリを含め、すべてダウンロードされる。

また、pom.xmlの記述方法については、xmlのURLがすべてサイトに記載されているため、そのままコピペして利用すればOK。

 

Mavenフォルダ構成

Mavenは、以下のようにフォルダ構成が決まっている。

①source/main/java/:javaのソースファイル

②source/main/resources/:設定ファイル(プロパティファイルとか)

③source/main/webapp/:JSPとかHTML、CSSなどなど。

④source/main/webapp/WEB-INF/:ここにweb.xmlが配置されてる。

⑤source/test/:テストコード

上記のルール通りにファイルを作成し配置する。

 

warファイルの中身

次にMavenでwarファイルを作成すると、warファイルの中身はどうなるか。

③:WARファイル直下に配置される

①②:WEB-INF配下のclassesにまとめて配置される。

④/lib:pom.xmlで指定されたライブラリがすべてこの中に入る。

(※WEB-INF/lib配下にライブラリを配置するのは、サーブレットのルール)

 

MVCモデル

MVCモデルとは、ざっくりいえば、クラスファイルを明確に分けて保守、メンテナンスをしやすくするための考え方のことです。

モデル:DAOとかエンティティ。

ビュー:HTML、JSPなどの画面の役割をするもの

コントローラー:サーブレット

 

サーブレットJSPの問題点

サーブレットJSPMVCに分けることが難しい。

サーブレットはビューにもなれる上に、JSPスクリプトレットを使って、モデル的な役割を持つことが出来る。

しかもdoPostやdoGetの単体テストができない。

 

JDBCの問題点

次にJDBCの問題点として、処理の流れが毎回似たようなものになる。

コネクション取得して、ステートメント取得して、SQL書いてパラメータ設定し、リザルトセット取得!みたいな。

この流れを、毎回毎回テーブルごとに書かなくてはいけないため非常にめんどくさい。

 

Webアプリの三種の神器

上記のような問題点を解決するために以下の「三種の神器」を利用する。

・WEBフレームワーク

・DIコンテナ

・O/Rマッパー

WEBフレームワークはMVCをきっちり分けることが目的。

DIコンテナは、サーブレットなどの単体テストを容易にすることが目的。

O/RマッパーはDBサクセスの処理を簡潔に書けるようにすることが目的。

 

WEBフレームワーク

日本語訳すれば、「枠組み」です。コントローラーおよびビューとの連携の役割を果たしていて、MVCきっちり分けないと使えないようにしている。代表的なのは、

・Spring MVC

JSF

です。仕組みとして、フレームワークの中に一つだけサーブレットクラスがあり、そのクラスがすべてのリクエストを受け取って、自分たちが書いたコントローラーに処理を振り分ける役割を持っている。この振り分けているクラスをフロントコントローラーと呼んでいます。

このようにコントローラーはフレームワークで作成しますが、ビューの作成方法はどうするかというと、以下のようなテンプレートエンジンを利用します。

 ・「Thymeleaf(イムリーフ)」:Springで推奨

・「Facelets(フェイスレッツ)」:JSFで推奨

 近年、JSPはセキュリティ的に敬遠されることが多い。理由としてはクロスサイトスクリプティングと呼ばれる脆弱性が非常に起きやすいため。

 

O/Rマッパー

O/Rマッパーを利用すると、DBサクセスの処理が2、3行で済むが、一般的には、正規化されていないDB(綺麗に設計されていないDB)には向かないとされている。

 

DIコンテナ

DIコンテナの仕組みとしては、コントローラーのフィールドにインターフェイスを宣言する。そして「@Inject」というアノテーションを付与する。DIコンテナはこのアノテーションを目印にそのインターフェイスを実装しているクラスを自動的に探し出して、インスタンスを生成して代入してくれます。

そのため、DIコンテナを用いると、テスト用の仮の実装クラスを用意しておいて、そのクラスに差し替えてコントローラーの単体テストをする、ということが容易にできるようになります。

 つまるところ、DIとは簡単に言えば「インスタンスの代入」

インスタンスの代入を自動的にやってくれるのがDIコンテナの役割になります。

 

リフレクション

リフレクションは、フレームワーク、DIコンテナ、O/Rマッパーなどの根幹となる仕組みです。

基本的にサーブレットを作成する時は、mainメソッドを作成しません。doPostとかdoGetしか作らないのに、なぜかリクエストを飛ばすと自動的に呼ばれる。それはなぜかといえば、tomcatなどのAPサーバーが起動されたときに、すでにサーバー内のmainメソッドが呼ばれており、そのmainメソッドがweb.xmlを参照して、サーブレットのクラス名を抽出、そのクラス名からサーブレットインスタンスを生成します。そして、そのインスタンスからdoPost、doGetを呼び出しています。このクラス名からインスタンスを生成する技術のことをリフレクションと呼びます。

 

リフレクションの仕組み

Class.forNameというメソッドを利用して、引数にパッケージ付きクラス名を指定する。その結果、そのクラスのクラスインスタンスが取得される。

取得したインスタンスからgetConstructorというメソッドを呼び出してその目標のクラスのコンストラクタを取得する。

そして取得したコンストラクタのnewInstanceというメソッドを実行すると目標のクラスのコンストラクタが呼ばれて、インスタンスが生成される。

で、この取得したインスタンスからdoPostなりdoGetを実行する。

これら一連の処理をAPサーバーがやってくれている。

 

アノテーション

アノテーションは、リフレクションと組み合わせてよく利用されている仕組みです。

JPAと呼ばれるO/Rマッパーを利用した場合に限った話になるが、JPAでは、クラスや各フィールドに違ったアノテーションをつけるルールがある。

そのため、@Entityでエンティティクラスであることを明示したり、@Tableで対応するテーブル名を指定したりすることが出来る。

 

リフレクションとアノテーションの組み合わせ

Class.forNameでクラスのクラスインスタンスを取得する。

そしてClass.getAnnotation(Entity.class)とすると、@Entityアノテーションを取得できる。

アノテーションついてなかったらnullが返ってくるため、そこでEntityクラスかどうか判断することが出来る。

他にも、フィールド、メソッドなどについているアノテーションもすべて取得が可能。

 

ロギングライブラリ

代表的なものに「Logback」があるが、ロギングライブラリでは以下の3つのことが実現可能です。

・ログレベルの設定

・統一したフォーマットの設定

・ファイルの書き込みと転送の設定

 

ログレベルの設定

ログの設定ファイルに指定したレベル以上のログのみ出力するなど、設定可能。

 

統一したフォーマットの設定

年月日、クラス名、ログメッセージのログのフォーマットで構成するなど、設定可能。

 

ファイルの書き込みと転送の設定

ログをファイルに書き込み、別サーバーに転送するなど、設定可能。

 

以上がざっくりとしたセッションの内容でした。

個人的には、非常に参考になりました。内容としては、わりと初歩的な内容が多かったのですが、DIコンテナとかO/Rマッパー、フレームワークって何?って新人に聞かれたときに、どんな感じで説明すれば理解してもらえるか考えると、ざっくりとしたイメージを掴んでもらうという意味で、効果的な説明の仕方だと感じました。ぶっちゃけこの後、色んなセッションを聞きましたが、一番よかったです。