Ktor2へアップグレードしてみた
初めまして、株式会社スマートラウンドCTOの小山(@doyaaaaaken)です。
私達が開発しているプロダクトsmartroundではKotlin製のWebフレームワークであるKtorをバージョン1.0.0-beta
の頃から利用しています。
先月Ktorのバージョン2が出たため、メジャーバージョンのアップグレードをしました。
その感想やハマりどころについて雑に書いてみたいと思います。
Ktor2のアップデート内容
残念ながらユーザにとってあまり大きなアップデートはないです。強いていうならカスタムのPluginを作りやすくなったぐらいでしょうか。
バージョン2はKtor自体の内部構造(パッケージなど)を大幅にリファクタしたリリースという位置づけです。
アップデート内容については、今年2月にServer-Side Kotlin Meetupというイベントで発表した以下の資料でも紹介しています。
先取りKtor2.0
ちなみに資料にも書きましたが、(Ktor2とは間接的にしか関係ない話ですが)3rd-party(開発者自作)のPluginを公開する構想があるそうなので、個人的には楽しみです。
どのぐらい大変だった?
流石メジャーバージョンのアップグレードということもあり、まる2日ぐらいかかりました。
軽量なフレームワークなのでやり始めた段階では半日ぐらいで終わりそうだと思っていましたが、後述するようにPluginの挙動が一部変わった箇所もあったため、時間がかかってしまいました。
公式ドキュメント
Ktorの公式ドキュメント内に1.6->2.0へのマイグレーションガイドのページがあります。
ただし、ざっくりどんなアップデートがあったのかはわかるのですが、「具体的にどう修正すればいいのか」に関してはそこまで書いていないので、情報としてそこまでは充実していないなと感じました。
おすすめの進め方は、ドキュメントを参考としてざっと読んだ後、実際にバージョンをアップグレードしてみて、エラーが出たり気になったりしたPluginのドキュメントを読み込む進め方です。
パッケージ名変更
パッケージ名がほぼすべてというレベルで変わったので、Diffは大量に出ます。
smartroundでは単純なインポート文の修正が300ファイルぐらいに出ました。
手で修正だと厳しいので、IntelliJを使っている場合はKtorプラグインが便利なので使ってみましょう。
(なぜか公式ドキュメントには紹介されていませんでした。なぜ……???)
以下画像のように設定すると、Ktorのバージョンが最新バージョンでない場合には、最新版を使うようサジェストしてくれるというおせっかいなプラグインです。
サジェストに従ったら、インポート文の修正を自動でしてくれました。(一部うまくできていない部分はありましたが)
修正が大きかった部分
修正が大きかった部分についてピックアップしてみます。
Testing API
v1の頃とは全然別のAPIになっています。
大きく書き直すことは覚悟したほうがいいかと思います。
私の場合既存の実装のことは忘れ、Testingについてのドキュメントを読みながら新しく書き直しました。
なおメインのAPIであるtestApplication
メソッドは、テストの実行ごとにテスト用のKtorアプリケーションを起動する仕組みなので、Ktorアプリケーション起動時に一緒にDB接続をするような仕組みにしていると、DBへの接続過多でテストが落ちるので注意が必要です。
Ktor client
Ktor client自体、元々安定した機能じゃなかったこともあり、修正は多めでした。
ただし変数名が変わったという程度の修正が多かったため、migratingGuideを見ながら進めれば問題なく修正できました。
Status Pages Plugin
特にmigrationGuideには記載はなかったですが、Status Pages Pluginの挙動が微妙に変わっていました。
v1だとexception
ブロック内で、call.respond(ttpStatusCode.Unauthorized)
的なことをすれば、status
ブロックで処理が拾われる仕様でしたが、Ktorの内部実装を見るとexception
ブロックに引っかかった場合はstatus
ブロックの処理は呼び出されない仕様に変わっていました。
こういうサイレント仕様修正もあるかと思うので、充分にテストしたほうが良いかと思います。
おわりに
雰囲気は伝わりましたでしょうか。この記事が今後Ktor2にアップグレードする方の参考になれば幸いです!
最後に宣伝としてスマートラウンドの採用ページを貼っておきます。
Meetyで社内メンバーとのカジュアル面談も可能なので、ご興味ある方是非お待ちしてます!
Discussion