SlideShare a Scribd company logo
Copyright©2017 NTT corp. All Rights Reserved.
Spring I/O 2017 報告会
ThymeleafのWebFlux対応
2017年6⽉29⽇
NTT ソフトウェアイノベーションセンタ
岩塚 卓弥
2Copyright©2017 NTT corp. All Rights Reserved.
• 名前:岩塚 卓弥
• 所属:NTT ソフトウェアイノベーションセンタ
• NTTの研究所のうちソフトウェアを専⾨に扱う
• ⾃部署ではソフトウェア⼯学を研究
• Springベースのグループ共通フレームワークの整備を担当
• Spring I/Oには2015年から3年連続参加
⾃⼰紹介
3Copyright©2017 NTT corp. All Rights Reserved.
• Getting Thymeleaf Ready for Spring 5 and
Reactive
• Daniel Fernández – Thymeleaf lead
• スライド
• https://speakerdeck.com/dfernandez/o-2017-getting-
thymeleaf-ready-for-spring-5-and-reactive
• デモ
• https://github.com/danielfernandez/reactive-matchday
今⽇の元ネタ(⼀次資料)
4Copyright©2017 NTT corp. All Rights Reserved.
• Thymeleaf 3を使⽤している
• Thymeleaf 2を使⽤している
• JSPを使⽤している
• その他のテンプレートエンジンを使っている
会場アンケート:Thymeleaf 使ってますか
5Copyright©2017 NTT corp. All Rights Reserved.
世界での利⽤状況
Spring Initializrで選択される
テンプレートエンジンのうち
75%程度がThymeleaf
Thymeleaf Freemarker Mustache
Groovy Templates Velocity
⽉間DL数は22万以上
⼀年で7万5千以上の伸び
Spring I/O 2017 Keynoteより
6Copyright©2017 NTT corp. All Rights Reserved.
Spring MVC × Thymeleaf 3 の基本形
greeting.html
実装
出⼒
7Copyright©2017 NTT corp. All Rights Reserved.
Spring MVC × Thymeleaf 3 処理概略
TemplateName
Context
Engine
Model
Template
+α
HTML
Controllerで設定したModel
(Map<String, Object>)
8Copyright©2017 NTT corp. All Rights Reserved.
Spring MVC × Thymeleaf 3 処理概略
TemplateName
Context
Engine
Model
Template
+α
HTML
Controllerから渡された
View名を解決したもの
ServletContextや
パス変数等を追加
9Copyright©2017 NTT corp. All Rights Reserved.
Spring MVC × Thymeleaf 3 処理概略
TemplateName
Context
Engine
Model
Template
+α
HTMLTemplateを取得
TemplateとContextから
HTMLを⽣成
10Copyright©2017 NTT corp. All Rights Reserved.
Spring MVC × Thymeleaf 3 処理概略
TemplateName
Context
Engine
Model
Template
+α
HTML HttpServletResponseに
書き込み
11Copyright©2017 NTT corp. All Rights Reserved.
Reactive化?
TemplateName
Context
Engine
Model
Template
+α
HTML
Blocking! Blocking!
12Copyright©2017 NTT corp. All Rights Reserved.
Reactive化?
TemplateName
Context
Engine
Model
Template
+α
HTML
Blocking! Reactive!
出⼒をPublisherに
13Copyright©2017 NTT corp. All Rights Reserved.
• FULL
• CHUNKED
• DATA-DRIVEN
Reactiveな3つの処理モード
14Copyright©2017 NTT corp. All Rights Reserved.
FULLモード
HTML
Mono<DataBuffer>Engine
ServerHttpResponseに書き込み
HTMLを⼀括⽣成して⼀括出⼒
→ 最もシンプルだがメモリ消費は⼤
15Copyright©2017 NTT corp. All Rights Reserved.
• FULL
• CHUNKED
• DATA-DRIVEN
Reactiveな3つの処理モード
16Copyright©2017 NTT corp. All Rights Reserved.
CHUNKEDモード
<!DOCTYPE html>
…
Flux<DataBuffer>Engine
ServerHttpResponseに書き込み
・・・
…
</html>
HTMLを⼀定のバイト数ごとに区切って⽣成
→ backpressureによって速度調整可能に
17Copyright©2017 NTT corp. All Rights Reserved.
• FULL
• CHUNKED
• DATA-DRIVEN
Reactiveな3つの処理モード
18Copyright©2017 NTT corp. All Rights Reserved.
FULL / CHUNKED に共通の課題
Model Mono
Flux
19Copyright©2017 NTT corp. All Rights Reserved.
FULL / CHUNKED に共通の課題
Context
Engine
Model Mono
Flux
ArrayList
Mono Mono
AbstractView#resolveAsyncAttributes
CollectList
20Copyright©2017 NTT corp. All Rights Reserved.
DATA-DRIVENモード
Context
Engine
Model
ReactiveDataDriverContextVariable
wrapすることでresolutionを回避
… … …
ThymeleafがProcessorのように振る舞う
21Copyright©2017 NTT corp. All Rights Reserved.
DATA-DRIVEN & SSE
DATA-DRIVENモードの場合はデータ1件ごとに
部分的なHTMLをSSEで送信可能
<table>
<tr data-th-each=“name : ${names}”>
<td>[[${name}]]</td>
</tr>
</table>
+
Alice Bob Carol
event: head
id: 0
data: <table>
event: body
id: 1
data: <tr>
data: <td>Alice</td>
data: <tr>
event: tail
id: 4
data: </table>
・・・
22Copyright©2017 NTT corp. All Rights Reserved.
デモアプリ紹介
試合状況
コメント
23Copyright©2017 NTT corp. All Rights Reserved.
初期画⾯表⽰
Agent Controller
ReavtiveMongoTemplate
ReactiveMongoRepository
match/{matchId}
初期画⾯
リクエスト以前のコメント
対戦チーム情報など
24Copyright©2017 NTT corp. All Rights Reserved.
初期画⾯表⽰の実装 - MatchController
コメントのFluxを取得
コメントのFluxをReactiveDataDriverContextVariableで
warpしてModelに追加 → DATA-DRIVENモード
25Copyright©2017 NTT corp. All Rights Reserved.
デモアプリ紹介
動的に更新
26Copyright©2017 NTT corp. All Rights Reserved.
試合状況描画
Agent Controller
ReavtiveMongoTemplate
ReactiveMongoRepository
match/{matchId}/statusStream
画⾯の⼀部
(SSEで送信)
試合状況
javascriptで画⾯に反映
27Copyright©2017 NTT corp. All Rights Reserved.
試合状況描画
Agent Controller
ReavtiveMongoTemplate
ReactiveMongoRepository
画⾯の⼀部を⽣成
(SSEで送信)
新しい試合状況を取得
javascriptで画⾯に反映
得点や警告などの
イベントをランダム⽣成
新しいイベントを挿⼊
28Copyright©2017 NTT corp. All Rights Reserved.
試合状況描画の実装 -
MatchEventInfoRepository
MongoDBのTailable Cursorを使⽤して
新しくinsertされたデータを取得し続ける
29Copyright©2017 NTT corp. All Rights Reserved.
試合状況描画の実装 - MatchController
SSEで送信
Thymeleafで画⾯の⼀部を⽣成
DATA-DRIVEN モード
30Copyright©2017 NTT corp. All Rights Reserved.
試合状況描画の実装 – match.html (js)
SSEで送信されてきた画⾯の⼀部を使って
画⾯を部分的に書き換える
部分⽣成対象
31Copyright©2017 NTT corp. All Rights Reserved.
デモアプリ紹介
動的に追加
32Copyright©2017 NTT corp. All Rights Reserved.
コメント描画
Agent Controller
ReavtiveMongoTemplate
ReactiveMongoRepository
match/{matchId}/commentStream?
timestamp=xxxxxxxx(初期リクエスト時刻)
json
(SSEで送信)
指定timestampより
後のコメント
javascriptで画⾯に反映
33Copyright©2017 NTT corp. All Rights Reserved.
コメント描画
Agent Controller
ReavtiveMongoTemplate
ReactiveMongoRepository
json
(SSEで送信)
javascriptで画⾯に反映
コメントをランダム⽣成
新しいコメントを取得
新しいコメントを挿⼊
34Copyright©2017 NTT corp. All Rights Reserved.
試合状況描画の実装 -
MatchCommentRepository
MongoDBのTailable Cursorを使⽤して
新しくinsertされたデータを取得し続ける
35Copyright©2017 NTT corp. All Rights Reserved.
コメント描画の実装 - MatchController
jsonをSSEで送信
36Copyright©2017 NTT corp. All Rights Reserved.
試合状況描画の実装 – match.html (js)
SSEで送信されてきたjsonデータを使って
画⾯を部分的に書き換える
37Copyright©2017 NTT corp. All Rights Reserved.
• Thymeleaf 3 × WebFluxでReactiveなView出⼒
• 3つの処理モード
• FULL
• CHUNKED
• DATA-DRIVEN
• ⾒所満載のデモ
まとめ
是⾮⼀次資料(スライド / ソースコード)に
アクセスしてみて下さい!

