Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~

Yuichi Hasegawa
Yuichi HasegawaOwner, Starlight&Storm LLC at Starlight&Storm
Copyright © 2016 NTT DATA Corporation
株式会社NTTデータ 技術革新統括本部
ソフトウェア工学推進センタ
Application Re-Architecture Technology
~ StrutsからSpring MVCへ ~
2Copyright © 2016 NTT DATA Corporation
自己紹介
池谷 智行
NTTデータ社内標準アプリケーションフレームワークであるTERASOLUNA
Frameworkの整備、展開を担当している。
Spring信者で、Spring MVCやSpring Batchを用いた実務開発経験あり。
「Spring徹底入門」を執筆。
倉元 貴一
長年、某金融機関のミッションクリティカルシステム向けJavaフレームワーク
開発を担当していた。
現在はTERASOLUNAチームでバッチフレームワークに携わりつつ、社内の
様々なプロジェクトのサポートをしている。
「Spring徹底入門」を執筆。
3Copyright © 2016 NTT DATA Corporation
TERASOLUNAとは
Process
Environment
Support
数多くのシステム開発で
培ったノウハウを盛り込んだ
標準開発手順・管理手順
ソフトウェアを開発する際の
雛形になるフレームワーク
と開発を支援するツール
蓄積されたノウハウ
を展開するための
研修や教育サービス
標準手順
サポート
開発環境
数多くのシステム開発実績をもとにした「標準手順」「開発環境」「サポート」を
トータルで提供しており、TERASOLUNAを活用することで、高品質な
システム開発が実現できます。
TERASOLUNAとは、NTTデータのシステム開発を支える
オープン系システム開発のための総合ソリューション
4Copyright © 2016 NTT DATA Corporation
TERASOLUNAフレームワークのコンセプト
業務アプリケーション
エンタープライズ利用における当社知見をベースに、
Springを最大限活用したフレームワークへ
iBATIS
独自フレームワーク層
業務アプリケーション
Spring IO Platform
Spring
Security
Spring
MVC JPA
MyBatis
1. 各種OSSをベースとしつつも、
独自フレームワークの開発に注力
2. 機能説明書を提供
1. OSSを組み合わせ、独自部分を極小化
2. OSSの機能を最大限に活かして開発するため
のベストプラクティスを提供することに注力
開発ガイドライン開発ガイドライン
5Copyright © 2016 NTT DATA Corporation
TERASOLUNA Frameworkの構成要素
•Spring, MyBatisなどのOSSフレームワークソフトウェアフレームワーク
•エンタープライズ向けに必要な汎用的な部品共通ライブラリ
•OSSを利用したエンタープライズ向けアプリ開発に
おけるベストプラクティスドキュメントガイドライン
•基本的な開発方法を学ぶ学習教材チュートリアル
•基本的な機能を実装したサンプルアプリサンプルAP
•プロジェクト構成のひな形ブランクプロジェクト
6Copyright © 2016 NTT DATA Corporation
公開資材の一例
http://terasolunaorg.github.io/
開発ガイドライン
ポータルサイト
資材提供
7Copyright © 2016 NTT DATA Corporation
ニュースリリース
2016/02/24 本格運用開始のニュースリリース
http://www.nttdata.com/jp/ja/news/release/2016/022400.html
エンドースメント頂いた会社様(敬称略)
• Pivotal
• 株式会社NTTデータ イントラマート
• 日本アイ・ビー・エム株式会社
• 日本オラクル株式会社
• 日本電気株式会社
• 株式会社日立製作所
• 富士通株式会社
• Red Hat Inc.
Copyright © 2015 NTT DATA Corporation 8
TERASOLUNA Frameworkの狙い
コモディティ化しつつある領域では
仲間を増やし、業界貢献することが重要
お客様 競合他社 開発者 OSSコミュニティ
9Copyright © 2016 NTT DATA Corporation
(参考)ガイドラインへのアクセス数
公開から33万ユーザ以上にアクセスされ
毎日4000ページビュー以上閲覧されている
10Copyright © 2016 NTT DATA Corporation
Springイベントのスポンサーおよび講演
Springの当社プレゼンスを向上するため
積極的に講演活動およびイベントスポンサーに取り組む
2015年に引き続き、世界最大のSpringプロジェクトイベント
「SpringOne Platform 2016」のシルバースポンサーとして協賛
イベント参加レポートはこちらから
Spring 5.0は来春リリース!クラウドネイティブ開発、マイクロサービス化など最新技術・事例にあふれた4日間
http://codezine.jp/article/detail/9631
11Copyright © 2016 NTT DATA Corporation
Springに関する書籍出版
好評につき
増刷決定!!
Spring徹底入門執筆
Spring初心者からSpring有識者まで
書籍の詳細はこちらから
http://www.shoeisha.co.jp/book/detail/9784798142470
Copyright © 2015 NTT DATA Corporation 12
INDEX
1. なぜ今移行なのか
2. 実プロジェクトでの取り組み
3. おわりに
Copyright © 2016 NTT DATA Corporation 13
なぜ今移行なのか
14Copyright © 2016 NTT DATA Corporation
Struts 1 の EOLがもたらしたこと
• 従来、JavaなエンタープライズシステムはStrutsで組まれていた
• Struts 1.x EOL(2013/4) → 脆弱性発覚(2014/4)
http://www.nttdata.com/jp/ja/news/information/2014/2014042801.html
15Copyright © 2016 NTT DATA Corporation
Struts 1 を使い続けるということ
• Struts 1 を使い続けると…
• セキュリティへの対応が困難になる
• 機会損失を産んでしまう
16Copyright © 2016 NTT DATA Corporation
どうしよう?
17Copyright © 2016 NTT DATA Corporation
http://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016/
Springのシェアは高い!
18Copyright © 2016 NTT DATA Corporation
Struts 1 から Spring へ
業務アプリケーション
当社もSpringを最大限活用したフレームワークへ舵を切った
iBATIS
独自フレームワーク層
業務アプリケーション
Spring IO Platform
Spring
Security
Spring
MVC JPA
MyBatis
開発ガイドライン開発ガイドライン
19Copyright © 2016 NTT DATA Corporation
問題は解決したか?
あらゆるプロジェクトがすぐに追従できない
Copyright © 2015 NTT DATA Corporation 20
業務アプリケーション
フレームワーク
ミドルウェア
OS/HW
ミドルウェア
OS/HW
システム更改パターン
開発 運用
開発 運用
開発 運用
2次(基盤更改)
初期
3次(刷新)
5~7 9~12 14~17経過年数
初期開発時に採用したフレームワークは
長期間利用される傾向がある
初回更改時は、システム基盤更改
(OS/HW/MWのEOL対応)
と簡単な機能追加に留まるケースが多い
2回目の更改時は、システム全体の刷新を
前提にした開発予算が計上されやすい
21Copyright © 2016 NTT DATA Corporation
WebAPサーバ
Spring
JavaEEサーバ
EJB
WebAPサーバ
WebAPサーバ
FW移行の難しさ
• 更改周期と合わないが、外的要因で移行しなくてはならない
• 手軽に移行するソリューションが欲しくなる
• PRJ特化な手順 -> 汎用手順 -> 汎用ツール とできると理想
• ツール化は可能なのか?
• APのアーキテクチャはプロジェクトによりけり。特に、Strutsはフルスタックなフレーム
ワークではないため、ビジネスロジック以降の構成は様々。
全てに対応することは困難。
Struts 1
Action
POJO Logic
JDBCres
req
Struts 1
Action
POJO Logic
JDBCres
req
WebAPサーバ
Struts 1
Action
Session Bean
Entity Beanres
req
Struts 1
Action
POJO Logic
O/R Mapperres
req
①Actionにビジネスロジックをベタ書き
②独自のレイヤリング
③EJB呼び出し
④SSH(Spring + Struts + Hibernate)構成
Copyright © 2015 NTT DATA Corporation 22
移行時に必要となる要素
計画 設計 製造 試験
移行
プロセス
移行時の
見積もり手法
移行の
実施要領
移行
ツール
見積もり
ツール
移行ツール
マニュアル等
移行では、効率化のための各種ツール、
ツールをベースとしたプロセスや実施要領、
移行案件の見積もり方法など、多岐にわたる
• 必要な物や内容は、プロジェクトごとに事情が異なる。
• そっと移行して延命すればいい。機能追加はほとんどない。
• ツール等で極力お金をかけずに処置したいという判断もあり得る。
• 移行した後もアクティブに改修/機能追加する。
• それならばいっそ作りなおしたほうが良いという判断もあり得る。
Copyright © 2015 NTT DATA Corporation 23
移行の影響範囲
計画 設計 製造 試験
BP RD ED ID M/UT IT ST
システム基盤設計 システム基盤構築
業務
機能
処理
FW
コンポーネント
FWFW
コンポーネント
処理
機能
業務フロー
移行コストを最小限とするため、
プロジェクトに合わせて影響範囲を局所化する方策が必要
FW移行の
影響範囲
システム基盤更改の
影響範囲
24Copyright © 2016 NTT DATA Corporation
移行作業の流れの一例
No 作業分類 作業対象
1 設定ファイルの移行 web.xml
データソース
ロギング
プロパティファイル
2 インフラストラクチャ層への移行 DAO関連のI/F, 各種設定ファイル
3 ドメイン層への移行 ビジネスロジック
4 アプリケーション層への移行 アクションフォーム
Struts設定ファイル
アクション
5 設定ファイルの移行 Bean定義ファイル
6 アプリケーション層への移行 JSP
入力チェック
7 共通処理の移行 例外処理
メッセージ
8 セキュリティ対策 認証/認可
XSS対策・CSRF対策等
Struts 1 + Spring から Spring MVCに移行する際の作業の流れ
25Copyright © 2016 NTT DATA Corporation
移行前後のAP資材比較(資材の関連)
Application
Layer
Domain Layer
Infrastructure
Layer
struts-config.xml
validation.xml
ActionForm
sqlMap
.xml
for MyBatis2
sqlMap
.xml
for MyBatis3
MyBatis2
Business Logic
Struts
MyBatis3
Business Logic
Form Bean
(Bean
Validation)
Controller
Spring
MVC
JSP
with struts.tld
JSP
with JSTL, spling.tld
Struts 1.x(+Spring / MyBatis2) Spring MVC
Action
applicationContext.xml
26Copyright © 2016 NTT DATA Corporation
移行前後のAP資材比較(資材の対応)
Application
Layer
Struts 1.x
Domain Layer
Infrastructure
Layer
Spring MVC
validation.xml
ActionForm
Form Bean
(Bean Validation)
Controller
サービスIF
業務
サービス
業務
サービス
sqlMap.xml
for MyBatis2
sqlMap.xml
for MyBatis3
リポジトリIF
struts-config.xml
JSP
with struts.tld
JSP
with JSTL, spling.tld
概要
validation.xmlで定義する入力チェックを、
BeanValidationに移行。
・struts-config.xml等の設定を
@RequestMapping に移行。
・Actionの個々の処理をSpringMVCに合わせて移行。
・Controllerに対するI/Fに変更。
・DAOのI/FをリポジトリIFに変更。
・その他実装は基本そのまま。
sqlMap.xmlのSQL定義をIFメソッドとして移行する。
MyBatis2 からMyBatis3へ記法を移行する。
strutsのタグライブラリを、
JSTLやSpringタグライブラリに移行。
Action
サービスIF
applicationContext.xml
27Copyright © 2016 NTT DATA Corporation
Application
Layer
Struts 1.x
Domain Layer
Infrastructure
Layer
validation.xml
ActionForm
業務
サービス
sqlMap.xml
for MyBatis2
struts-config.xml
JSP
with struts.tld
Action
サービスIF
applicationContext.xml
移行のしやすさ
Spring MVC
Form Bean
(Bean Validation)
Controller
サービスIF
業務
サービス
sqlMap.xml
for MyBatis3
リポジトリIF
JSP
with JSTL, spling.tld
概要
○:
struts標準は汎用的に対処しやすい。
プロジェクト独自作成部分は個別対処。
×:
プロジェクト独自の要素が強いことが多く、
対処しにくい。
設定ファイルの内容を機械的に移植することは可能
だが、Action内の独自処理をそのまま移せるかどう
かは要検討。
△:
元々レイヤリングされている状態ならば対処しやす
い。大半のロジックをそのまま流用するような工夫は
必要。
○:
struts標準タグは汎用的に対処しやすい。
プロジェクト独自作成部分は個別対処。
△:
移行前後のライブラリによって難易度が変わる。
Copyright © 2016 NTT DATA Corporation 28
実プロジェクトでの取り組み
29Copyright © 2016 NTT DATA Corporation
移行を実施するにあたって
• 基本的な考え方
• strutsにあって、spring mvcにない
• 場合によっては仕様変更を検討しつつ対処する。
• 対処漏れが起きにくい。
• strutsにあって、spring mvcにある
• 完全一致ではなく、微妙に違う仕様/挙動になることが多い。
• Struts と Spring MVC はアーキテクチャは似てるけど異なるもの。
• 両方共ActionベースのWebAPフレームワークではある。
• 差を意識しながら扱う必要がある。
以降、実際に起きた問題の一例を紹介します。
• アーキテクチャの差によるもの
• 機能差によるもの
30Copyright © 2016 NTT DATA Corporation
セッション/リクエスト格納データの取得方法の違い
発生した問題
• 画面表示したかったセッションスコープのデータがリクエストスコープの別のデータに置
き換わって表示されてしまった。
• requestスコープの値だけを更新したつもりが、同時にsessionスコープの変数も更新さ
れてしまい不整合なデータが表示されてしまった。
発生条件
• Struts1では、requestスコープとsessionスコープで同じキー名で異なるデータを
使用している。
• Spring MVCへActionFormを移行する際に、
@ModelAttributes、@SessionAttributesを使用している。
result: fuga
requestスコープ
業務AP
sessionスコープ
result=hoge
result=fuga
画面(JSP->HTML)
画面へ出力
期待していなかった、
値が表示されてしまった
イメージ
31Copyright © 2016 NTT DATA Corporation
セッション/リクエスト格納データの取得方法の違い
 Struts1
