http4kをベースにサーバーサイド Kotlinの関連ライブラリをつかってみた
Google I/O 2017でKotlinがAndroidアプリ開発言語に選定された。Androidに限らずサーバーサイドでもメインの言語としてKotlinは選択できて、いくつかのサービス開発の経験を経てきた。これまでSpring BootをメインのFrameworkに置いて開発をしてきたけど、この機会にKotlinで開発されたライブラリをつかってみて実戦投入が検討できそうなライブラリを探っていきたい欲がでてきた。
モチベーション
先述したとおりSpring Bootを中心に置いた開発は快適でKotlinを言語選択しても生産性が落ちることはない。ただKotlin主体で開発されたHTTPサービスを提供するライブラリも多く存在している状況にあり、一度Spring Bootから離れてKotlin主体のFreameworkを試してみたい、というのが今回のエントリのモチベーション。 HTTPサービス周りのライブラリだけを試してみるのではなく、サーバーサイドアプリケーションの関心事にあるORMやDIなどもKotlin主体のライブラリを選択していきたい。
HTTPサービス
まずはHTTPサービス。
これには http4k
を選択。
コミット状況も最近の履歴が含まれているのが好印象。
ルーティングを設計してHTTPハンドラを実装していきながら、リクエストインタセプターも実装できるのでHTTPサービスにおいては最低限のものが揃っている。
HTTP ServerはJetty, Netty, Undertowから選択できる。
|
|
HTTPクライアントも提供されていて簡単に実装できる。
|
|
APIドキュメンテーションにはSwaggerをつかえる。
RouteModuleにSwaggerを有効にすれば /api/api-doc
のエンドポインにjson形式のApiドキュメンテーションがルーティングされるでSwagger-UIに読み込ませればよい。
|
|
http4k
をつかってtodo-listのバックエンドAPIを作ってみたのでエントリ最後にあるgithubから詳細なプログラムコードが参照できるので機会があれば参考にしてほしい。
データベース
次にデータベース。
これには requery
を選択。
Java/Kotlin/Androidの言語をサポートしたORM。
interface
またはdata class
でエンティティを作る。
@OneToMany
や@PostLoad
などのアノテーションが提供されていて、それぞれ1:多の関連づけや更新したときのコールバックを指定できる機能が用意されている。
|
|
SQLはDSLでタイプセーフに組み立てられる。
|
|
Data Transfer Object
ユーティリティ的なところであるがResult
というモデルをつかってみた。
データベース
のサンプルコードのところで出てきたが findOneById(id: Long)
のメソッドの返り値にResult<Task, TaskException>
をつかっている。
Resultを使えば処理結果にSuccess
とFailure
を含めて返すことができる。
|
|
Result
の戻り値を受け取った側は次のように処理できる。(.fold({ task -> TaskModel(task) }, { error -> throw handle(error) })
のところ)
|
|
データがない場合に null
またはlistOf()
を返すかexceptionをthrowする
か迷いがちな印象がある。
今回はレポジトリ層の全ての返り値の型にResult
を指定してみたところ開発効率が良かった。
Dependency injection
Spring Bootを使わない縛りを入れたのでDIもkotlin純製のものを選択。
DIにはKodein
をつかった。
|
|
ドキュメントに好印象。
ドキュメントは熟読できていないが必要最低限のDIはできた。
サンプルアプリケーション
これまで紹介したライブラリを用いてTodoリストのサンプルアプリケーションを開発してみたので合わせて参照していただきたい。
今回はこちらのエントリに触発されてDDDを意識して作ってみたが、まだまだ勉強しなくてはと感じた。
ScalaでウェブAPIを書いている人が設計や実装やその他について話そうか // Speaker Deck
まとめ
- Spring Bootを使わない縛りルールのなかでKotlinライブラリを揃えてアプリケーションを構築してみた。(できた)
- あらためてSpringの良さに気づいたのは正直なところ。HTTPリクエストのインバウンド・アウトバウンドの簡単さは偉大。(DIも偉大)
- HTTPルーティングに振り切っているサービスなどは
http4k
を使ってサクッと作るもあり。 - Springの偉大さに気づき、
requery
やResult
などの新しい発見もあったのでチームに持ち帰り導入を検討していきたい。