💾

GORMをv2にアップデートした話

2022/11/15に公開約2,600字

どうも!株式会社LEAN BODYでリードエンジニアをやっておりますko30005です!

今回はGoのORMであるGORMのバージョンアップをしたときのお話です。

弊社はAPIをGo+Echoという構成で開発しており、ORMはGORMを使っていましたが、以下でも触れている通り様々な理由からアップグレードをすることになりました

これが修正箇所がかなり多く、いくつかポイントがあったので記事にしようと考えました。

何故GORM v2にアップグレードしたのか?

  • いつかはGORM v1がサポートされなくなりそうで大きな開発が始まる前に変えておきたかった
  • GROM v2の機能を使いたいと思うことが増えてきた
  • 公式ドキュメント がデフォルトでGORM v2前提になっており、調査の際にひと手間多かった
    • 関連して、この機能使えそう!みたいなときにうちv1じゃん。。。みたいなことがあった
  • GORM v2がインストールされてしまうので自動ライブラリアップデートを導入を考えたときに一手間増えていた

これらの課題をうすうすと感じてはいました。

そんな中で採用が進み弊社の開発メンバーが今後多くなることが確定し、このままだとどんどん修正箇所が増えていって対応コストが跳ね上がりそうと感じこのタイミングでのアップデートを決意しました。

実際の変更作業

破壊的変更がいくつかったので既存のコードを修正する作業が必要でした。

変更の作業はドキュメントを見て大枠の差分を確認しつつ、アップデートしてみてからコンパイルエラーを確認したり、落ちたテストのエラーを確認しながら地道に変更していきました。

パッケージ変更

GORM v2はv1とはインポートのパスが別物になっているのでGORM v2に置き換えるだけでコンパイルーエラーが大量に出ました

import (
-    "github.com/jinzhu/gorm"
+    "gorm.io/gorm"
)

これでコンパイルエラーが大量に出たので型の修正メソッドの修正を行っていきつつ、DBドライバーの変更などアップデートに必要な作業を行っていきました。

またバージョンアップに当たり他の方の変更事例の記事なども参考にさせていただきました。
具体的なアップデート方法については公式や他の方の記事に譲りたいと思います。

変えたときに感じたこと

  • テストが落ちまくって修正する箇所が多かった
    • 様々な箇所からGORMを使用していたため覚悟していましたがやはり大変でした。
    • ですが後述しますがこれはメリットでもあったなと感じています。
  • マイグレーションツールもアップデートする必要があり既存のマイグレーションファイルが大量にエラーになった
    • GORMのマイグレーション周りはアップデートによる破壊的変更が多かった為既存のファイルをかなり修正しないといけませんでした。
    • ただこちらは同時期に導入を検討していたsqldefというマイグレーションツールに思い切って変更する方針にしました。
    • その為GORMのアップデートの前にマイグレーションツールだけsqldefに移行する作業をしました(その時の記事はこちら
    • sqldefに変えてマイグレーションの体験もかなり良くなった為作者に感謝
  • Findの挙動が変わってErrRecordNotFoundを出さなくなった(弊社は修正箇所大量でした)
    • GORM v1ではFindメソッドでErrRecordNotFoundを返すようになっていたのですがv2からは返さないようになりました
    • 弊社ではFindメソッドがErrRecordNotFoundを返す前提でハンドリングしている箇所が多く、地道な修正でしたが落ちたテストを一個づつ確認つつ対応していきました。
  • とにかく修正量と影響箇所が多くて大変だった
    • 少しづつ着実に対応していきました。

変えたあとに思ったこと

  • 新機能がやっと使える!
  • テスト充実していて更新することのハードルはなかったが、もしテストを書いてなかったらいろんなことで不具合になっていた可能性がある
    • 弊社では普段からテストコードをしっかりめに書いていたので、アップデート起因で不具合が発生する前に気づけたのが大きいです
    • またテストが落ちていたので大体の修正箇所も明確になっていた為修正箇所と工数の把握にも貢献してくれました
    • リリース後も特に大きな問題もなく無事にアップデートが完了しました!テスト最高!
  • とはいえ時間かかった
    • 調査も含めると開始からリリースまで半月くらいはかかった気がします。(マイグレーションツールの以降は別)
  • GORMのドキュメント見るときv1のドキュメントを表示しなくてすむ手間が思ったよりらく!!!
    • 調べてから「あっ!これそういえばv2のドキュメントじゃん!!!」って手戻りがなくなったのが地味に効いている気がします(他の人はブックマーク等で対策してたりするかもなので、これは私だけの感想かも笑)

まとめ

今回はGORMのバージョンアップの話をしました。

「いつかはやんなきゃ。。。」と思っていたけど影響範囲が大きすぎてできなかったためずっと心残りではありましたが無事アップデートできてよかったです。

アップデート作業に踏み切れて無事完了できたのはチームメンバーの協力とテストをちゃんと書く文化になってい点が強いかなと思っています
GORMの話ではありましたが、この点に関してはこれに限らずORMのような依存度の高いライブラリを更新する際にも役立ってくれそうだな?と思います。
今後こういったアップデートをする方の参考になればと思います

Discussion

ログインするとコメントできます