• リクエスト
• ActionForm(scope=request)
• セッション
• ActionForm(scope=session)
 Spring MVC
• リクエスト
• @ModelAttributes、@QueryParam、@RequestAttribute(Spring 4.3~)、etc...
• セッション
• @SessionAttributes、Session Scoped Bean、@SessionAttribute(Spring 4.3~)
@ModelAttributesや
@SessionAttributesを
使用した場合の話
32Copyright © 2016 NTT DATA Corporation
Model
セッション/リクエスト格納データの取得方法の違い
 Struts1
 Spring MVC
HttpServlet
Request
HttpSession
ActionForm1
(request版)
HttpServlet
Request
HttpSession
Spring MVC
ActionForm1
(session版)
リクエスト・セッション格納データの入力フロー
Application2
(Action)
Application1
(Action)
Application2
(Controller)
Application1
(Controller)Form
Object1
ActionFormとScopeが
明確に分かれており、
同名ActionFormでも
別物として管理される
FormObjectのScopeの違いは
アプリケーションからは透過的な思想なため
同名キーのリクエストとセッションのデータが
同一FormObjectにマッピングされてしまう
Struts1
Application2で取得したいデータ
33Copyright © 2016 NTT DATA Corporation
セッション/リクエスト格納データの取得方法の違い
 Struts1
 Spring MVC
リクエスト・セッションへのデータ出力フロー
JSP
(request出力)
Struts1
Taglibs
JSP
(session出力)
Struts1
Taglibs
HttpServlet
Request
HttpSession
ActionForm1
(session版)
Application2
(Action)
Struts1
ModelHttpServlet
Request
HttpSession
Spring MVC
Application2
(Controller)
Form
Object1
専用のTaglibsを使用することで、
同名のActionFormに対しても
scopeを指定してActionFormを選択可能
JSP
(request出力)
JSP
(session出力)
格納先に問わず、画面表示するデータは
リクエストスコープを経由して画面描画に
使用する思想のため、
リクエストスコープで画面表示データが競合。
元々存在した、偶然に同名キーのリクエストデータ
セッションへ格納しつつ
画面出力したいデータ
34Copyright © 2016 NTT DATA Corporation
Model
セッション/リクエスト格納データの取得方法の違い
 Spring MVC
