Slide 1

Slide 1 text

Copyright © Bitkey Inc. All rights reserved. GoConnect#4 GORM v1 → v2に移行したときの変更点 株式会社ビットキー 上窪 大暉

Slide 2

Slide 2 text

Copyright © Bitkey Inc. All rights reserved. 2 自己紹介 上窪 大暉 (うえくぼ だいき) X: https://x.com/daikideal GitHub: https://github.com/daikideal Qiita: https://qiita.com/daikideal Zenn: https://zenn.dev/daikideal 略歴 ● 2020年8月 エンジニアキャリアスタート ● 2022年12月 ビットキーに入社 ● 2023年10月 Cross Service Backendチームに異動 ○ → 認証認可基盤を開発 今やっていること ● バックエンドの開発 (Goを使用) ● CI/CDの改善 ● インフラの保守・運用 登壇者について

Slide 3

Slide 3 text

Copyright © Bitkey Inc. All rights reserved. 3 1. GORMについて 2. v2移行の背景 3. 変更点 今日話すこと

Slide 4

Slide 4 text

Copyright © Bitkey Inc. All rights reserved. 4 GORMについて

Slide 5

Slide 5 text

Copyright © Bitkey Inc. All rights reserved. 5 GORMについて GORMとは 引用元: https://gorm.io/ja_JP/

Slide 6

Slide 6 text

Copyright © Bitkey Inc. All rights reserved. 6 ● 機能が豊富なことをウリにしている ○ レコード to 構造体へのマッピング ○ クエリビルダー ○ DBマイグレーション ○ …etc ● GoのORMとしては最もポピュラー ○ スター数(*) ○ Goのイベントで情報交換しての肌感 ● v1とv2がある *...スライド作成時点(2024年11月末)で37,100でGoのORMではトップ GORMについて GORMの特徴

Slide 7

Slide 7 text

Copyright © Bitkey Inc. All rights reserved. 7 GORMについて GORMのv1とv2 引用元: https://gorm.io/ja_JP/docs/v2_release_note.html

Slide 8

Slide 8 text

Copyright © Bitkey Inc. All rights reserved. 8 GORMについて GORMのv1とv2 引用元: https://gorm.io/ja_JP/docs/v2_release_note.html

Slide 9

Slide 9 text

Copyright © Bitkey Inc. All rights reserved. 9 v2移行の背景

Slide 10

Slide 10 text

Copyright © Bitkey Inc. All rights reserved. 10 v2移行の背景 システム構成(簡易版)

Slide 11

Slide 11 text

Copyright © Bitkey Inc. All rights reserved. 11 v2移行の背景 システム構成(簡易版)

Slide 12

Slide 12 text

Copyright © Bitkey Inc. All rights reserved. 12 ● v1のままになっていることによる実害はない → チームのタスクにはなっていない ● できればv2に移行しておいた方がいい ○ v1はもうメンテナンスされないので脆弱性対応が入らない ○ v1ではcontextの伝搬(*)に対応していないが、v2では対応 ○ サービスごとにバージョンが違うと管理しづらい *...`func (*DB) WithContext`というメソッドで有効にできる v2移行の背景 v2に完全移行したい

Slide 13

Slide 13 text

Copyright © Bitkey Inc. All rights reserved. 13 ● スカンクワーク(*)という制度があるので毎週少しずつ進められた ○ リリースまでは約2ヶ月ほど ● 進め方 ○ importの "github.com/jinzhu/gorm" を "gorm.io/gorm" に置換して go build し、落ちたところを直す ○ 単体テストを実行して落ちたところを直す ○ E2Eテストを実行して落ちたところを直す *...社員が本来やるべき業務以外の自主的活動のことで、Google社の20%ルールと似ている。  1週間スプリントである我々のチームでは毎週金曜日がスカンクに当たる v2移行の背景 どう進めたか

Slide 14

Slide 14 text

Copyright © Bitkey Inc. All rights reserved. 14 変更点

Slide 15

Slide 15 text

Copyright © Bitkey Inc. All rights reserved. 15 変更点 1. コネクションの開け方 2. コネクションプールの設定方法 3. コネクションの閉じ方 4. エラーハンドリングの方法 5. Loggerの設定方法 6. Limit(), Offset() に渡す引数の型 7. byteaのゼロ値の取り扱い ※後半に行くにつれて対応難易度が上がります 修正が必要だった箇所は主に7つ

Slide 16

Slide 16 text

Copyright © Bitkey Inc. All rights reserved. 16 ● `func Open`のインターフェースが変更 ○ v1: 引数にDSNを受け取る ○ v2: 引数に`type Dialector`を受け取る 変更点 コネクションの開け方

Slide 17

Slide 17 text

Copyright © Bitkey Inc. All rights reserved. 17 変更点 コネクションの開け方

Slide 18

Slide 18 text

Copyright © Bitkey Inc. All rights reserved. 18 ● GORMはdatabase/sqlの`sql.DB`を使ってコネクションプールを保持する ● `gorm.DB`から`sql.DB`を取得する`func (*DB) DB`の戻り値が変更 ○ v1: `*sql.DB`を返す ○ v2: `*sql.DB`とerrorを返す 変更点 コネクションプールの設定

Slide 19

Slide 19 text

Copyright © Bitkey Inc. All rights reserved. 19 変更点 コネクションプールの設定

Slide 20

Slide 20 text

Copyright © Bitkey Inc. All rights reserved. 20 ● v1: GORMの`func (*DB) Close`を使う ● v2: database/sqlの`func (*DB) Close`を使う 変更点 コネクションの閉じ方

