🚀

Ktor3へアップグレードした

に公開

こんにちは、株式会社スマートラウンドのtsukakei1012です!

私達が開発しているプロダクトsmartroundではKotlin製のWebフレームワークであるKtorをバージョン1.0.0-betaの頃から利用しており、3年ほど前にはバージョン2へアップグレードしました。

https://zenn.dev/smartround_dev/articles/2-ktor-2-upgrade

先日Ktorのバージョン3が出たため、再度メジャーバージョンのアップグレードをしました。

その感想やハマりどころについて雑に書いてみたいと思います!

Ktor3のアップデート内容

Ktor2からKtor3へのアップデートは、いくつかの主要な変更点と改善が含まれていますが、その中でも個人的に嬉しいのはServer-Sent Events (SSE) のサポートでしょうか。

弊プロダクト内でいくつかWebSocketを使った実装がありますが、そのうちのいくつかはSSEに置換できるのではないかと企んでいます。

https://blog.jetbrains.com/kotlin/2024/10/ktor-3-0/

どのくらい大変だった?

メジャーバージョンのアップグレードということもあり、まる1日ぐらいかかりました。
マイグレーションガイドが整備されていたので、ある程度まで作業はさくさく進みましたが、後述するようなハマりどころがガイドに記載されておらず、いくつかは直接Ktorのソースコードを参考にして修正する必要がありました😇

やったこととハマったとこ

パッケージ名変更

2系ではio.ktor.server.plugins.calllogingだったのを、3系ではio.ktor.server.plugins.callloggingになったので、それを直すだけでした。

https://ktor.io/docs/migrating-3.html#calllogging-plugin-package-has-been-renamed

WebSocketの設定方法の変更

WebSocketのconfigurationで2系ではjava.time.Durationを使っていたのが、3系ではkotlin.time.Durationになったので、それに合わせて修正しました。

https://ktor.io/docs/migrating-3.html#replacement-of-java-time-in-websockets-configuration

SessionのSerializer変更(ハマったとこ①)

超重要な変更にも関わらず、(いまだにマイグレーションガイドにも記載されていないのですが、)SessionのデフォルトのSerializerがしれっと変更されていました。

それに伴って、Sessionに使うデータクラスにも@Serializableをつける必要があります。

https://ktor.io/docs/server-sessions.html

また、デフォルトのSerializerが変更されたため、基本的には2系でシリアライズされたセッション情報はデシリアライズできないのですが、KotlinxBackwardCompatibleSessionSerializerを使うことでこの問題は回避できます。

PartData.FileItem.streamProvider()が例外を投げるようにサイレント仕様変更していた(ハマったとこ②)

以前からDeprecatedになっていたPartData.FileItem.streamProvider()でしたが、これが例外を投げるような実装になっており、検証フェーズで発見されました。

https://youtrack.jetbrains.com/issue/KTOR-7731

改修自体はすぐにできましたが、マイグレーションガイドにも当時は記載がなかったため、めちゃくちゃ焦りました。(今は無事にマイグレーションガイドに載っています!)

https://ktor.io/docs/migrating-3.html#partdata-fileitem-streamprovider-is-deprecated

ファイルアップロード機能で50MBを超えるファイルがアップロードできなくなった(ハマったとこ③)

(事の詳細については弊社エンジニアのsiosioさんが描いてくれたブログ記事を読んでいただきたいです!)

https://siosio.hatenablog.com/entry/2025/02/05/082046

ApplicationCall.receiveMultipart()によるアップロードでファイルサイズに50MBの最大値がデフォルト設定されていました。(これも当時はサイレント仕様変更😇)

こちらも検証フェーズで発見し、すぐ改修できたからよかったものの、めちゃくちゃ焦りました。(こちらも今は無事にマイグレーションガイドに載っています!)

https://ktor.io/docs/migrating-3.html#new-default-limit-for-binary-and-file-items

終わりに

当時は育休明けで、手元に大きな開発タスクがなかったこともあり、Ktorアップグレードを行いました。

しかし、その後のマイグレーションガイドの充実ぶりを見ると、少し間を空けたほうがよかったのかなと反省しています。

どのハマりポイントも検証フェーズまでには発見、かつすぐに各エンジニアが問題発見&解決方法を見つけ出してくれ、チームには大きく助けていただきました🙏

この記事が今後Ktor3にアップグレードする方の参考になれば幸いです!

最後に宣伝です!
KotlinのことでもAI開発のことでも何でもカジュアルに話せますので、ご興味ある方是非お待ちしてます!
https://jobs.smartround.com/

スマートラウンド テックブログ

Discussion