HttpServlet
Request
HttpSession
Spring MVC
本問題への解決方法
Application2
(Controller)
Application1
(Controller)Form
Object1
Application2で取得したいデータ Form
Object2
ModelHttpServlet
Request
HttpSession
Spring MVC
Application2
(Controller)
Form
Object2
JSP
(request出力)
JSP
(session出力)
元々存在した、偶然に同名キーのリクエストデータ
セッションへ格納しつつ
画面出力したいデータ
各業務処理で使用するFormObjectを洗い出し、
FormObjectの名前(キー名)を、
業務処理毎にユニークな名前に定義しなおす。
@ModelAttributes(“formObject2”)
@SessionAttributes(“formObject2”)
各業務処理で使用するFormObjectを洗い出し、
FormObjectの名前(キー名)を、
ユニークな名前に定義しなおす。
@ModelAttributes -> @ModelAttributes(“formObject2”)
@SessionAttributes -> @SessionAttributes(“formObject2”)
35Copyright © 2016 NTT DATA Corporation
リクエストスコープへのデータ反映タイミングの違い
発生した問題:
• 1リクエストで複数のビジネスロジックを呼び出した際、前段のビジネスロジックの処理結果
が引き継げない。
発生条件
• Struts1で、複数Actionをチェインし複数ビジネスロジックを実行していた
• Struts1では同じActionFormを複数Action間で共有することができる
イメージ
result1:
result2:
result3: piyo
Request scope
result2=fuga
result1=hoge
画面(JSP->HTML)
最後にチェインしたビジネスロジックからの
出力結果しか画面に表示されない
Action1
result3=piyo
Action2 Action3request
response
36Copyright © 2016 NTT DATA Corporation
リクエストスコープへのデータ反映タイミングの違い
 Struts1
• 1リクエストで複数のビジネスロジックを実行させる方法
• Actionを<forward>でチェイン
• リクエストスコープのActionFormに
画面表示データを格納
 Spring MVC
• 1リクエストで複数のビジネスロジックを実行させる方法
• Controllerをforwardでチェイン
• Modelに画面表示データを格納
今回行っていた方法
<action path="/result1
type=“com.example.HogeAction"
name=“hogeActionForm"
scope="request">
<forward name="success" path="/result2"/>
</action>
<action path="/result2 ...
@RequestMapping(“/result1”)
public String result1() {
// ...
return “forward:/result2”;
}
@RequestMapping(“/result2”)
public String result2()...
37Copyright © 2016 NTT DATA Corporation
リクエストスコープへのデータ反映タイミングの違い
 Struts1
 Spring MVC
リクエストへのデータ出力フロー
画面出力したいデータは、Action内で
ActionFormに累積して格納
Action1Struts Action2 Action3
ActionFormreq.setAttribute()
Controller1Spring Controller2 Controller3
リクエストスコープModel
forward
forward
forward
forward
Model
model.addAttribute()
model.addAttribute()
Model
model.addAttribute()
forward
req.setAttribute()
JSP
JSP
view resolvereq.setAttribute()
Modelからリクエストスコープへのデータ反映
のタイミングはViewの解決時のみ
+ModelがForward毎に初期化されるため、
Forwardチェイン時にデータが消失する
(BindingResultも同様)
原因
38Copyright © 2016 NTT DATA Corporation
Model
リクエストスコープへのデータ反映タイミングの違い
 Spring MVC
本問題への解決方法
ControllerSpring Module2 Module3
リクエスト
スコープ
model.addAttribute()
model.addAttribute()
model.addAttribute()
JSP
view resolvereq.setAttribute()
Forwardでチェインさせる方式をやめ、
1Controller内でModelやBindingResultを
持回るようにメソッドコールする
Method call
Method call
Module1
Method call
Spring MVCではforwardによるチェインは一般的ではないことを考慮し、
複数ビジネスロジックの呼び出し方法を変える必要があった。
39Copyright © 2016 NTT DATA Corporation
その他、個別機能で発生した問題の一例
• Spring MVCではStruts1のTransactionTokenに代わる機能がないため、
一部の画面遷移の挙動が変わってしまった。
 TERA5で同等の機能を用意したため、現行と同様の遷移を維持した。
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/ArchitectureInDetail/WebApplicationDetail/DoubleSubmitProtection.html
40Copyright © 2016 NTT DATA Corporation
• 入力チェックがstruts-validator(commons-validator)から
Spring Validator(Bean Validator)に変更する際に、対応しにくいチェッ
クルールが見つかった。
• 正規表現
• Struts 1 : mask / Bean Validation : @Pattern
• 空文字(“”)はチェックの対象外→対象となってしまう。
• 同じ挙動にするため、正規表現の先頭に |を記載した。 例:@Pattern(regexp = "|^[a-z]+$")
• 日本語用の独自チェックルール
• 各プロジェクトでcommons-validatorの拡張ルールを実装している事が多い
• TERA5が用意した文字列チェックアノテーション(@ConsistOf)を活用し、
特定のコードポイント集合に含まれることをチェックするようにした(※1)
• ただし、プロジェクトによってはユーザーから受け付ける値の仕様が変わるため、
既存のチェックルールをそのまま流用して、BeanValidation経由でコールするよ
うにしたケースもあった。
※1: 詳細は、以下を参照
7.6.2.5.5. Bean Validationと連携した文字列チェック
http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/ArchitectureInDetail/GeneralFuncDetail/
StringProcessing.html#stringprocessinghowtousecodepointsvalidator
Copyright © 2016 NTT DATA Corporation 41
おわりに
42Copyright © 2016 NTT DATA Corporation
まとめ
• 移行プロジェクトでは独特なスキルが必要になる。
• プロジェクト特性に合わせた開発プロセスを考え、
影響範囲を局所化できるかどうかがポイントになる。
• ソースの対応を取りながら移していく。
移行前後の差を都度検証しながら進めていくことが大事。
現行をそのまま再現しようとすると、
アーキテクチャや機能の差が出てきて当たり前。
• 小規模な移行案件からナレッジをためていく地道な作業が一番効果的。
43Copyright © 2016 NTT DATA Corporation
最後に
今回の話やTERASOLUNAに興味がある方は下記までご連絡ください
TERASOLUNA窓口
E-mail: terasoluna@am.nttdata.co.jp
電話: 050-5546-2482(平日10時〜18時)
今後もSpringを中心に各種OSSの
ベストプラクティスを提供し続けます
Springをエンタープライズシステム開発で積極的に活用し、
情報交換やコミュニティ活動を活発化して
さらなるSpringの発展、繁栄に向けて共に歩んでいきましょう。
Copyright © 2011 NTT DATA Corporation
Copyright © 2016 NTT DATA Corporation
「TERASOLUNA」及びそのロゴは、日本及びその他の国おける株式会社NTTデータの商標または登録商標です。
その他、記載されている会社名、商品名、サービス名等は、各社の商標または登録商標です。
1 of 44

Recommended

Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~ by
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~apkiban
309 views44 slides
Akka actorを何故使うのか? by
Akka actorを何故使うのか?Akka actorを何故使うのか?
Akka actorを何故使うのか?Nyle Inc.(ナイル株式会社)
2.6K views29 slides
地理分散DBについて by
地理分散DBについて地理分散DBについて
地理分散DBについてKumazaki Hiroki
24.8K views50 slides
LibreOffice API について by
LibreOffice API についてLibreOffice API について
LibreOffice API について健一 辰濱
13.4K views48 slides
thymeleafさいしょの一歩 by
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩Yuichi Hasegawa
12.5K views58 slides
さくっと理解するSpring bootの仕組み by
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
65.2K views38 slides

More Related Content