More Related Content

PDF
Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions
PPTX
Spring I/O 2015 報告
PDF
SpringOne 2016 報告 Reactive APIの設計・実装・使用
PDF
Spring social の基礎
PPTX
Spring 5に備えるリアクティブプログラミング入門
PPTX
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
PPTX
SpringIO2019報告_Kotlin関連
PDF
ニュースアプリで起きた不具合から学んだ 最適への一歩
Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions
Spring I/O 2015 報告
SpringOne 2016 報告 Reactive APIの設計・実装・使用
Spring social の基礎
Spring 5に備えるリアクティブプログラミング入門
Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能
SpringIO2019報告_Kotlin関連
ニュースアプリで起きた不具合から学んだ 最適への一歩

What's hot (20)

PDF
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
PDF
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
PPTX
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
PDF
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
PDF
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
PDF
僕とヤフーと時々Teradata #prestodb
PDF
決済金融から始めるデータドリブンカンパニー #yjmu
PDF
Spring Security 5.0 解剖速報
PDF
Keynote
PDF
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
PDF
Ladder of cqrs+es
PDF
Design pattern in presto source code
PDF
コンテナ時代にインフラエンジニアは何をするのか
PDF
Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜
PDF
Storm の新機能について @HSCR #hadoopreading
PDF
Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...
PDF
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
PDF
TypeScript製フレームワーク「Nest」のご紹介
PPTX
Spring Security 4.1 の新機能
PDF
10大ニュースで振り返るPGCon2015
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
Apache Big Data Miami 2017 - Hadoop Source Code Reading #23 #hadoopreading
僕とヤフーと時々Teradata #prestodb
決済金融から始めるデータドリブンカンパニー #yjmu
Spring Security 5.0 解剖速報
Keynote
Yahoo! JAPANのサービス開発を10倍早くした社内PaaS構築の今とこれから
Ladder of cqrs+es
Design pattern in presto source code
コンテナ時代にインフラエンジニアは何をするのか
Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜
Storm の新機能について @HSCR #hadoopreading
Dataworks Summit 2017 SanJose StreamProcessing - Hadoop Source Code Reading #...
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
TypeScript製フレームワーク「Nest」のご紹介
Spring Security 4.1 の新機能
10大ニュースで振り返るPGCon2015
Ad

