SpringOne 2020 Day 1 視聴ログ
SpringOne 2020 のセッション動画が公開されたのを視聴して面白かったポイントをメモ。こちらは Day 1。Day 2 はこちら。
タイトルの 👍 の数は面白かった度合いです。
- Introducing Spring Framework 5.3 👍👍👍
- Game of Streams 🐉: How to Tame and Get the Most from Your Messaging Platforms 👍
- If Hemingway Wrote JavaDocs 👍
- Functions: Implement Once, Execut Anyware ! 👍👍
- Making Spring Home (customization & extensibility) 👍👍
- A Deep Dive into Spring Application Events 👍👍👍
- 雑感
Introducing Spring Framework 5.3 👍👍👍
Introducing Spring Framework 5.3 | SpringOne | September 2–3, 2020
www.slideshare.net
Spring Framework 5.x の歴史と 5.3 の新フィーチャー、そして未来の話。
- Spring Framework 5.3 は LTS リリース
- 2024 年くらいまでを想定してる
- Spring Boot 2.4 および 2.5 は 5.3 ベースになる
- JDK 8,11,15,17 をサポートする
- 5.x 系列は打ち止め
- 5.4 は出ない
- 次のメジャーバージョン 6.x でやりたいこと
- JavaEE から JakartaEE への移行
- GraalVM の継続的なサポート
- Java 14 で導入された record 型が活用されそう
Game of Streams 🐉: How to Tame and Get the Most from Your Messaging Platforms 👍
www.slideshare.net
メッセージングによるシステム連携を Spring Cloud Stream で簡単に実現してみようという話
- Spring Boot: Up and Running という本を O’Reilly から出版するみたい (予定では 2021-02 になってる)
- 「XXX: Up and Runnig」ていう本は日本の「YYY 実践入門」に相当する感じ
- Auto Configuration とプロパティの定義だけで RabbitMQ や Kafka を利用したメッセージングが簡単に実現できる様子を実演してた
- プロパティの命名規則に従ってキューやチャンネルを作るのはお勧めできないような気もする
- デモンストレーションにはいいんだけど
If Hemingway Wrote JavaDocs 👍
If Hemingway Wrote JavaDocs | SpringOne | September 2–3, 2020
www.slideshare.net
Spring Project のテクニカルライターの人がどんなことに気をつけてるか紹介してた。JavaDoc の話はない。
- 読者には初心者、中堅、エキスパートがいる
- 釣鐘上の分布をしている
- 壁を乗り越えて中堅からエキスパートに至る初心者はごくわずか
- 探し物をしに来ているのであって文章を読みに来ているのではない
- 冗長な表現をやめて、できるだけ簡潔に表現すること(ヘミングウェイとかの文豪からこの辺の格言を引用してた)
- 不必要な言葉を消す
- 現在を表す時制にする
- Before: “In this tutorial, we will define a Web service that is created by a Human Resources department.”
- After: “In this tutorial, we define a Web service that is created by a Human Resources department.”
- 短い表現にする
- “utilize” => “use”
- “allows you to” => “lets you”
- 主語を置いて直接的な表現にする
- RFC とか重要な情報への外部リンクを設けるのは大事だけど “ここ” みたいに代名詞をリンク文字列にするのはよくない
- 文字通りすべての読者を対象に考慮すること
- ローカルな表現を入れない
- i.e とか e.g みたいな古いラテン語由来の省略記法は理解できない人が多いので避けること
- 自分が翻訳するときは軒並み文章に展開してるなぁ
- 短縮形やジョークを入れない、一貫した用語を使う
- 文学作品を目指すのではなく、ユーザーヘルプを目指す
Functions: Implement Once, Execut Anyware ! 👍👍
Functions: Implement Once, Execute Anywhere! | SpringOne | September 2–3, 2020
www.slideshare.net
Spring Cloud Function の紹介。
- Spring Cloud Function は Java 8 Functional Interface の上位版として使える雰囲気がある。特に関数合成とかカリー化とか
- Functional Interface を Spring Bean として登録、利用できる
- Spring Cloud Function は FunctionCatalog という SpringBean を提供してる
- 文字列リテラルで Fuction Bean にアクセスできる
- たとえば “uppercase” という Bean には
catalog.lookup(“uppercase”)
でアクセスできる - 関数合成もできる
funA.andThen(funB)
をcatalog.lookup(“funA | funB”)
で実現できる
- (真偽不明) Function Bean の引数は Spring の Converter で解決してる
spring-boot-starter-web
を追加するだけで Function Bean のための http エンドポイントを公開できる *たとえば
uppercaseという Function Bean を登録していたら、
http://localhost/uppercase/xxx` みたいにアクセスできる- なんかすげー
Making Spring Home (customization & extensibility) 👍👍
Make Spring Home (Spring Customization and Extensibility) | SpringOne | September 2–3, 2020
www.slideshare.net
GitHub - sasiperi/alexa-spring-boot
Spring Boot で Alexa Skill を 作る話。
- 毎回準備するのは大変なので spring-boot-starter にしたほうがい
- 開発者体験を向上するには spring-initilizr から利用できるようにしないといけない
- spring-initilizr を fork してカスタマイズしてた
- その場で作ってデモンストレーション
- Spring Security を利用して OAuth2 の認可コードフローを実装して、Alexa Skill 利用者がアカウントを紐づけする
- ローカルPC で実行したアプリを ngrok で公開し、Alexa からアクセスできるようにしてた
A Deep Dive into Spring Application Events 👍👍👍
A Deep Dive into Spring Application Events
www.slideshare.net
Spring Data の中の人が Appliation Event について紹介してる。DDD や Event Sourcing の知識があるとわかりやすいな。
基礎
- ApplicationEventListener のコールバック呼び出しは同期的に行われる
- @EventListener をメソッドの付けるだけでリスナーになれる
- イベントの種類はアノテーションで指定してもいいし、メソッド引数の型で指定してもいい
- @Async を付ければ非同期にもできる
- Spring の抽象 ApplicationEventPublisher をビジネスロジックに DI するのは嫌だよね
- Spring Data の抽象クラス Aggregate にはドメインイベントの考え方が実装されてる
- registerEvent すればアプリケーションイベントを発行できる
- Eventuate-Tram でも利用してた気がする
- Baeldung でも詳しく説明されてる
トランザクション制御
- EventListener はトランザクション範囲に含まれる
- 自分ではトランザクションを開始しない
- 途中で失敗したら後続のリスナーは呼び出さない
- TransactionalEentListener はそれ自体がトランザクション範囲になるイベントリスナー
- それぞれのリスナーは独立してイベントを受信する
- 実用例
- バッチ的なリトライロジックの実現
spring-domain-events-starter
という個人プロジェクトを利用してるみたい (もう削除されてた)- 別々のログを記録する @TransactionalEventListener を用意して、それぞれ成功したら捨てる。すると次回から空振りするようになる
- バッチ的なリトライロジックの実現
アーキテクチャ
- Inventory と Orders の関係性を考えてる
- completeOrder というメソッドにはいろいろな機能追加がありそうだし Inventory を操作するのは違うんじゃないかという疑問
- トランザクション範囲がどんどん広がってしまう
- テストを書くと違和感がはっきりする
- completeOrder というメソッドにはいろいろな機能追加がありそうだし Inventory を操作するのは違うんじゃないかという疑問
- @ModuleTest で疎結合性を検証する
- Moduliths の提供するアノテーション (Spring I/O 2019 Recap - Modulithsで紹介されてた)
- Inventory から直接 Orders にアクセスするのは OK
- Ordersから直接 Inventory にアクセスするのは NG
- Inventory が Order のイベントリスナーを実装する
- イベントで連携する場合はユニットテストじゃなくてインテグレーションテストで検証する
- ビジネスロジックはきれいに分離できたのでイベントストアを外部化するのは簡単だと思うよ (どうかなぁ🤔)
雑感
- プレゼンテーション資料に書いてない詳細をひたすら喋りまくる人ばかりで、再生速度を遅くして英語字幕(自動生成)も付けてようやく追いつける感じだった。
- 巻き舌なインド英語を正確に文字化する YouTube の自動字幕機能はすごい (たとえば purpose をパーパスじゃなくてパルパスと発音するんだよね…)