JSUG勉強会 2020 その1 Spring x Kotlin に行ってきました。簡単に所感をまとめます。
所感
いくつか 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 修飾子が必要)
- バリデーション
- Kotlin のプロパティは Java のフィールドとアクセサを組み合わせたようなもの
- @NotNull などがフィールドにかからない
- @field 指定 + Nullable 指定
- Kotlin にはプリミティブ型はない
- バイトコード上は int になる
- Int? にするとラッパークラスになる (Nullable)
- フィールドインジェクションしたい場合は lateinit + var を使う
- Kotlin 向け 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
- Boot 2.2.1 からは scan の指定が必要
- 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