Similar to Spring I/O 2017 報告 ThymeleafのWebFlux対応 (20)

PDF
Dockerコミュニティ近況
PDF
Talk 1「データインテグレーションとは何か」
PDF
PostgreSQL 9.6 新機能紹介
PDF
新しいTERASOLUNA Batch Frameworkとは
PDF
Cloudera Impalaをサービスに組み込むときに苦労した話
PPTX
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
PDF
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...
PPTX
そろそろSELinux を有効にしてみませんか?
PDF
Classmethod共催IT部門向け Tableauを活用した全社レベルのデータ民主化とガバナンス
PDF
OpenStack Swift紹介
PPTX
stapy_028_talk1
PDF
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
PDF
Yahoo! JAPANのOracle構成-2017年版
PPTX
Yahoo! JAPANのOracle構成-2017年版
PDF
PostgreSQLによるデータ分析ことはじめ
PPTX
Spring tools4
PPTX
OpenStack Congress Deep Dive
PDF
[de:code 2017] 並列分散処理の考え方とオープンソース分散処理系の動向
PDF
[DI06] 並列分散処理の考え方とオープンソース分散処理系の動向
PDF
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ by トレジャーデータ株式会社 斉藤太郎
Dockerコミュニティ近況
Talk 1「データインテグレーションとは何か」
PostgreSQL 9.6 新機能紹介
新しいTERASOLUNA Batch Frameworkとは
Cloudera Impalaをサービスに組み込むときに苦労した話
ML Ops NYC 19 & Strata Data Conference 2019 NewYork 注目セッションまとめ
[db tech showcase Tokyo 2016] B31: Spark Summit 2016@SFに参加してきたので最新事例などを紹介しつつデ...
そろそろSELinux を有効にしてみませんか?
Classmethod共催IT部門向け Tableauを活用した全社レベルのデータ民主化とガバナンス
OpenStack Swift紹介
stapy_028_talk1
Prestoで実現するインタラクティブクエリ - dbtech showcase 2014 Tokyo
Yahoo! JAPANのOracle構成-2017年版
Yahoo! JAPANのOracle構成-2017年版
PostgreSQLによるデータ分析ことはじめ
Spring tools4
OpenStack Congress Deep Dive
[de:code 2017] 並列分散処理の考え方とオープンソース分散処理系の動向
[DI06] 並列分散処理の考え方とオープンソース分散処理系の動向
[db tech showcase Tokyo 2014] D33: Prestoで実現するインタラクティブクエリ by トレジャーデータ株式会社 斉藤太郎
Ad

