KotlinのWebフレームワークKtor(Server)のプロジェクト構成を調べてみた

# ktorとは

Kotlin製のWebフレームワーク。 
[公式ドキュメント](https://ktor.io/)
[日本語版ドキュメント](https://jp.ktor.work/)

薄いフレームワークで、依存するライブラリをなるべく自分で選べるようにする思想が特徴。
server機能の他に、client機能（他のserverに接続するための）もありますが、ここではserver機能のみについて記載します。
DSLっぽい書き方で読みやすいので書いていて楽しいです。（[公式サイトのsample](https://ktor.io/samples/app/httpbin.html)）

# version

1.1.3

# プロジェクト構成

大雑把には以下のような感じでディレクトリが切られており、gradleのサブプロジェクトになる等している。

* ktor-client
  * ktor-client-android
  * ktor-client-apache
  * ktor-client-cio
  * ktor-client-core
  * ktor-client-curl
  * ktor-client-features
  * ktor-client-ios
  * ktor-client-jetty
  * ktor-client-js
  * ktor-client-mock
  * ktor-client-okhttp
  * ktor-client-tests
* ktor-server
  * ktor-server-benchmarks
  * ktor-server-cio
  * ktor-server-core
  * ktor-server-host-common
  * ktor-server-jetty
  * ktor-server-netty
  * ktor-server-servlet
  * ktor-server-test-host
  * ktor-server-tests
  * ktor-server-tomcat
* ktor-features
  * ktor-auth
  * ktor-auth-jwt
  * ktor-auth-ldap
  * ktor-freemarker
  * ktor-gson
  * ktor-html-builder
  * ktor-jackson
  * ktor-locations
  * ktor-metrics
  * ktor-mustache
  * ktor-server-sessions
  * ktor-velocity
  * ktor-webjars
  * ktor-websockets
* ktor-http
  * common
  * jvm
  * ktor-http-cio
  * ktor-http-js
  * ktor-http-jvm
* ktor-network
  * jvm
  * ktor-network-tls
* ktor-utils
  * common
  * js
  * jvm
  * posix

※ 注：jsと書かれたものがなぜあるのかというと、Kotlin/JSというものがあるからです。Kotlinでサーバからフロントまで書けるようにしようという野心的な試みのようです。

# 役割

* ktor-client(io.ktor.client)
  * クライアント機能。
  * ktor-client-core内にHttpClientEngine, HttpClient, HttpRequest, HttpResponseといったクライアント機能に利用する基底クラスが存在する。
  * ktor-http, ktor-networkに依存

* ktor-server(io.ktor.*, io.ktor.server.*)
    * サーバ機能。
    * ktor-server-core(io.ktor.*)内にApplication, ApplicationRequest, ApplicationResponse, Route, Routing, Session等ktorサーバを使う上での必須機能が並んでいます。
        * またDefaultHeaders, HttpsRedirect, StatusPages等のFeature（Pipelineにinstallするプラグイン）もここに並んでいるため、自分でプラグインを作成する場合には実装が参考になりそうです。（ちなみに自分でFeatureを実装する方法は[公式にも記載されていました](https://ktor.io/advanced/features)）
        * ktor-utils, ktor-httpに依存します。
    * ktor-server-host-common(io.ktor.server.engine)内にはApplicationEngine, BaseApplicationCallがあります。
        * ktor-server-coreに依存します。
    * ktor-server-netty, ktor-server-jetty, ktor-server-servletなどは各アプリケーションサーバの実装でktor-server-host-commonにある要素を継承して作られています。アプリケーションサーバ起動、停止の具象実装もこの中にあります。
        * ktor-server-host-commonに依存します。


* ktor-features(io.ktor.* (Featureによってパッケージが異なる))
  * 認証、Jsonシリアライズデシリアライズ、テンプレートエンジン等、Featureそのものやktor-server-core内に入れたくないFeature（例：テンプレートエンジンのFreemarker）であったり、Featureの拡張関数的なものをここに入れているのだと推測
  * ものによりますが、他のどのgradleプロジェクトにも依存しないものが多い。

* ktor-http(io.ktor.http)
  * URLFileContent, HttpDate等HTTP通信関連のクラスが格納されている
  * ファイル数も少なく、イマイチ明確な位置づけがわかっていません
  * 特に他のgradleプロジェクトには依存していない

* ktor-network(io.ktor.network)
  * 通信に関わるクラス群。Datagram, Sockets等のクラスがある。普通にWebアプリを作る上ではこのレイヤは意識することはないんじゃないかと思っています。
  * ktor-utilsに依存

* ktor-utils(io.ktor.util)
  * 全体で共通利用されるクラス群。Date, Encoder, Text, StringValuesといった汎用的なものが並んでいる
  * 特に他のgradleプロジェクトには依存していない
  * （良い設計なのかはわからないですが）Pipelineクラスも混ざっていて意外でした（serverからもclientからも共通利用されるからここにおいているんじゃないかと思っています）

# 最後に

全体像が見えて来てるとなんとなく理解した気分になれるのでいいですね（実際は全然理解できてないですがｗ）。
次は気が向けばクラス構成についても調べてみたいと思います。