What's hot

Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2 by
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2
Java Clientで入門する Apache Kafka #jjug_ccc #ccc_e2Yahoo!デベロッパーネットワーク
8.4K views64 slides
Java ORマッパー選定のポイント #jsug by
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
90.2K views66 slides
Spring tools4 by
Spring tools4Spring tools4
Spring tools4Takuya Iwatsuka
10.7K views60 slides
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション by
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッションEnpel
11.1K views14 slides
単なるキャッシュじゃないよ!?infinispanの紹介 by
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介AdvancedTechNight
16K views37 slides
僕なりのAtlassianの管理メソッド by
僕なりのAtlassianの管理メソッド僕なりのAtlassianの管理メソッド
僕なりのAtlassianの管理メソッドNarichika Kajihara
10.5K views55 slides

What's hot(20)

Java ORマッパー選定のポイント #jsug by Masatoshi Tada
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada90.2K views
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション by Enpel
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
2 TomcatによるWebアプリケーションサーバ構築 第2章 Tomcat概要(2)-セッション
Enpel11.1K views
単なるキャッシュじゃないよ!?infinispanの紹介 by AdvancedTechNight
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
AdvancedTechNight16K views
僕なりのAtlassianの管理メソッド by Narichika Kajihara
僕なりのAtlassianの管理メソッド僕なりのAtlassianの管理メソッド
僕なりのAtlassianの管理メソッド
Narichika Kajihara10.5K views
3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ- by yoshitaro yoyo
 3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ- 3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-
3層アーキテクチャとMVCモデル -LaravelにおけるMVCモデルの流れ-
yoshitaro yoyo542 views
EC2でNginxを使ってみよう JAWS大阪第9回勉強会資料 by Masahiro Haraoka
EC2でNginxを使ってみよう JAWS大阪第9回勉強会資料EC2でNginxを使ってみよう JAWS大阪第9回勉強会資料
EC2でNginxを使ってみよう JAWS大阪第9回勉強会資料
Masahiro Haraoka4.3K views
怖くないSpring Bootのオートコンフィグレーション by 土岐 孝平
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平3K views
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要 by Akira Inoue
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
Akira Inoue900 views
これからSpringを使う開発者が知っておくべきこと by 土岐 孝平
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平21.5K views
そんなトランザクションマネージャで大丈夫か? by takezoe
そんなトランザクションマネージャで大丈夫か?そんなトランザクションマネージャで大丈夫か?
そんなトランザクションマネージャで大丈夫か?
takezoe24.6K views
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F... by NTT DATA Technology & Innovation
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
Amazon RDSを参考にしたとりまチューニング by Shunsuke Mihara
Amazon RDSを参考にしたとりまチューニングAmazon RDSを参考にしたとりまチューニング
Amazon RDSを参考にしたとりまチューニング
Shunsuke Mihara4.3K views
デプロイメントパイプラインって何? by ke-m kamekoopa
デプロイメントパイプラインって何?デプロイメントパイプラインって何?
デプロイメントパイプラインって何?
ke-m kamekoopa11.7K views
これから始めるSpringのwebアプリケーション by 土岐 孝平
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
土岐 孝平19.2K views
PostgreSQLの関数属性を知ろう by kasaharatt
PostgreSQLの関数属性を知ろうPostgreSQLの関数属性を知ろう
PostgreSQLの関数属性を知ろう
kasaharatt3.8K views
REST API のコツ by pospome
REST API のコツREST API のコツ
REST API のコツ
pospome52.3K views
Kafka vs Pulsar @KafkaMeetup_20180316 by Nozomi Kurihara
Kafka vs Pulsar @KafkaMeetup_20180316Kafka vs Pulsar @KafkaMeetup_20180316
Kafka vs Pulsar @KafkaMeetup_20180316
Nozomi Kurihara5K views

Viewers also liked

Grailsでドメイン駆動設計を実践する時の勘所 by
Grailsでドメイン駆動設計を実践する時の勘所Grailsでドメイン駆動設計を実践する時の勘所
Grailsでドメイン駆動設計を実践する時の勘所Takuma Watabiki
8.7K views68 slides
Cloud Foundry x Wagby by
Cloud Foundry x WagbyCloud Foundry x Wagby
Cloud Foundry x WagbyYoshinori Nie
5K views86 slides
Spring Day 2016 springの現在過去未来 by
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Yuichi Hasegawa
11.8K views44 slides
Lineにおけるspring frameworkの活用 by
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用Tokuhiro Matsuno
33.7K views54 slides
Spring Day 2016 - Web API アクセス制御の最適解 by
Spring Day 2016 - Web API アクセス制御の最適解Spring Day 2016 - Web API アクセス制御の最適解
Spring Day 2016 - Web API アクセス制御の最適解都元ダイスケ Miyamoto
22.7K views42 slides
Spring bootで学ぶ初めてのwebアプリ開発 by
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発terahide
12.7K views43 slides

Viewers also liked(20)

Grailsでドメイン駆動設計を実践する時の勘所 by Takuma Watabiki
Grailsでドメイン駆動設計を実践する時の勘所Grailsでドメイン駆動設計を実践する時の勘所
Grailsでドメイン駆動設計を実践する時の勘所
Takuma Watabiki8.7K views
Spring Day 2016 springの現在過去未来 by Yuichi Hasegawa
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来
Yuichi Hasegawa11.8K views
Lineにおけるspring frameworkの活用 by Tokuhiro Matsuno
Lineにおけるspring frameworkの活用Lineにおけるspring frameworkの活用
Lineにおけるspring frameworkの活用
Tokuhiro Matsuno33.7K views
Spring bootで学ぶ初めてのwebアプリ開発 by terahide
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発
terahide12.7K views
楽天トラベルとSpring(Spring Day 2016) by Rakuten Group, Inc.
楽天トラベルとSpring(Spring Day 2016)楽天トラベルとSpring(Spring Day 2016)
楽天トラベルとSpring(Spring Day 2016)
Rakuten Group, Inc.14.1K views
Springを使ったwebアプリにリファクタリングしよう by 土岐 孝平
Springを使ったwebアプリにリファクタリングしようSpringを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしよう
土岐 孝平6.8K views
アメブロの大規模システム刷新と それを支えるSpring by Takuya Hattori
アメブロの大規模システム刷新と それを支えるSpringアメブロの大規模システム刷新と それを支えるSpring
アメブロの大規模システム刷新と それを支えるSpring
Takuya Hattori40.8K views
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri... by Toshiaki Maki
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Toshiaki Maki22.3K views
Spring 5に備えるリアクティブプログラミング入門 by Takuya Iwatsuka
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門
Takuya Iwatsuka31.9K views
Distributed tracing - get a grasp on your production by nklmish
Distributed tracing - get a grasp on your productionDistributed tracing - get a grasp on your production
Distributed tracing - get a grasp on your production
nklmish2.2K views
Distributed Tracing Velocity2016 by Reshmi Krishna
Distributed Tracing Velocity2016Distributed Tracing Velocity2016
Distributed Tracing Velocity2016
Reshmi Krishna1.7K views
Spring CloudとZipkinを利用した分散トレーシング by Rakuten Group, Inc.
Spring CloudとZipkinを利用した分散トレーシングSpring CloudとZipkinを利用した分散トレーシング
Spring CloudとZipkinを利用した分散トレーシング
Rakuten Group, Inc.7.3K views
Internetトラフィックエンジニアリングの現実 by J-Stream Inc.
Internetトラフィックエンジニアリングの現実Internetトラフィックエンジニアリングの現実
Internetトラフィックエンジニアリングの現実
J-Stream Inc.5.1K views
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017 by tty fky
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
Business Process Modeling in Goldman Sachs @ JJUG CCC Fall 2017
tty fky4.3K views
Javaアプリケーションの モダナイゼーションアプローチ by CData Software Japan
Javaアプリケーションの モダナイゼーションアプローチJavaアプリケーションの モダナイゼーションアプローチ
Javaアプリケーションの モダナイゼーションアプローチ
高速なソートアルゴリズムを書こう!! by masakazu matsubara
高速なソートアルゴリズムを書こう!!高速なソートアルゴリズムを書こう!!
高速なソートアルゴリズムを書こう!!
Another compilation method in java - AOT (Ahead of Time) compilation by Logico
Another compilation method in java - AOT (Ahead of Time) compilationAnother compilation method in java - AOT (Ahead of Time) compilation
Another compilation method in java - AOT (Ahead of Time) compilation
Logico 3.6K views
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 by Hiroshi Ito
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito59K views