Spring I/O 2017 報告 ThymeleafのWebFlux対応

  • 1. Copyright©2017 NTT corp. All Rights Reserved. Spring I/O 2017 報告会 ThymeleafのWebFlux対応 2017年6⽉29⽇ NTT ソフトウェアイノベーションセンタ 岩塚 卓弥
  • 2. 2Copyright©2017 NTT corp. All Rights Reserved. • 名前:岩塚 卓弥 • 所属:NTT ソフトウェアイノベーションセンタ • NTTの研究所のうちソフトウェアを専⾨に扱う • ⾃部署ではソフトウェア⼯学を研究 • Springベースのグループ共通フレームワークの整備を担当 • Spring I/Oには2015年から3年連続参加 ⾃⼰紹介
  • 3. 3Copyright©2017 NTT corp. All Rights Reserved. • Getting Thymeleaf Ready for Spring 5 and Reactive • Daniel Fernández – Thymeleaf lead • スライド • https://speakerdeck.com/dfernandez/o-2017-getting- thymeleaf-ready-for-spring-5-and-reactive • デモ • https://github.com/danielfernandez/reactive-matchday 今⽇の元ネタ(⼀次資料)
  • 4. 4Copyright©2017 NTT corp. All Rights Reserved. • Thymeleaf 3を使⽤している • Thymeleaf 2を使⽤している • JSPを使⽤している • その他のテンプレートエンジンを使っている 会場アンケート:Thymeleaf 使ってますか
  • 5. 5Copyright©2017 NTT corp. All Rights Reserved. 世界での利⽤状況 Spring Initializrで選択される テンプレートエンジンのうち 75%程度がThymeleaf Thymeleaf Freemarker Mustache Groovy Templates Velocity ⽉間DL数は22万以上 ⼀年で7万5千以上の伸び Spring I/O 2017 Keynoteより
  • 6. 6Copyright©2017 NTT corp. All Rights Reserved. Spring MVC × Thymeleaf 3 の基本形 greeting.html 実装 出⼒
  • 7. 7Copyright©2017 NTT corp. All Rights Reserved. Spring MVC × Thymeleaf 3 処理概略 TemplateName Context Engine Model Template +α HTML Controllerで設定したModel (Map<String, Object>)
  • 8. 8Copyright©2017 NTT corp. All Rights Reserved. Spring MVC × Thymeleaf 3 処理概略 TemplateName Context Engine Model Template +α HTML Controllerから渡された View名を解決したもの ServletContextや パス変数等を追加
  • 9. 9Copyright©2017 NTT corp. All Rights Reserved. Spring MVC × Thymeleaf 3 処理概略 TemplateName Context Engine Model Template +α HTMLTemplateを取得 TemplateとContextから HTMLを⽣成
  • 10. 10Copyright©2017 NTT corp. All Rights Reserved. Spring MVC × Thymeleaf 3 処理概略 TemplateName Context Engine Model Template +α HTML HttpServletResponseに 書き込み
  • 11. 11Copyright©2017 NTT corp. All Rights Reserved. Reactive化? TemplateName Context Engine Model Template +α HTML Blocking! Blocking!
  • 12. 12Copyright©2017 NTT corp. All Rights Reserved. Reactive化? TemplateName Context Engine Model Template +α HTML Blocking! Reactive! 出⼒をPublisherに
  • 13. 13Copyright©2017 NTT corp. All Rights Reserved. • FULL • CHUNKED • DATA-DRIVEN Reactiveな3つの処理モード
  • 14. 14Copyright©2017 NTT corp. All Rights Reserved. FULLモード HTML Mono<DataBuffer>Engine ServerHttpResponseに書き込み HTMLを⼀括⽣成して⼀括出⼒ → 最もシンプルだがメモリ消費は⼤
  • 15. 15Copyright©2017 NTT corp. All Rights Reserved. • FULL • CHUNKED • DATA-DRIVEN Reactiveな3つの処理モード
  • 16. 16Copyright©2017 NTT corp. All Rights Reserved. CHUNKEDモード <!DOCTYPE html> … Flux<DataBuffer>Engine ServerHttpResponseに書き込み ・・・ … </html> HTMLを⼀定のバイト数ごとに区切って⽣成 → backpressureによって速度調整可能に
  • 17. 17Copyright©2017 NTT corp. All Rights Reserved. • FULL • CHUNKED • DATA-DRIVEN Reactiveな3つの処理モード
  • 18. 18Copyright©2017 NTT corp. All Rights Reserved. FULL / CHUNKED に共通の課題 Model Mono Flux
  • 19. 19Copyright©2017 NTT corp. All Rights Reserved. FULL / CHUNKED に共通の課題 Context Engine Model Mono Flux ArrayList Mono Mono AbstractView#resolveAsyncAttributes CollectList
  • 20. 20Copyright©2017 NTT corp. All Rights Reserved. DATA-DRIVENモード Context Engine Model ReactiveDataDriverContextVariable wrapすることでresolutionを回避 … … … ThymeleafがProcessorのように振る舞う
  • 21. 21Copyright©2017 NTT corp. All Rights Reserved. DATA-DRIVEN & SSE DATA-DRIVENモードの場合はデータ1件ごとに 部分的なHTMLをSSEで送信可能 <table> <tr data-th-each=“name : ${names}”> <td>[[${name}]]</td> </tr> </table> + Alice Bob Carol event: head id: 0 data: <table> event: body id: 1 data: <tr> data: <td>Alice</td> data: <tr> event: tail id: 4 data: </table> ・・・
  • 22. 22Copyright©2017 NTT corp. All Rights Reserved. デモアプリ紹介 試合状況 コメント
  • 23. 23Copyright©2017 NTT corp. All Rights Reserved. 初期画⾯表⽰ Agent Controller ReavtiveMongoTemplate ReactiveMongoRepository match/{matchId} 初期画⾯ リクエスト以前のコメント 対戦チーム情報など
  • 24. 24Copyright©2017 NTT corp. All Rights Reserved. 初期画⾯表⽰の実装 - MatchController コメントのFluxを取得 コメントのFluxをReactiveDataDriverContextVariableで warpしてModelに追加 → DATA-DRIVENモード
  • 25. 25Copyright©2017 NTT corp. All Rights Reserved. デモアプリ紹介 動的に更新
  • 26. 26Copyright©2017 NTT corp. All Rights Reserved. 試合状況描画 Agent Controller ReavtiveMongoTemplate ReactiveMongoRepository match/{matchId}/statusStream 画⾯の⼀部 (SSEで送信) 試合状況 javascriptで画⾯に反映
  • 27. 27Copyright©2017 NTT corp. All Rights Reserved. 試合状況描画 Agent Controller ReavtiveMongoTemplate ReactiveMongoRepository 画⾯の⼀部を⽣成 (SSEで送信) 新しい試合状況を取得 javascriptで画⾯に反映 得点や警告などの イベントをランダム⽣成 新しいイベントを挿⼊
  • 28. 28Copyright©2017 NTT corp. All Rights Reserved. 試合状況描画の実装 - MatchEventInfoRepository MongoDBのTailable Cursorを使⽤して 新しくinsertされたデータを取得し続ける
  • 29. 29Copyright©2017 NTT corp. All Rights Reserved. 試合状況描画の実装 - MatchController SSEで送信 Thymeleafで画⾯の⼀部を⽣成 DATA-DRIVEN モード
  • 30. 30Copyright©2017 NTT corp. All Rights Reserved. 試合状況描画の実装 – match.html (js) SSEで送信されてきた画⾯の⼀部を使って 画⾯を部分的に書き換える 部分⽣成対象
  • 31. 31Copyright©2017 NTT corp. All Rights Reserved. デモアプリ紹介 動的に追加
  • 32. 32Copyright©2017 NTT corp. All Rights Reserved. コメント描画 Agent Controller ReavtiveMongoTemplate ReactiveMongoRepository match/{matchId}/commentStream? timestamp=xxxxxxxx(初期リクエスト時刻) json (SSEで送信) 指定timestampより 後のコメント javascriptで画⾯に反映
  • 33. 33Copyright©2017 NTT corp. All Rights Reserved. コメント描画 Agent Controller ReavtiveMongoTemplate ReactiveMongoRepository json (SSEで送信) javascriptで画⾯に反映 コメントをランダム⽣成 新しいコメントを取得 新しいコメントを挿⼊
  • 34. 34Copyright©2017 NTT corp. All Rights Reserved. 試合状況描画の実装 - MatchCommentRepository MongoDBのTailable Cursorを使⽤して 新しくinsertされたデータを取得し続ける
  • 35. 35Copyright©2017 NTT corp. All Rights Reserved. コメント描画の実装 - MatchController jsonをSSEで送信
  • 36. 36Copyright©2017 NTT corp. All Rights Reserved. 試合状況描画の実装 – match.html (js) SSEで送信されてきたjsonデータを使って 画⾯を部分的に書き換える
  • 37. 37Copyright©2017 NTT corp. All Rights Reserved. • Thymeleaf 3 × WebFluxでReactiveなView出⼒ • 3つの処理モード • FULL • CHUNKED • DATA-DRIVEN • ⾒所満載のデモ まとめ 是⾮⼀次資料(スライド / ソースコード)に アクセスしてみて下さい!