「SpringFest2017」に参加してきました

What's New in Spring

  • Dave Syer(Pivotal)

Spring系のバージョン

  • SpringFramework5出たけど4もまだサポート
    • 4に依存するものがまだたくさんあるから

3rd partyライブラリ

  • Reactorの最新版がSpringFramework5で使われてる

SpringFramework5

  • jdk8以降のみ
  • servlet3.1
  • jms2.0
  • jpa2.1
  • functional bean configulation
  • Reactive
  • junit5
  • jdk9
  • http2
  • kotlin

Reactive

  • blocking -> non-bocking
  • Monoをreturnするようになる
  • MonoはPromise的な感じかな?
  • spring-boot-starter-web -> spring-boot-starter-webflux
    • デフォルトnettyになる
  • Mono.just("Hello"):

WebClient

  • RestTemplateの代替?
  • RestTemplateは6で消えるかもね
  • mockMvc -> WebTestClient

SpringBoot

  • 2.0は2018/2くらい
    • 他に引っ張られて遅くなってる
  • SpringCloudはその後

Introduction to Spring WebFlux

Reactive

  • blocking -> non-bocking
  • reactive streams
    • reactor
  • servlet stackではrequestの分だけスレッド
  • reactive stackなら少ないスレッドを有効活用できる
  • event-loop
  • node的な
  • blockingはメモリ食う
  • 遅めのネットワークから使われる時有効

ReactiveStreams

  • publisherとsubscriber
  • listで返ってきたようなものをstreamで返す(backpressure)
  • ReactiveStreamsの実装
    • RxJava
    • Reactor(Pivotal製)
    • Akka

使い方

  • Flux
    • 無限かもしれないもの
    • 0 ~ n
  • Mono
    • 0 or 1
  • subscribeで発火
  • 固定のデータ(just)だけじゃなくて沸き出てくるデータにも対応できる(HotStream)

SpringWebFlux

  • SpringMVC or SpringWebFluxとなる
  • SpringMVCはblocking/Synchronous
  • SpringWebFluxはNon-blocking/Synchronous
    • MVCそのまま同じコード使った場合
  • SpringWebFluxでさらにMono/Fluxを使うNon-blocking/Asynchronous
    • Mono/Fluxをreturnする
  • SpringWebMVCでMono/Fluxを使うblocking/Asynchronous
    • Mono/Fluxをreturnする
  • response
    • backpressureが効くのは上2つだけ
    • accept:text/event-stream
    • accept:application/stream+json
      • {a: "a"}的なのがひたすら流れる
    • accept:application/json
      • 普通のJSON
      • backpressureきかない
  • logメソッドでコンソールに出る
  • httpリクエスト終わる前にレスポンス返せる
    • transfer-encoding:chunced
    • これはMVCじゃできない
  • share()つけるとbloadcastできる

WebClient

  • RestTemplateの代替
  • MonoとかFlux使える

SpringData

  • ReactiveCrudRepository
    • findByIdとかがMono/Flux対応版

JDBC

  • RDB使ってるとblocking
    • WebFluxと共存できない
    • 次のjavaで対応?

SpringSecurity

  • Reactiveだと別もの

thymeleaf

  • full mode
    • 全部データ揃ってから描画
  • chunced mode
    • ちょっとずつもらって表示
  • data-driven mode
    • データ揃う前からできたとこから描画

どう使っていくか

  • front:WebFlux, back:MVC, WebClientでつなぐ
    • RDB使う場合
  • front:MVC, back:MVC, WebClientでつなぐ
    • まずはこれが現実的

Spring Security 5 解剖速報

SpringSecurity5

  • WebFlux対応
  • OAuth2.0対応

WebFlux

  • Reactive対応
  • ServletAPIに依存しない
  • SpringSecurity4では
    • ServletFilterに依存
    • WebFluxでは使えない
  • WebFilterというのが新しくできた
  • だいたい従来と同じ
  • Reactiveとかserverとか接頭辞がついた
  • クラスの役割分担がちょっと変わった
  • 従来のMVCを使ったものも継続的に使える
  • WebTestClient
    • 5から
  • WebMockUser
    • 4から

OAuth2.0

  • 今まではOAuthの機能がいろんなプロダクトに散らばってた(Bootとか)
  • それをSpringSecurityで一括管理

ドメイン駆動設計のためのSpringの上手な使い方

ドメイン駆動設計とは

  • システム構築手法の1つ
  • 勝ちを加え続けるソフトウェアに適してる

ドメイン駆動設計の基本

  • 開発者がドメインを学ぶ
  • モデルと実装を一致させる
  • 深いモデルを探求する
  • 巨大な複雑さ

