Slide 1

Slide 1 text

© GENDA Inc. sqlcを新規サービスに採用してみた! プロダクト開発部 西尾 健人

Slide 2

Slide 2 text

© GENDA Inc. 01.   会社説明 02.   sqlcとは 03.   sqlcを採用した理由 04.   プロダクトでsqlcを使う際のTips 目次

Slide 3

Slide 3 text

© GENDA Inc. 自己紹介 西尾 健人 ● GENDA 新卒 ● FE/BE ○ Go/TypeScript/Dart(Flutter) ○ Python ● 趣味 ○ 筋トレ、ボディビル

Slide 4

Slide 4 text

© GENDA Inc. 01. 会社説明

Slide 5

Slide 5 text

© GENDA Inc. 会社概要 社名 代表取締役社長 設立 上場市場 株式会社GENDA 申 真衣 2018年5月 東京証券取引所グロース市場 資本金 64億6,307万円(資本剰余金含む)2023年8月31日現在 従業員数 連結:11,063名(2024年2月29日時点) 所在地 東京都港区東新橋1-9-1 東京汐留ビルディング17F

Slide 6

Slide 6 text

© GENDA Inc. 世界中の
 人々の人生を
 より楽しく
 Aspiration 人が人らしく生きるために「 楽しさ」は不可欠と考え、 私たちは「世界中の人々の人生をより楽しく 」という Aspiration(アスピレーション=大志)を掲げています。

Slide 7

Slide 7 text

© GENDA Inc. 2つの成長戦略 M&A / Finance GENDAグループはM&Aによって事業領域を拡大しており、 それに伴ってテクノロジーを活用する領域も増えていきます。 GENDAにはプロダクト開発に携わる プロフェッショナルが集まり、 グループ各社の成長をテクノロジー面でリード しています。 Technology アミューズメント施設会員向け 公式アプリの開発 アミューズメント施設の DX推進 テクノロジーを活用して、 エンターテイメント業界に挑戦 クレーンゲームの オンライン展開 既存事業の成長に加え、 M&Aでの「連続的な非連続な成長」 により 株式価値を高めていくことが成長戦略の柱になっています。

Slide 8

Slide 8 text

© GENDA Inc. GENDAグループ概観

Slide 9

Slide 9 text

© GENDA Inc. プロダクト

Slide 10

Slide 10 text

© GENDA Inc. 02. sqlcとは

Slide 11

Slide 11 text

© GENDA Inc. sqlcとは SQLのクエリからtype-safeなコード を自動生成するパッケージ https://sqlc.dev/

Slide 12

Slide 12 text

© GENDA Inc. sqlcのサポート範囲 Language MySQL PostgreSQL SQLite Go Stable Stable Beta Kotlin Beta Beta Beta Python Beta Beta ー TypeScript Beta Beta ー [1] https://docs.sqlc.dev/en/latest/reference/language-support.html v1.26.0 (2024/06/13) 現在 [1]

Slide 13

Slide 13 text

© GENDA Inc. sqlcの使い方 01.   DBのスキーマと設定ファイル(sqlc.yaml or sqlc.json)を用意 02.   SQLのクエリを書く 03.    $ sqlc generate 全ての作業は「sqlc playground」[2] で実施しています。 (https://play.sqlc.dev/p/12767f4f5b4a5a6dbda6a51fd6c663cef35515f11bc5df569874a3ab57515b3d) [2] https://play.sqlc.dev

Slide 14

Slide 14 text

© GENDA Inc. 設定ファイル ● queries クエリファイルのパス ● schema DDL文のパス ● gen ○ package 生成されるパッケージ名 ○ out 生成コードを出力するディレクトリ sqlc.json

Slide 15

Slide 15 text

© GENDA Inc. クエリを書く DDL文 id指定で購入履歴を一つ取得するクエリ

Slide 16

Slide 16 text

© GENDA Inc. コード生成 ← クエリがconstで生成 (設定次第) ← データ取得のコードが生成 ← 別ファイルに構造体も生成

Slide 17

Slide 17 text

03. sqlcを採用した理由

Slide 18

Slide 18 text

© GENDA Inc. sqlcを採用した理由 01.   コードの安定性の向上 02.   生成されるコードの可読性の高さ 03.   個人のOSS → 会社化

Slide 19

Slide 19 text

© GENDA Inc. コードの安定性の向上 Go標準 ⚪ 使いやすい(クエリ書いて Scanするだけ) ✖ データのマッピング(テーブルのカラムを追加した時とか大変) 高度なORMマッパー(GORM、xorm etc.) ⚪ 型安全 ⚪ Goの書き心地でSQLを扱える △ 学習コスト    ✖ データのマッピング

Slide 20

Slide 20 text

© GENDA Inc. コードの安定性の向上 sqlc ⚪ Go標準の使いやすさ ⚪ 型安全 ⚪ Testもしやすい ⚪ データのマッピング コンパイラがチェックできないエラー( SQL文のマッピング順と引数の順番)を解決 [4] マッピングをSQL文で管理できる (最近はORMでも自動生成できるものがあるらしい: Gorm GEN [5]) [4] https://conroy.org/introducing-sqlc [5] https://gorm.io/gen/index.html

Slide 21

Slide 21 text

© GENDA Inc. コードの可読性の高さ Goの標準パッケージのみで生成 (context, database/sql, time) データもプリミティブなデータ型で定義さ れる ↓ ORMマッパーに慣れていないメンバー も使いやすい(インターン生が多かった) 最悪手動で直せる

Slide 22

Slide 22 text

© GENDA Inc. 個人OSS → 会社化 Coreコントリビューターの方が会社を立ち上げて sqlcをフルタイムでサポート&スポンサード ● プロダクトレベルで導入する上で少し安心 https://github.com/sqlc-dev/sqlc

Slide 23

Slide 23 text

© GENDA Inc. 04. プロダクトでsqlcを使 う際のTips

Slide 24

Slide 24 text

© GENDA Inc. 集計関数を使用する時の注意点( MySQL) ← 集計関数を使用したクエリ ← 集計値の型が interfaceとなってしまう (具象型は []byte型、詳細はzennへ [6]) [6] https://zenn.dev/genda_jp/articles/b8b8df8e6fc769

Slide 25

Slide 25 text

© GENDA Inc. 生成されたコードにGodocをつける ↑ コメントを残すと、  生成されたメソッドにGodocも生成される

Slide 26

Slide 26 text

© GENDA Inc. SQL文のLinterを導入する SQL文が常に正となるのでしっかり保守したい ● SQLFluff ● ○ PythonベースのSQL Linter ○ 公式のDocker imageもあり扱いやすい [7] [7] https://hub.docker.com/r/sqlfluff/sqlfluff https://sqlfluff.com/

Slide 27

Slide 27 text

© GENDA Inc. 他にも色々 便利な機能はたくさんある 機能 概要 sqlc verify schemaの変更を検知して、これまでのクエリが問 題ないかを検証してくれる sqlc vet 自分でルールを書いて lintする 特定の操作を禁止したり、実行計画をもとに Slowク エリを特定したりする SQLのmigrationはサポートしていない ● up/down migrationをよしなにみてくれる機能はある ● 今回はsqldef [8]を使用してスキーマを管理 (sqlcと相性良さそう) [8] https://github.com/sqldef/sqldef

Slide 28

Slide 28 text

© GENDA Inc. Now Hiring!! エンジニア、募集しています! 他にもプロダクトマネージャーやデータサイエンティスト、 M&A担 当まで幅広く募集しています。

Slide 29

Slide 29 text

END