Kotlin 入門

f:id:nemuzuka:20190501150617p:plain

色気づいてサーバサイド Kotlin に興味を持ち始めたので勉強してみました。

今回のコード

構成

  • SpringBoot: 2.1.4.RELEASE
  • Kotlin: 1.3.30
  • あと使用してるのはこの辺見てください

内容

JSON 返す API サーバとして作ってます。

Repositry

とりあえず SQL 実行できればいいと思ったので、使いづらいと思いながらも JdbcTemplate を使いました。

コンストラクタで JdbcTemplate をインジェクションする感じです。
ここのテストは H2 にアクセスして実際に SQL を発行します(application-unittest.properties を見てる)。テストすべきは SQL ですからね。
FlywayTest でテスト用の Fixture を入れてます。
JdbcTemplate でないとすると、選択肢としては Spring JPA なんでしょうか。ScalikeJDBC みたいなの無いかしら。

Service (依存 class を Injection するケース)

Repositry のように依存する奴は Mockito で Mock 化します。 昔は Mock のメンテコストが割と高かった気がするので使わないようにしてたのですが1、最近は簡単に使えますね。
Kotlin で Mockito 使うなら Mockito-Kotlin 使うべきですかね。 Mockito-Kotlin との出会いのきっかけ

Controller

依存する奴は Mockito で Mock 化するパターンで。
正常パターンは大丈夫っぽいですが、パラメータの validation とかは Server 立ち上げないとできないのが、アレだなと思いました(Kotlin 関係ない)。

Controller のパラメータとか

この辺が Kotlin でよかったと思えるところでしょうか。
data class にのアノテーションでちょっとハマりました(field: の辺り)。
JSON にしても@JsonProperty 効かなくて焦りました。 field: との出会いのきっかけ

body パラメータの validation がアノテーションで定義できるのは嬉しいですけど、Controller 呼び出し時のエラーハンドリングが面倒なのは皆さまいかがお過ごしでしょうか(Kotlin 関係ない)。

Integration

server 立ち上げて実際に API 呼び出すパターンです。
H2 にアクセスして SQL 発行します(application-integrationtest.properties)。

レスポンスの JSON の verify に JsonAssert 使ってるのですが、最近の人は何を使っているのでしょうか。org.hamcrest.Matchers 使うのがアレな気分です。

感想

  • Kotlin について
    • Java + lombok より書きやすい気がします
    • 名前付き引数 + data class の copy 最高
    • @Slf4j は欲しいなぁ...
    • 明示的に open にしないと継承できないとか固くかけるのが良い
    • null 安全の為に Java のライブラリ使うとき面倒だな、と思うこと多し。!! 使いすぎないようにしないと
  • 結構 GitHub に Spring + Kotlin のサンプル上がってますね。Kotlin 好きが多いなw
  • Kotlin 自体はとっつきやすいです。ただ、Spring と Scala が仲良しならなぁ...という思いが隠せません
  • ktlint 入れて CI 回したり、Docker image がビルドできなくてハマった時間の方が長かったです
  • エルビス演算子 ?:命名センスに惚れた。でも他の言語でも使ってた

読んだ本

Kotlinイン・アクション

Kotlinイン・アクション

Kotlin Webアプリケーション 新しいサーバサイドプログラミング

Kotlin Webアプリケーション 新しいサーバサイドプログラミング


  1. EasyMockとかね…