1
【ハンズオン】
Spring を使った Web アプリに
リファクタリングしよう
2016/11/18
日本 Spring ユーザ会
土岐 孝平
自己紹介
• 土岐 孝平 ( とき こうへい )
• Spring を使用したシステム開発の支援
• Java や Spring の研修の講師
• 資格
– Spring Professional
– Spring Web Application Developer
• 書籍の執筆
2
[ 改訂新版 ]Spring 入門
ハンズオンの概要
• Servlet ・ JDBC を直接使ったアプリを、 Spring
を使ったアプリにリファクタリングする
• プログラムが洗練されて、生産性が上がること
を実感する
• Spring が行ってることを知る
– 洗練された部分≒裏で Spring が働く部分
3
アプリの題材
• 顧客管理アプリ
4
参照系
更新系
アプリの構造 ( 現状 )
5
web.xml
DB
ブラウザ
JSP
ファイル
Customer
XxxServlet
Customer
ServiceImpl
Customer
DaoImpl
Customer
Service
Customer
Dao
Customer
JDBC
JDBC
プレゼンテーション層 サービス層 データアクセス層
問題点
• データアクセス層
– リソースの取得・解放のコードが冗長
• サービス層
– トランザクション制御のコードが冗長
• プレゼンテーション層
– リクエストのマッピングが面倒
– 入力チェックのコードが複雑
• その他
– 下位の層の具象クラスに依存
6
リソースの取得・解放のコードが冗長
• sample.customer.dao. CustomerDaoImpl クラス
7
データアクセス層
トランザクション制御のコードが冗長
• sample.customer.service. CustomerServiceImpl
8
サービス層
リクエストのマッピングが面倒
• WEB-INF/web.xml
9
プレゼンテーション層
入力チェックのコードが複雑
• sample.customer.servlet. CustomerEditServlet
10
プレゼンテーション層
下位の層の具象クラスに依存
• sample.customer.service. CustomerServiceImpl
11
その他
【演習】 Spring を使って解決しましょう
• どのように解決されるか、演習を通して理解しましょう
• 演習手順は github にアップされています
– https://github.com/KouheiToki/jsug-handson-20161118
• 演習時間: 80 分
– 目安
• 躓いたら、講師陣にお気軽にお声掛けください
12
初心者 中級者
参照系の機能 80 分 45 分
更新系の機能 50 分 35 分
改善点
• データアクセス層
– DB 接続・切断のコードなくなった
• サービス層
– トランザクション制御のコードがなくなった
• プレゼンテーション層
– リクエストのマッピングが簡単になった
– 入力チェックが簡単になった
• その他
– 下位の層の具象クラスに依存しなくなった
13
リソースの取得・解放のコードがなくなった
• sample.customer.dao. CustomerDaoImpl クラス
14
データアクセス層
トランザクション制御のコードがなくなった
• sample.customer.service. CustomerServiceImpl
15
サービス層
リクエストのマッピングが簡単になった
• sample.customer.controller.CustomerShowController
16
プレゼンテーション層
入力チェックが簡単になった
• sample.customer.entity.Customer
17
プレゼンテーション層
下位の層の具象クラスに依存しなくなった
• sample.customer.service. CustomerServiceImpl
18
その他
その他ポイント
• Bean のコンフィグレーション
– コンフィグレーション方法の種類と使い分け
• データアクセス
– コネクション・トランザクション周りの仕組み
• Spring MVC
– 画面周りの処理の流れ
• Spring Boot
– Spring Boot が行っていること
19
コンフィグレーションの方法
• コンフィグレーションの方法は3種類から選べ
ます
– XML
– アノテーション
– JavaConfig
20
n のコンフィグレーション
DI コンテナ
: Foo
結果は同じ
※ DI コンテナが
  管理するオブジェクトのことを
   Bean という
一般的と思われる使い分け
• 業務個別の Bean(Controller 、 Service 、 Dao) はアノテーション
– Bean の数が増えてもメンテナンスが楽
• 裏方の Bean は XML もしくは JavaConfig
– 環境ごとに Bean 定義を用意&一元化できて切替が容易
– サードパーティのクラスにアノテーションは付けれない
21
:
Controller
: Service : Dao
: Transaction
Manager
:
DataSource
: View
Resolver
本番用 テスト用
業務個別
裏方
n のコンフィグレーション
: Transaction
Manager
:
DataSource
: View
Resolver
コネクション・
トランザクション周りの仕組み
• コネクションの取得・解放、トランザクションの開始・終了は
Spring が行う
– アプリで上記のコードは出てこない
– コネクションを引数で渡さなくてよい
22
foo
:
Controller
: Proxy
@Transactional
: Service : Dao
:データア
クセス機能
foo
bar
baz
SQL
ThreadLocal
: Connection
connect 、  begin
commit 、  close
データアクセス
• HttpServlet を継承した DispacherServlet が全体
の処理を制御している
画面周りの処理の流れ
23
Controller
Model
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
ブラウザ
①
②
③ ④
⑤
⑥
⑦
⑧⑨
Controller と
メソッドを
特定
引数の値を
用意
View の形式・
ファイルを特
定
全体の処理
を制御
Spring MVC
Spring Boot が行っていること
• 必要な Jar ファイルのダウンロードや、裏方の Bean のコンフィグレーショ
ン、組込サーバ (Tomcat) の実行を自動で行ってくれる
• 業務個別の Bean のプログラムの作りは、 Boot を使っても使わなくても変
わらない
• 組込じゃない Tomcat にデプロイすることも可能
24
:
Controller
: Service : Dao
裏方の Bean
: Tomcat
組込サーバ
必要な Jar ファイル
Spring
の jar
JPA
の jar
JUnit
の jar ・・・
Boot が用意
業務個別の Bean
・・・
Spring Boot
Tomcat
の jar
: Transaction
Manager
:
DataSource
: View
Resolver
接続先などの
プロパティ
今回
使用した部分
さいごに
• 書籍を購入して、知識を広げましょう
• おすすめの書籍
25
[ 改訂新版 ]Spring 入門 Spring 徹底入門
26
ご清聴ありがとうございました
27
ライセンスについて
• JSUG マスコットアイコン(本スライド左下)が残されている場合に限り、本作品(またそれ
を元にした派生作品)の複製・頒布・表示・上演を認めます。
• 非商用目的に限り、本作品(またそれを元にした派生作品)の複製・頒布・表示・上演を認め
ます。
• 本作品のライセンスを遵守する限り、派生作品を頒布することを許可します。

Springを使ったwebアプリにリファクタリングしよう