SpringFest2018の「実際のプロジェクトで Spring アプリを Kotlin で 開発して得た気づき集」聴講メモ

プレゼンター

長澤 太郎 Ubie株式会社

AI医療スタートアップ Ubie株式会社のプログラマー。日本Kotlinユーザグループ代表、日本Javaユーザグループ幹事を務める。著書に「Kotlinスタートブック」など、共同訳書に「Kotlinイン・アクション」がある。ビールとラーメンとディズニーが大好き。

概略

スピーカーが勤めるUbieでは、既存のRuby on RailsアプリをSpring Frameworkアプリへリプレースするプロジェクトが進行中です。使用言語はKotlinというJVM言語のひとつで、JetBrainsによって開発されている静的型付けオブジェクト指向言語です。 SpringはかねてよりKotlinをサポートしていましたが、Spring Framework 5.0でよりKotlinフレンドリなAPIを提供し始めました。本セッションでは、SpringアプリをKotlinで開発する基本的な話と、実際の開発を経験して得られた知見をTips集のような形で共有します。 KotlinあるいはSpringの入門的な話はしません。Kotlinを用いたSpringアプリ開発に興味がある方、始めて間もない方を対象としています。本セッションを聴いていただき、Kotlinへの関心を高め、Kotlin x Springにありがちな落とし穴を回避する策を学んでいただければ幸いです。 #sf_22 

聴講メモ

kotlinとspringは相思相愛

kotlinはデフォルトでfinalクラス

  • しかし、@Serviceなどは自動でサブクラスを使う
  • そのため、継承を許可するために、open修飾子を利用する必要がある ( 面倒だしダサい )

バリデーションに注意

  • プロパティに@NotNullや@NotBlankは利用できない
    • プロパティは、フィールドとアクセサーの合体なので
  • @field:@NotNullなどのように指定する必要がある
  • optionalと矛盾しないように

WebFlux

  • Reactorだけでなく、Coroutineを併用することで直感的な記述が可能になる ( 写真挿入 )

アノテーションという黒魔術をやめる

アノテーションがKotlin DSL

  • @Beanも不要
    • beansという関数を利用することで、beanの登録を行う
  • @RestControllerも不要
    • コントローラをbeanに登録し、ref関数でbeanを取得しインジェクト

テスト

  • JUnit5
    • @Nestedを利用することで、メソッドをグルーピング
    • assertThrowsに型を指定可能 ( kotlinらしい )
  • AssertJ
    • 変数?.プロパティでプロパティを取り出すとき
    • Kotlin1.3のContractsで、文脈によりnullでないことを示すことができる
    • Dataクラスを利用して比較することで、エラーメッセージが見やすくなる
  • MockK
    • kotlin用のモックライブラリ
    • coEveryにより処理を呼び出しやすい
    • @BeforeEachの中で、clearMockesメソッドを呼び出しモックをクリア
  • WebTestClientのexpectBodyメソッドはヌルポが発生するバグあり
    • 拡張関数のexpectBodyを利用することで解決
    • IntellijIDEAでサジェストされなかったけど、修正済み

ubieのkotlinガイドラインあり

  • ubie-inc/kotlin-coding-style

  • ktlintに従う

  • kotlinは表現力が高いので、シンプルであるように気をつける
  • テストコードはよりひと目見てわかるように
  • 型を明記
  • !!を利用しない
    • requireNotNull関数を利用
  • lateinitは使用しない
    • nullを許容する抜け道なので

まとめ

  • kotlinでも普通にspring利用可
  • javaとの違いを意識する必要がある
    • final / open の違いは意識しなくてもいい
    • バリデーション用のアノテーションは注意
  • coroutineとreactorの相性がよい
  • データクラス同士の比較はレポートが見やすいから推奨
  • モックライブラリはMockKがよさそう
  • 結論
    • サーバーサイドKotlin良い

質疑応答

アノテーションを避けることのメリットは?

DSLでのBean定義ですが、数が増えると大変では?

  • コードとして扱えるので、工夫可能

Mokiitだとデフォルトファイナルクラスは困る?

  • MockKだと、どういう仕組かわからないけど大丈夫