SpringOne 2020 Day 1 視聴ログ

SpringOne 2020 のセッション動画が公開されたのを視聴して面白かったポイントをメモ。こちらは Day 1。Day 2 はこちら

タイトルの 👍 の数は面白かった度合いです。



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 型が活用されそう
    • フィールドやセッターではなく、コンストラクタインジェクションを推奨してるのはたぶんこのため。(おそらく Lombok サポートは廃れていく)

Game of Streams 🐉: How to Tame and Get the Most from Your Messaging Platforms 👍

Game of Streams 🐉: How to Tame and Get the Most from Your Messaging Platforms | SpringOne | September 2–3, 2020

www.slideshare.net

GitHub - mkheck/game-of-streams-aircraft-edition: Game of Streams meta repo for imperative AND reactive source/processor/sink microservices

メッセージングによるシステム連携を 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: “The fact that Java is used to implement the web service is an implementation detail -- an important detail, but a detail nonetheless.”
      • After: “Using Java to implement the web service is an implementation detail.”
    • 現在を表す時制にする
      • 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”
    • 主語を置いて直接的な表現にする
      • Before: “Note that, in Spring-WS, writing the WSDL by hand is not required”
      • After: “Note that, in Spring-WS, you need not write the WSDL by hand.”
  • 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 で解決してる
    • Function<String, String> という Function Bean があるとする
      • fun.apply(1374) という呼び出しは Integer Converter が作用して Integer => Stringへ変換する
      • fun.apply(“{\”name\”:\”foo\”}”) という呼び出しは JSON Converter が作用して String => Map<String, Object> へ変換する
        • メディアタイプなどで判別している
        • 独自の Converter を作れば任意の Java Object へ変換できる
  • 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 にしたほうがい
    • AutoConfiguration を実装する方法を説明してた
    • Maven Repository に公開するときの注意点も
      • javadoc はついてるかーとか、source はついてるか―とか、署名は大丈夫かーとか
  • 開発者体験を向上するには 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 を操作するのは違うんじゃないかという疑問
      • トランザクション範囲がどんどん広がってしまう
      • テストを書くと違和感がはっきりする
  • @ModuleTest で疎結合性を検証する
  • イベントで連携する場合はユニットテストじゃなくてインテグレーションテストで検証する
  • ビジネスロジックはきれいに分離できたのでイベントストアを外部化するのは簡単だと思うよ (どうかなぁ🤔)

雑感

  • プレゼンテーション資料に書いてない詳細をひたすら喋りまくる人ばかりで、再生速度を遅くして英語字幕(自動生成)も付けてようやく追いつける感じだった。
  • 巻き舌なインド英語を正確に文字化する YouTube の自動字幕機能はすごい (たとえば purpose をパーパスじゃなくてパルパスと発音するんだよね…)