Similar to Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~

Msセミナー20170830 slideshare by
Msセミナー20170830 slideshareMsセミナー20170830 slideshare
Msセミナー20170830 slideshareNHN テコラス株式会社
1K views24 slides
リクルートにおけるPaaS活用事例 by
リクルートにおけるPaaS活用事例リクルートにおけるPaaS活用事例
リクルートにおけるPaaS活用事例Recruit Technologies
3.4K views54 slides
プロジェクト管理支援環境の高度化に向けた取り組み by
プロジェクト管理支援環境の高度化に向けた取り組みプロジェクト管理支援環境の高度化に向けた取り組み
プロジェクト管理支援環境の高度化に向けた取り組みagileware_jp
1.9K views29 slides
Ms retail update ra 20191030 by
Ms retail update ra 20191030Ms retail update ra 20191030
Ms retail update ra 20191030Microsoft Azure Japan
948 views70 slides
Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324 by
Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324
Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324Shotaro Suzuki
598 views26 slides
Relationship betweenddd and mvc by
Relationship betweenddd and mvcRelationship betweenddd and mvc
Relationship betweenddd and mvcTakao Tetsuro
205 views37 slides

Similar to Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~(20)

プロジェクト管理支援環境の高度化に向けた取り組み by agileware_jp
プロジェクト管理支援環境の高度化に向けた取り組みプロジェクト管理支援環境の高度化に向けた取り組み
プロジェクト管理支援環境の高度化に向けた取り組み
agileware_jp1.9K views
Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324 by Shotaro Suzuki
Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324
Enterprise agile dev ops-and-xr-techonology-adoption-for-fintech-20180324
Shotaro Suzuki598 views
Relationship betweenddd and mvc by Takao Tetsuro
Relationship betweenddd and mvcRelationship betweenddd and mvc
Relationship betweenddd and mvc
Takao Tetsuro205 views
1分で分かる SoftLayer 監視入門 by Masahito Zembutsu
1分で分かる SoftLayer 監視入門1分で分かる SoftLayer 監視入門
1分で分かる SoftLayer 監視入門
Masahito Zembutsu6.8K views
M12_数百台の開発サーバをリフトアンドシフト! Azure Migrate 活用ポイント [Microsoft Japan Digital Days] by 日本マイクロソフト株式会社
M12_数百台の開発サーバをリフトアンドシフト! Azure Migrate 活用ポイント [Microsoft Japan Digital Days]M12_数百台の開発サーバをリフトアンドシフト! Azure Migrate 活用ポイント [Microsoft Japan Digital Days]
M12_数百台の開発サーバをリフトアンドシフト! Azure Migrate 活用ポイント [Microsoft Japan Digital Days]
市場動向並びに弊社製品の今後の展望について by Ken Azuma
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
Ken Azuma1K views
A 1-1 tfs on azure で始めるイマドキのソフトウェア開発 by GoAzure
A 1-1 tfs on azure で始めるイマドキのソフトウェア開発A 1-1 tfs on azure で始めるイマドキのソフトウェア開発
A 1-1 tfs on azure で始めるイマドキのソフトウェア開発
GoAzure1.3K views
【#VSUG DAY】Team Foundation Server を乗りこなすコツ教えます by 智治 長沢
【#VSUG DAY】Team Foundation Server を乗りこなすコツ教えます【#VSUG DAY】Team Foundation Server を乗りこなすコツ教えます
【#VSUG DAY】Team Foundation Server を乗りこなすコツ教えます
智治 長沢1.7K views
Redmineの活用事例‐多様なプロジェクト管理に対するツールの適用 by Reiko Rikuno
Redmineの活用事例‐多様なプロジェクト管理に対するツールの適用Redmineの活用事例‐多様なプロジェクト管理に対するツールの適用
Redmineの活用事例‐多様なプロジェクト管理に対するツールの適用
Reiko Rikuno8.3K views
市場動向並びに弊社製品の今後の展望について by Ken Azuma
市場動向並びに弊社製品の今後の展望について市場動向並びに弊社製品の今後の展望について
市場動向並びに弊社製品の今後の展望について
Ken Azuma709 views
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform by Takahiro Fujii
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatformJSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
JSUG SpringOnePlatform 2016報告会 Case study2 - feed back - springoneplatform
Takahiro Fujii983 views
メタバースの始め方、たとえば製造業でのデジタルツインとは? by IoTビジネス共創ラボ
メタバースの始め方、たとえば製造業でのデジタルツインとは?メタバースの始め方、たとえば製造業でのデジタルツインとは?
メタバースの始め方、たとえば製造業でのデジタルツインとは?
JAWS-UG三都物語_企業でのAWS導入のエントリーポイント by Toshiyuki Konparu
JAWS-UG三都物語_企業でのAWS導入のエントリーポイントJAWS-UG三都物語_企業でのAWS導入のエントリーポイント
JAWS-UG三都物語_企業でのAWS導入のエントリーポイント
Toshiyuki Konparu1.8K views
大規模サービスにおける価値開発の“これまで”と“将来”~新たな“じゃらんnet”のチャレンジに関して~ by Recruit Lifestyle Co., Ltd.
大規模サービスにおける価値開発の“これまで”と“将来”~新たな“じゃらんnet”のチャレンジに関して~大規模サービスにおける価値開発の“これまで”と“将来”~新たな“じゃらんnet”のチャレンジに関して~
大規模サービスにおける価値開発の“これまで”と“将来”~新たな“じゃらんnet”のチャレンジに関して~
バッチは地味だが役に立つ by apkiban
バッチは地味だが役に立つバッチは地味だが役に立つ
バッチは地味だが役に立つ
apkiban2.7K views

More from Yuichi Hasegawa

Spring 18年の歴史 by
Spring 18年の歴史Spring 18年の歴史
Spring 18年の歴史Yuichi Hasegawa
1.6K views26 slides
Spring 5でSpring Testのここが変わる_公開版 by
Spring 5でSpring Testのここが変わる_公開版Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版Yuichi Hasegawa
22.1K views176 slides
Enterprise Microservice by
Enterprise MicroserviceEnterprise Microservice
Enterprise MicroserviceYuichi Hasegawa
10.9K views27 slides
マイクロサービス入門(Spring fest 2017) by
マイクロサービス入門(Spring fest 2017)マイクロサービス入門(Spring fest 2017)
マイクロサービス入門(Spring fest 2017)Yuichi Hasegawa
14.6K views32 slides
20170525 jsug バッチは地味だが役に立つ by
20170525 jsug バッチは地味だが役に立つ20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つYuichi Hasegawa
6.1K views72 slides
こどもの絵本 ヒトラーとナチ by
 こどもの絵本 ヒトラーとナチ こどもの絵本 ヒトラーとナチ
こどもの絵本 ヒトラーとナチYuichi Hasegawa
1.7K views15 slides

More from Yuichi Hasegawa(15)

Spring 5でSpring Testのここが変わる_公開版 by Yuichi Hasegawa
Spring 5でSpring Testのここが変わる_公開版Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版
Yuichi Hasegawa22.1K views
マイクロサービス入門(Spring fest 2017) by Yuichi Hasegawa
マイクロサービス入門(Spring fest 2017)マイクロサービス入門(Spring fest 2017)
マイクロサービス入門(Spring fest 2017)
Yuichi Hasegawa14.6K views
20170525 jsug バッチは地味だが役に立つ by Yuichi Hasegawa
20170525 jsug バッチは地味だが役に立つ20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ
Yuichi Hasegawa6.1K views
こどもの絵本 ヒトラーとナチ by Yuichi Hasegawa
 こどもの絵本 ヒトラーとナチ こどもの絵本 ヒトラーとナチ
こどもの絵本 ヒトラーとナチ
Yuichi Hasegawa1.7K views
[Jjug]java small object programming by Yuichi Hasegawa
[Jjug]java small object programming[Jjug]java small object programming
[Jjug]java small object programming
Yuichi Hasegawa4.1K views
[豆ナイト]Java small object programming by Yuichi Hasegawa
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programming
Yuichi Hasegawa2K views

Recently uploaded