開発者がドメインを学ぶ

モデルと実装を一致させる

  • モデルと実装を関連付けると実装が整理され見通しが良くなる
  • 実装からフィードバックすることでモデルが実用的になる
  • オブジェクト指向によるモジュール化
  • 型による知識の表現

深いモデルを探求する

  • 暗黙になりがちな知識を明示的に表現する

巨大な複雑さ

  • 地道な積み重ね
  • 複雑になってもモデルとコードを一致させることが重要
  • 俯瞰、蒸留、大きな構造化

Springのプログラミングモデル

  • Spring自体DDDの影響を受けている
    • @Repositoryとか@Serviceとか

ドメイン駆動設計のためのSpring

SpringBoot

  • 動くものをベースに考える
  • 学んだことをコードで記録する
  • コードでモデルを表現する
  • 最初からE2Eで実験する

SpringIntegration

  • 複数アプリの連携
  • コンテキストマップ
  • モデルとモデルの連携パターン
  • メッセージングモデル
  • データ通信技術ととらえるか、業務モデルとしてとらえているかで設計が全然違ってくる

SpringBatch

  • job - step
  • 大量データ処理の技術としてみてるか、業務モデルとして見ているか

SpringSecurity

  • role/権限の構造

Pivotal認定講師が教える!Spring Data JPAによるデータアクセス徹底入門

JPA, SpringDataJPA

SpringData

  • データアクセスを共通化してくれる

JPA

  • JavaEEで標準化されたデータアクセス技術
  • 仕様
  • 決まってるのはインターフェース、アノテーション
  • JPAの実装
  • DB製品に依存しない
  • テーブルとエンティティを1対1で作る
    • MyBatisとかはそうじゃないんだ・・・
  • SQLのログ出力
  • 改行とかインデントを挟む設定もある

JPAアーキテクチャ

  • Entity
  • EntityManager
  • EntityManagerFactory
    • シングルトン
  • 永続化コンテキスト
  • エンティティの状態
    • NEW
    • MANAGED
      • 永続化コンテキスト内
    • DETACHED
      • 永続化コンテキスト外
    • REMOVED

JPQL

  • select/update/deleteを記述する
  • insertはない
  • persistを使う(put的な動き)

リレーションとN+1対策

  • @OneToManyとか
  • fetch
    • リレーション先のエンティティをいつ呼ぶか
    • EAGERフェッチ
    • LAZYフェッチ
      • 必要な時
      • select2回呼ぶだけ
      • 永続化コンテキスト破棄後だと例外おきる
  • 基本LAZYで
    • join重い
    • いつでも必要とは限らないから
  • N+1問題
    • joinしても子テーブルの情報はとってこないから意味ない
    • JOIN FETCH + DISTINCTを使うと全部とれる
      • Listの重複が削除される

SpringDataJPA

  • Repositoryインターフェース作るだけで使えちゃう
  • 共通の例外へ変換してくれる
  • SpringData2.0でメソッド名大幅に変わった
  • @QueryつけるとJPQLが書ける
  • 更新は@Modified
  • ロックは@Lock
  • @EntityGraph("グラフ名")
  • spring data query creationとかで検索
  • DBが違っても例外は共通したものへ変換してくれる
  • @CreatedBy,@CreatedDate,@LastModifiedBy,@LastModifiedDate
    • AuditorAwareをimplementsしたもの
    • @EnableJpaAudio~~~
  • LocalDate
    • AttributeConverterがある
    • boot2からはデフォルト

SpringBoot利用時の注意点

  • LazyフェッチView上までできる
  • スネークキャメル変換勝手にしてくれる
  • @EntityScan

JPAは「使える」のか

  • 正しい知識とシチュエーション
  • DBを新規に設計できること
    • 既存のDBへの適用は不向き
  • 複雑なSQLが要件的に少ない
  • パーフェクトJavaEEJPAの章を読むこと!

Spring と TDD

Spring BootとSpring Cloudで始めるマイクロサービス

  • 谷本心(AcroquestTechnology株式会社/日本Javaユーザーグループ)

MicroService

MicroServiceとは?

エンタープライズ開発で利用するSpring Bootとか

Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり

日本一やさしく説明する予定のマイクロサービス入門

2017年のLINEのマイクロサービスを支えるSpring

実践JHipster

ついに来たリアルタイムSpark~ビッグデータ処理の新常識・SnappyDataの実力~

AssertJ

Quick start Spring Boot on OpenShift

SpringでOAuth 2.0・OpenID Connect 1.0を使う