Slide 21

Slide 21 text

Copyright © Bitkey Inc. All rights reserved. 21 変更点 コネクションの閉じ方

Slide 22

Slide 22 text

Copyright © Bitkey Inc. All rights reserved. 22 変更点 エラーハンドリングの方法 引用元: https://pkg.go.dev/gorm.io/gorm#pkg-variables ● `IsRecordNotFoundError()`という関数が廃止 ● GORMが事前に定義しているエラーを`errors.Is()`の第二引数に渡して判定するよう変更

Slide 23

Slide 23 text

Copyright © Bitkey Inc. All rights reserved. 23 変更点 エラーハンドリングの方法

Slide 24

Slide 24 text

Copyright © Bitkey Inc. All rights reserved. 24 ● Loggerを設定するタイミングが変更 ○ v1: `func Open`で受け取った`type DB`の`func (*DB) SetLoggerを呼び出す ○ v2: `func Open`の引数`type Config`に`logger.Interface`を満たす構造体を含める 変更点 Loggerの設定

Slide 25

Slide 25 text

Copyright © Bitkey Inc. All rights reserved. 25 変更点 Loggerの設定

Slide 26

Slide 26 text

Copyright © Bitkey Inc. All rights reserved. 26 ● 特に設定しなければGORMのデフォルトのLoggerが適用される ● チーム独自で運用しているLoggerライブラリをラップしたLoggerを実装して設定 変更点 Loggerの設定

Slide 27

Slide 27 text

Copyright © Bitkey Inc. All rights reserved. 27 ● インターフェースが変更 ○ v1: 引数に`interface{}`を受け取る ○ v2: 引数に`int`を受け取る ● ページネーションを以下のようなドメインオブジェクトとして定義して usecase ↔ repositoryでやりとりしていたので影響あり 変更点 Limit(), Offset() に渡す引数の型

Slide 28

Slide 28 text

Copyright © Bitkey Inc. All rights reserved. 28 変更点 Q. ドメインの定義を修正するか、repositoryの処理内でキャストするか A. repositoryの処理内でキャストする 理由: ● `int`にしないといけないのはデータアクセス上の都合 ● GORMをバージョンアップした影響でドメインに変更を加えるのは好ましくない Limit(), Offset() に渡す引数の型

Slide 29

Slide 29 text

Copyright © Bitkey Inc. All rights reserved. 29 変更点 Limit(), Offset() に渡す引数の型

Slide 30

Slide 30 text

Copyright © Bitkey Inc. All rights reserved. 30 ● Goの`[]byte`はPostgreSQLのbytea型として保存できる ● NOT NULL制約つきのbytea型のカラムにnilを入れた時の挙動に差異あり ○ v1: `\x`(*)としてInsertされる ○ v2: NOT NULL制約違反エラーが発生する ● 原因がわからなかったのでテストコードで検証 ○ https://github.com/daikideal/gorm-demo もし原因をご存知の方がいらっしゃいましたら教えていただけると嬉しいです 🙇 *...空のbytea。Postgresはバイナリ列をSQLフォーマットで入出力するとき文字列に変換するが、 このときデフォルトで使われるのがhex書式で、`\x`が文字列の先頭につく。 参考: https://www.postgresql.jp/docs/9.4/datatype-binary.html 変更点 byteaのゼロ値

Slide 31

Slide 31 text

Copyright © Bitkey Inc. All rights reserved. 31 変更点 byteaのゼロ値 ● v1の挙動を確認するテスト(抜粋)

Slide 32

Slide 32 text

Copyright © Bitkey Inc. All rights reserved. 32 変更点 byteaのゼロ値 ● v2の挙動を確認するテスト(抜粋)

Slide 33

Slide 33 text

Copyright © Bitkey Inc. All rights reserved. 33 変更点 byteaのゼロ値 ● テスト結果

Slide 34

Slide 34 text

Copyright © Bitkey Inc. All rights reserved. 34 ● 検証結果からわかったこと ○ `nil`をセットした時と`[]byte{}`をセットした時とでInsertされる値は変わらない → どちらも`\x`になる ● 対応方針 ○ `nil`を`[]byte{}`に書き換えるだけでOK 変更点 byteaのゼロ値

Slide 35

Slide 35 text

Copyright © Bitkey Inc. All rights reserved. 35 変更点 byteaのゼロ値

Slide 36

Slide 36 text

Copyright © Bitkey Inc. All rights reserved. 36 おわりに

Slide 37

Slide 37 text

Copyright © Bitkey Inc. All rights reserved. 37 おわりに まとめ GORM v1 と v2 には互換性がない部分があるので移行する時は注意が必要! この発表がこれからGORM v2移行する方の参考になれば幸いです 💪

Slide 38

Slide 38 text

Copyright © Bitkey Inc. All rights reserved. 38 ● 元記事の方もよろしくお願いします! ○ じっくり見たい方 ○ 参考文献へのリンクも欲しい方 【Go】GORM v1 → v2に完全移行した時の話 おわりに まとめ

Slide 39

Slide 39 text

Copyright © Bitkey Inc. All rights reserved. 39 会社紹介 ビットキーのミッション

Slide 40

Slide 40 text

Copyright © Bitkey Inc. All rights reserved. 40 会社・プロダクトの紹介 ハード・ソフトを自社で開発 ×

Slide 41

Slide 41 text

Copyright © Bitkey Inc. All rights reserved. 41 会社紹介 We are hiring! Engineering の求人一覧 カジュアル面談申込フォーム

Slide 42

Slide 42 text

Copyright © Bitkey Inc. All rights reserved. 42 End of File