システム概要.pdf by
システム概要.pdfシステム概要.pdf
システム概要.pdfTaira Shimizu
44 views1 slide
onewedge_companyguide1 by
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1ONEWEDGE1
89 views22 slides
概要.pdf by
概要.pdf概要.pdf
概要.pdfTaira Shimizu
6 views1 slide
こんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdf by
こんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdfこんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdf
こんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdfkenshirofujita
10 views12 slides
ウォーターフォール開発で生 産性を測る指標 by
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標Kouhei Aoyagi
62 views13 slides
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私修治 松浦
213 views36 slides

Recently uploaded(6)

onewedge_companyguide1 by ONEWEDGE1
onewedge_companyguide1onewedge_companyguide1
onewedge_companyguide1
ONEWEDGE189 views
こんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdf by kenshirofujita
こんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdfこんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdf
こんな私がアクセシビリティ? 〜入り口に立ってモノの見方が広がった話〜.pdf
kenshirofujita10 views
ウォーターフォール開発で生 産性を測る指標 by Kouhei Aoyagi
ウォーターフォール開発で生 産性を測る指標ウォーターフォール開発で生 産性を測る指標
ウォーターフォール開発で生 産性を測る指標
Kouhei Aoyagi62 views
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私 by 修治 松浦
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
JISTA月例会2023年12月 書籍『3カ月で改善!システム障害対応実践ガイド』ご紹介+失敗学と障害対応と私
修治 松浦213 views

Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~

  • 1. Copyright © 2016 NTT DATA Corporation 株式会社NTTデータ 技術革新統括本部 ソフトウェア工学推進センタ Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
  • 2. 2Copyright © 2016 NTT DATA Corporation 自己紹介 池谷 智行 NTTデータ社内標準アプリケーションフレームワークであるTERASOLUNA Frameworkの整備、展開を担当している。 Spring信者で、Spring MVCやSpring Batchを用いた実務開発経験あり。 「Spring徹底入門」を執筆。 倉元 貴一 長年、某金融機関のミッションクリティカルシステム向けJavaフレームワーク 開発を担当していた。 現在はTERASOLUNAチームでバッチフレームワークに携わりつつ、社内の 様々なプロジェクトのサポートをしている。 「Spring徹底入門」を執筆。
  • 3. 3Copyright © 2016 NTT DATA Corporation TERASOLUNAとは Process Environment Support 数多くのシステム開発で 培ったノウハウを盛り込んだ 標準開発手順・管理手順 ソフトウェアを開発する際の 雛形になるフレームワーク と開発を支援するツール 蓄積されたノウハウ を展開するための 研修や教育サービス 標準手順 サポート 開発環境 数多くのシステム開発実績をもとにした「標準手順」「開発環境」「サポート」を トータルで提供しており、TERASOLUNAを活用することで、高品質な システム開発が実現できます。 TERASOLUNAとは、NTTデータのシステム開発を支える オープン系システム開発のための総合ソリューション
  • 4. 4Copyright © 2016 NTT DATA Corporation TERASOLUNAフレームワークのコンセプト 業務アプリケーション エンタープライズ利用における当社知見をベースに、 Springを最大限活用したフレームワークへ iBATIS 独自フレームワーク層 業務アプリケーション Spring IO Platform Spring Security Spring MVC JPA MyBatis 1. 各種OSSをベースとしつつも、 独自フレームワークの開発に注力 2. 機能説明書を提供 1. OSSを組み合わせ、独自部分を極小化 2. OSSの機能を最大限に活かして開発するため のベストプラクティスを提供することに注力 開発ガイドライン開発ガイドライン
  • 5. 5Copyright © 2016 NTT DATA Corporation TERASOLUNA Frameworkの構成要素 •Spring, MyBatisなどのOSSフレームワークソフトウェアフレームワーク •エンタープライズ向けに必要な汎用的な部品共通ライブラリ •OSSを利用したエンタープライズ向けアプリ開発に おけるベストプラクティスドキュメントガイドライン •基本的な開発方法を学ぶ学習教材チュートリアル •基本的な機能を実装したサンプルアプリサンプルAP •プロジェクト構成のひな形ブランクプロジェクト
  • 6. 6Copyright © 2016 NTT DATA Corporation 公開資材の一例 http://terasolunaorg.github.io/ 開発ガイドライン ポータルサイト 資材提供
  • 7. 7Copyright © 2016 NTT DATA Corporation ニュースリリース 2016/02/24 本格運用開始のニュースリリース http://www.nttdata.com/jp/ja/news/release/2016/022400.html エンドースメント頂いた会社様(敬称略) • Pivotal • 株式会社NTTデータ イントラマート • 日本アイ・ビー・エム株式会社 • 日本オラクル株式会社 • 日本電気株式会社 • 株式会社日立製作所 • 富士通株式会社 • Red Hat Inc.
  • 8. Copyright © 2015 NTT DATA Corporation 8 TERASOLUNA Frameworkの狙い コモディティ化しつつある領域では 仲間を増やし、業界貢献することが重要 お客様 競合他社 開発者 OSSコミュニティ
  • 9. 9Copyright © 2016 NTT DATA Corporation (参考)ガイドラインへのアクセス数 公開から33万ユーザ以上にアクセスされ 毎日4000ページビュー以上閲覧されている
  • 10. 10Copyright © 2016 NTT DATA Corporation Springイベントのスポンサーおよび講演 Springの当社プレゼンスを向上するため 積極的に講演活動およびイベントスポンサーに取り組む 2015年に引き続き、世界最大のSpringプロジェクトイベント 「SpringOne Platform 2016」のシルバースポンサーとして協賛 イベント参加レポートはこちらから Spring 5.0は来春リリース!クラウドネイティブ開発、マイクロサービス化など最新技術・事例にあふれた4日間 http://codezine.jp/article/detail/9631
  • 11. 11Copyright © 2016 NTT DATA Corporation Springに関する書籍出版 好評につき 増刷決定!! Spring徹底入門執筆 Spring初心者からSpring有識者まで 書籍の詳細はこちらから http://www.shoeisha.co.jp/book/detail/9784798142470
  • 12. Copyright © 2015 NTT DATA Corporation 12 INDEX 1. なぜ今移行なのか 2. 実プロジェクトでの取り組み 3. おわりに
  • 13. Copyright © 2016 NTT DATA Corporation 13 なぜ今移行なのか
  • 14. 14Copyright © 2016 NTT DATA Corporation Struts 1 の EOLがもたらしたこと • 従来、JavaなエンタープライズシステムはStrutsで組まれていた • Struts 1.x EOL(2013/4) → 脆弱性発覚(2014/4) http://www.nttdata.com/jp/ja/news/information/2014/2014042801.html
  • 15. 15Copyright © 2016 NTT DATA Corporation Struts 1 を使い続けるということ • Struts 1 を使い続けると… • セキュリティへの対応が困難になる • 機会損失を産んでしまう
  • 16. 16Copyright © 2016 NTT DATA Corporation どうしよう?
  • 17. 17Copyright © 2016 NTT DATA Corporation http://zeroturnaround.com/rebellabs/java-tools-and-technologies-landscape-2016/ Springのシェアは高い!
  • 18. 18Copyright © 2016 NTT DATA Corporation Struts 1 から Spring へ 業務アプリケーション 当社もSpringを最大限活用したフレームワークへ舵を切った iBATIS 独自フレームワーク層 業務アプリケーション Spring IO Platform Spring Security Spring MVC JPA MyBatis 開発ガイドライン開発ガイドライン
  • 19. 19Copyright © 2016 NTT DATA Corporation 問題は解決したか? あらゆるプロジェクトがすぐに追従できない
  • 20. Copyright © 2015 NTT DATA Corporation 20 業務アプリケーション フレームワーク ミドルウェア OS/HW ミドルウェア OS/HW システム更改パターン 開発 運用 開発 運用 開発 運用 2次(基盤更改) 初期 3次(刷新) 5~7 9~12 14~17経過年数 初期開発時に採用したフレームワークは 長期間利用される傾向がある 初回更改時は、システム基盤更改 (OS/HW/MWのEOL対応) と簡単な機能追加に留まるケースが多い 2回目の更改時は、システム全体の刷新を 前提にした開発予算が計上されやすい
  • 21. 21Copyright © 2016 NTT DATA Corporation WebAPサーバ Spring JavaEEサーバ EJB WebAPサーバ WebAPサーバ FW移行の難しさ • 更改周期と合わないが、外的要因で移行しなくてはならない • 手軽に移行するソリューションが欲しくなる • PRJ特化な手順 -> 汎用手順 -> 汎用ツール とできると理想 • ツール化は可能なのか? • APのアーキテクチャはプロジェクトによりけり。特に、Strutsはフルスタックなフレーム ワークではないため、ビジネスロジック以降の構成は様々。 全てに対応することは困難。 Struts 1 Action POJO Logic JDBCres req Struts 1 Action POJO Logic JDBCres req WebAPサーバ Struts 1 Action Session Bean Entity Beanres req Struts 1 Action POJO Logic O/R Mapperres req ①Actionにビジネスロジックをベタ書き ②独自のレイヤリング ③EJB呼び出し ④SSH(Spring + Struts + Hibernate)構成
  • 22. Copyright © 2015 NTT DATA Corporation 22 移行時に必要となる要素 計画 設計 製造 試験 移行 プロセス 移行時の 見積もり手法 移行の 実施要領 移行 ツール 見積もり ツール 移行ツール マニュアル等 移行では、効率化のための各種ツール、 ツールをベースとしたプロセスや実施要領、 移行案件の見積もり方法など、多岐にわたる • 必要な物や内容は、プロジェクトごとに事情が異なる。 • そっと移行して延命すればいい。機能追加はほとんどない。 • ツール等で極力お金をかけずに処置したいという判断もあり得る。 • 移行した後もアクティブに改修/機能追加する。 • それならばいっそ作りなおしたほうが良いという判断もあり得る。
  • 23. Copyright © 2015 NTT DATA Corporation 23 移行の影響範囲 計画 設計 製造 試験 BP RD ED ID M/UT IT ST システム基盤設計 システム基盤構築 業務 機能 処理 FW コンポーネント FWFW コンポーネント 処理 機能 業務フロー 移行コストを最小限とするため、 プロジェクトに合わせて影響範囲を局所化する方策が必要 FW移行の 影響範囲 システム基盤更改の 影響範囲
  • 24. 24Copyright © 2016 NTT DATA Corporation 移行作業の流れの一例 No 作業分類 作業対象 1 設定ファイルの移行 web.xml データソース ロギング プロパティファイル 2 インフラストラクチャ層への移行 DAO関連のI/F, 各種設定ファイル 3 ドメイン層への移行 ビジネスロジック 4 アプリケーション層への移行 アクションフォーム Struts設定ファイル アクション 5 設定ファイルの移行 Bean定義ファイル 6 アプリケーション層への移行 JSP 入力チェック 7 共通処理の移行 例外処理 メッセージ 8 セキュリティ対策 認証/認可 XSS対策・CSRF対策等 Struts 1 + Spring から Spring MVCに移行する際の作業の流れ
  • 25. 25Copyright © 2016 NTT DATA Corporation 移行前後のAP資材比較(資材の関連) Application Layer Domain Layer Infrastructure Layer struts-config.xml validation.xml ActionForm sqlMap .xml for MyBatis2 sqlMap .xml for MyBatis3 MyBatis2 Business Logic Struts MyBatis3 Business Logic Form Bean (Bean Validation) Controller Spring MVC JSP with struts.tld JSP with JSTL, spling.tld Struts 1.x(+Spring / MyBatis2) Spring MVC Action applicationContext.xml
  • 26. 26Copyright © 2016 NTT DATA Corporation 移行前後のAP資材比較(資材の対応) Application Layer Struts 1.x Domain Layer Infrastructure Layer Spring MVC validation.xml ActionForm Form Bean (Bean Validation) Controller サービスIF 業務 サービス 業務 サービス sqlMap.xml for MyBatis2 sqlMap.xml for MyBatis3 リポジトリIF struts-config.xml JSP with struts.tld JSP with JSTL, spling.tld 概要 validation.xmlで定義する入力チェックを、 BeanValidationに移行。 ・struts-config.xml等の設定を @RequestMapping に移行。 ・Actionの個々の処理をSpringMVCに合わせて移行。 ・Controllerに対するI/Fに変更。 ・DAOのI/FをリポジトリIFに変更。 ・その他実装は基本そのまま。 sqlMap.xmlのSQL定義をIFメソッドとして移行する。 MyBatis2 からMyBatis3へ記法を移行する。 strutsのタグライブラリを、 JSTLやSpringタグライブラリに移行。 Action サービスIF applicationContext.xml
  • 27. 27Copyright © 2016 NTT DATA Corporation Application Layer Struts 1.x Domain Layer Infrastructure Layer validation.xml ActionForm 業務 サービス sqlMap.xml for MyBatis2 struts-config.xml JSP with struts.tld Action サービスIF applicationContext.xml 移行のしやすさ Spring MVC Form Bean (Bean Validation) Controller サービスIF 業務 サービス sqlMap.xml for MyBatis3 リポジトリIF JSP with JSTL, spling.tld 概要 ○: struts標準は汎用的に対処しやすい。 プロジェクト独自作成部分は個別対処。 ×: プロジェクト独自の要素が強いことが多く、 対処しにくい。 設定ファイルの内容を機械的に移植することは可能 だが、Action内の独自処理をそのまま移せるかどう かは要検討。 △: 元々レイヤリングされている状態ならば対処しやす い。大半のロジックをそのまま流用するような工夫は 必要。 ○: struts標準タグは汎用的に対処しやすい。 プロジェクト独自作成部分は個別対処。 △: 移行前後のライブラリによって難易度が変わる。
  • 28. Copyright © 2016 NTT DATA Corporation 28 実プロジェクトでの取り組み
  • 29. 29Copyright © 2016 NTT DATA Corporation 移行を実施するにあたって • 基本的な考え方 • strutsにあって、spring mvcにない • 場合によっては仕様変更を検討しつつ対処する。 • 対処漏れが起きにくい。 • strutsにあって、spring mvcにある • 完全一致ではなく、微妙に違う仕様/挙動になることが多い。 • Struts と Spring MVC はアーキテクチャは似てるけど異なるもの。 • 両方共ActionベースのWebAPフレームワークではある。 • 差を意識しながら扱う必要がある。 以降、実際に起きた問題の一例を紹介します。 • アーキテクチャの差によるもの • 機能差によるもの
  • 30. 30Copyright © 2016 NTT DATA Corporation セッション/リクエスト格納データの取得方法の違い 発生した問題 • 画面表示したかったセッションスコープのデータがリクエストスコープの別のデータに置 き換わって表示されてしまった。 • requestスコープの値だけを更新したつもりが、同時にsessionスコープの変数も更新さ れてしまい不整合なデータが表示されてしまった。 発生条件 • Struts1では、requestスコープとsessionスコープで同じキー名で異なるデータを 使用している。 • Spring MVCへActionFormを移行する際に、 @ModelAttributes、@SessionAttributesを使用している。 result: fuga requestスコープ 業務AP sessionスコープ result=hoge result=fuga 画面(JSP->HTML) 画面へ出力 期待していなかった、 値が表示されてしまった イメージ
  • 31. 31Copyright © 2016 NTT DATA Corporation セッション/リクエスト格納データの取得方法の違い  Struts1 • リクエスト • ActionForm(scope=request) • セッション • ActionForm(scope=session)  Spring MVC • リクエスト • @ModelAttributes、@QueryParam、@RequestAttribute(Spring 4.3~)、etc... • セッション • @SessionAttributes、Session Scoped Bean、@SessionAttribute(Spring 4.3~) @ModelAttributesや @SessionAttributesを 使用した場合の話
  • 32. 32Copyright © 2016 NTT DATA Corporation Model セッション/リクエスト格納データの取得方法の違い  Struts1  Spring MVC HttpServlet Request HttpSession ActionForm1 (request版) HttpServlet Request HttpSession Spring MVC ActionForm1 (session版) リクエスト・セッション格納データの入力フロー Application2 (Action) Application1 (Action) Application2 (Controller) Application1 (Controller)Form Object1 ActionFormとScopeが 明確に分かれており、 同名ActionFormでも 別物として管理される FormObjectのScopeの違いは アプリケーションからは透過的な思想なため 同名キーのリクエストとセッションのデータが 同一FormObjectにマッピングされてしまう Struts1 Application2で取得したいデータ
  • 33. 33Copyright © 2016 NTT DATA Corporation セッション/リクエスト格納データの取得方法の違い  Struts1  Spring MVC リクエスト・セッションへのデータ出力フロー JSP (request出力) Struts1 Taglibs JSP (session出力) Struts1 Taglibs HttpServlet Request HttpSession ActionForm1 (session版) Application2 (Action) Struts1 ModelHttpServlet Request HttpSession Spring MVC Application2 (Controller) Form Object1 専用のTaglibsを使用することで、 同名のActionFormに対しても scopeを指定してActionFormを選択可能 JSP (request出力) JSP (session出力) 格納先に問わず、画面表示するデータは リクエストスコープを経由して画面描画に 使用する思想のため、 リクエストスコープで画面表示データが競合。 元々存在した、偶然に同名キーのリクエストデータ セッションへ格納しつつ 画面出力したいデータ
  • 34. 34Copyright © 2016 NTT DATA Corporation Model セッション/リクエスト格納データの取得方法の違い  Spring MVC HttpServlet Request HttpSession Spring MVC 本問題への解決方法 Application2 (Controller) Application1 (Controller)Form Object1 Application2で取得したいデータ Form Object2 ModelHttpServlet Request HttpSession Spring MVC Application2 (Controller) Form Object2 JSP (request出力) JSP (session出力) 元々存在した、偶然に同名キーのリクエストデータ セッションへ格納しつつ 画面出力したいデータ 各業務処理で使用するFormObjectを洗い出し、 FormObjectの名前(キー名)を、 業務処理毎にユニークな名前に定義しなおす。 @ModelAttributes(“formObject2”) @SessionAttributes(“formObject2”) 各業務処理で使用するFormObjectを洗い出し、 FormObjectの名前(キー名)を、 ユニークな名前に定義しなおす。 @ModelAttributes -> @ModelAttributes(“formObject2”) @SessionAttributes -> @SessionAttributes(“formObject2”)
  • 35. 35Copyright © 2016 NTT DATA Corporation リクエストスコープへのデータ反映タイミングの違い 発生した問題: • 1リクエストで複数のビジネスロジックを呼び出した際、前段のビジネスロジックの処理結果 が引き継げない。 発生条件 • Struts1で、複数Actionをチェインし複数ビジネスロジックを実行していた • Struts1では同じActionFormを複数Action間で共有することができる イメージ result1: result2: result3: piyo Request scope result2=fuga result1=hoge 画面(JSP->HTML) 最後にチェインしたビジネスロジックからの 出力結果しか画面に表示されない Action1 result3=piyo Action2 Action3request response
  • 36. 36Copyright © 2016 NTT DATA Corporation リクエストスコープへのデータ反映タイミングの違い  Struts1 • 1リクエストで複数のビジネスロジックを実行させる方法 • Actionを<forward>でチェイン • リクエストスコープのActionFormに 画面表示データを格納  Spring MVC • 1リクエストで複数のビジネスロジックを実行させる方法 • Controllerをforwardでチェイン • Modelに画面表示データを格納 今回行っていた方法 <action path="/result1 type=“com.example.HogeAction" name=“hogeActionForm" scope="request"> <forward name="success" path="/result2"/> </action> <action path="/result2 ... @RequestMapping(“/result1”) public String result1() { // ... return “forward:/result2”; } @RequestMapping(“/result2”) public String result2()...
  • 37. 37Copyright © 2016 NTT DATA Corporation リクエストスコープへのデータ反映タイミングの違い  Struts1  Spring MVC リクエストへのデータ出力フロー 画面出力したいデータは、Action内で ActionFormに累積して格納 Action1Struts Action2 Action3 ActionFormreq.setAttribute() Controller1Spring Controller2 Controller3 リクエストスコープModel forward forward forward forward Model model.addAttribute() model.addAttribute() Model model.addAttribute() forward req.setAttribute() JSP JSP view resolvereq.setAttribute() Modelからリクエストスコープへのデータ反映 のタイミングはViewの解決時のみ +ModelがForward毎に初期化されるため、 Forwardチェイン時にデータが消失する (BindingResultも同様) 原因
  • 38. 38Copyright © 2016 NTT DATA Corporation Model リクエストスコープへのデータ反映タイミングの違い  Spring MVC 本問題への解決方法 ControllerSpring Module2 Module3 リクエスト スコープ model.addAttribute() model.addAttribute() model.addAttribute() JSP view resolvereq.setAttribute() Forwardでチェインさせる方式をやめ、 1Controller内でModelやBindingResultを 持回るようにメソッドコールする Method call Method call Module1 Method call Spring MVCではforwardによるチェインは一般的ではないことを考慮し、 複数ビジネスロジックの呼び出し方法を変える必要があった。
  • 39. 39Copyright © 2016 NTT DATA Corporation その他、個別機能で発生した問題の一例 • Spring MVCではStruts1のTransactionTokenに代わる機能がないため、 一部の画面遷移の挙動が変わってしまった。  TERA5で同等の機能を用意したため、現行と同様の遷移を維持した。 http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/ArchitectureInDetail/WebApplicationDetail/DoubleSubmitProtection.html
  • 40. 40Copyright © 2016 NTT DATA Corporation • 入力チェックがstruts-validator(commons-validator)から Spring Validator(Bean Validator)に変更する際に、対応しにくいチェッ クルールが見つかった。 • 正規表現 • Struts 1 : mask / Bean Validation : @Pattern • 空文字(“”)はチェックの対象外→対象となってしまう。 • 同じ挙動にするため、正規表現の先頭に |を記載した。 例:@Pattern(regexp = "|^[a-z]+$") • 日本語用の独自チェックルール • 各プロジェクトでcommons-validatorの拡張ルールを実装している事が多い • TERA5が用意した文字列チェックアノテーション(@ConsistOf)を活用し、 特定のコードポイント集合に含まれることをチェックするようにした(※1) • ただし、プロジェクトによってはユーザーから受け付ける値の仕様が変わるため、 既存のチェックルールをそのまま流用して、BeanValidation経由でコールするよ うにしたケースもあった。 ※1: 詳細は、以下を参照 7.6.2.5.5. Bean Validationと連携した文字列チェック http://terasolunaorg.github.io/guideline/5.2.0.RELEASE/ja/ArchitectureInDetail/GeneralFuncDetail/ StringProcessing.html#stringprocessinghowtousecodepointsvalidator
  • 41. Copyright © 2016 NTT DATA Corporation 41 おわりに
  • 42. 42Copyright © 2016 NTT DATA Corporation まとめ • 移行プロジェクトでは独特なスキルが必要になる。 • プロジェクト特性に合わせた開発プロセスを考え、 影響範囲を局所化できるかどうかがポイントになる。 • ソースの対応を取りながら移していく。 移行前後の差を都度検証しながら進めていくことが大事。 現行をそのまま再現しようとすると、 アーキテクチャや機能の差が出てきて当たり前。 • 小規模な移行案件からナレッジをためていく地道な作業が一番効果的。
  • 43. 43Copyright © 2016 NTT DATA Corporation 最後に 今回の話やTERASOLUNAに興味がある方は下記までご連絡ください TERASOLUNA窓口 E-mail: terasoluna@am.nttdata.co.jp 電話: 050-5546-2482(平日10時〜18時) 今後もSpringを中心に各種OSSの ベストプラクティスを提供し続けます Springをエンタープライズシステム開発で積極的に活用し、 情報交換やコミュニティ活動を活発化して さらなるSpringの発展、繁栄に向けて共に歩んでいきましょう。
  • 44. Copyright © 2011 NTT DATA Corporation Copyright © 2016 NTT DATA Corporation 「TERASOLUNA」及びそのロゴは、日本及びその他の国おける株式会社NTTデータの商標または登録商標です。 その他、記載されている会社名、商品名、サービス名等は、各社の商標または登録商標です。