JSUG勉強会 2020 その1 Spring x Kotlin に行ってきた #jsug

JSUG勉強会 2020 その1 Spring x Kotlin に行ってきました。簡単に所感をまとめます。

jsug.doorkeeper.jp

所感

いくつか Kotlin 特有の事情はあるものの、Spring で普通に Kotlin が使えるようです。特に大きなメリットとしては Coroutine あたりだろうか。逆に言うとそれ以外は Java でも同じように書けるのかなって。となると、Java から移行するモチベーションってなんだろうか、というのが正直なところ。

ただ、Kotlin 自体、書いてて楽しそうな言語だし、新しくアプリを作るなら Spring x Kotlin は全然ありだなと思います。もちろん部分的な導入でもイケそう。

ここ数年、Spring 界隈は Kotlin 推しな雰囲気を感じるし、Kotlin が重要な位置付けにいるのは間違いないです。要チェック。

以下、メモから抜粋。

Kotlin で Spring 完全理解ガイド

  • Spring Initializr は Kotlin サポート済み
  • Gradle を使う場合は build.gradle.kts が生成される
    • Kotline スクリプトで書かれている
    • Gradle は Kotlin サポート済み
  • Kotlin のクラスはデフォルトで継承不可 (open 修飾子が必要)
    • @Service などのクラスは Spring によってサブクラスが生成される
    • allopen プラグイン
    • 任意のアノテーションが付いたクラスを open クラスとして扱う
  • バリデーション
    • Kotlin のプロパティは Java のフィールドとアクセサを組み合わせたようなもの
    • @NotNull などがフィールドにかからない
    • @field 指定 + Nullable 指定
  • Kotlin にはプリミティブ型はない
    • バイトコード上は int になる
    • Int? にするとラッパークラスになる (Nullable)
  • フィールドインジェクションしたい場合は lateinit + var を使う
  • Kotlin 向け DSL
    • Bean Definition DSL
    • Router DSL
  • ktlint
  • WebFlux + Coroutine
    • Reactor 対応の公式ライブラリがある
    • Coroutine で Mono/Flux を表現
  • Ktor
  • JUnit 5
    • @Nested した場合は inner 修飾子を付ける
    • inner を付けない場合は static クラスとして扱われる
  • AssertJ / assertk
  • モックライブラリは MockK がよさそう
    • モック生成は高コストなので使い回す (clearMocks 関数でリセット)
    • Coroutine は coEvery を使う
    • static メソッドのモック可
  • DBアクセスには JdbcTemplate を使っている
    • 他には Exposed など
  • Kotlin を使うことで特にビルド時間が遅くなることはない

Spring x Kotlin のいちばんのメリットは Coroutine なのかな #jsug Kotlin 触ったことないけど、それほど障壁はなく使えそう

Spring 5.2 における Kotlin サポート

www.slideshare.net

  • Spring の中でも Kotlin のサポートは増えている
  • Spring 5.2 から公式ドキュメントのコードスニペットに Kotlin 追加
  • Router Functions
    • WebFlux.fn / WebMvc.fn
  • Kotlin 向け DSL が提供されている
    • 引数: ServerRequest / 戻り値: ServerResponse
    • WebFlux では Mono の ServerResponse を返す
  • MockMvc DSL
  • @ConfigurationProperties
    • 複数プロパティへのバインディング
    • Relaxed Binding
    • Boot 2.1 までは lateint var で宣言する必要があった
  • 2.2.0 から @ConstructorBinding でコンストラクタを通して値を設定できる
    • Boot 2.2.1 からは scan の指定が必要
      • @ConfigurationPropertiesScan or @EnableAutoConfiguration
  • Coroutine
    • 軽量なスレッドのようなもの
    • 1スレッド上で複数の Coroutine が動く
    • async/await スタイルで記述可能
    • スコープによって Coroutine 同士の依存関係が管理しやすい
  • WebFlux の Coroutine サポート
    • 戻り値に Deferred / Flow が利用可能
    • Suspending Function
  • Coroutine Router Function DSL
  • Reactor ではなく Coroutine の型が利用できる
    • Kotlin の拡張関数によってサポートされている
  • Java と Kotlin は共存可能 (あまりおすすめしない)
    • テストコードだけ Kotlin とかはありかも
  • なるべく blocking なコードは呼ばない方がよい
    • スレッドに依存するコード/ライブラリを使うときは要注意

(参考) Kotlin Fest 2019 の登壇資料

www.slideshare.net