Slide 1

Slide 1 text

はじめての GraphQLスキーマ設計 2019/9/5 フロントエンドNight #1@ギフティ A1A株式会社 住奥 陸

Slide 2

Slide 2 text

2 自己紹介 Name Company Career Twitter Other 住奥 陸(すみおくりく) A1A株式会社(エイワンエイ) ワークス → ジラフ → A1A @rikuson298 フロント, バックエンド, データモデリングなどア プリ開発を担当

Slide 3

Slide 3 text

3 Vision A1A(社名の由来) B2B をワンランク上に

Slide 4

Slide 4 text

4 技術スタック Frontend Backend API

Slide 5

Slide 5 text

5 はじめに GraphQLといえば 何を思い浮かべるでしょうか?

Slide 6

Slide 6 text

6 GraphQLといえば スキーマ定義の型付けによる 堅牢な開発

Slide 7

Slide 7 text

7 GraphQLといえば スキーマ駆動開発による 開発効率の向上

Slide 8

Slide 8 text

8 GraphQLといえば GraphQLではスキーマ定義によって フロントとバックエンドの依存を減らせる

Slide 9

Slide 9 text

9 GraphQLといえば 良いスキーマ設計されていれば...

Slide 10

Slide 10 text

10 これから話すこと メリットを効果的に享受するための スキーマ設計のポイントを説明します。

Slide 11

Slide 11 text

11 Agenda 1. 実装の詳細を含めない 2. ビジネスロジックを提供する 3. まとめ

Slide 12

Slide 12 text

12 サンプルの説明 簡単なカンバンツールの実装を例に説明します(Trelloみたいな)

Slide 13

Slide 13 text

13 サンプルのテーブル構造 List - id - title Card - id - label - list_id

Slide 14

Slide 14 text

14 サンプルのスキーマ

Slide 15

Slide 15 text

15 Agenda 1. 実装の詳細を含めない 2. ビジネスロジックを提供する 3. まとめ

Slide 16

Slide 16 text

16 サンプルに仕様追加 カードにタグを設定できる仕様に

Slide 17

Slide 17 text

17 サンプルのテーブル構造 List - id - title Card - id - label - list_id CardTag - id - card_id - tag_id Tag - id - title 追加

Slide 18

Slide 18 text

18 スキーマ設計:NGパターン テーブル構造をそのまま スキーマに反映する

Slide 19

Slide 19 text

19 スキーマ設計:NGパターン CardTagは多対多を実現する 関連テーブルであるため 機能には関係がない

Slide 20

Slide 20 text

20 スキーマ設計:NGパターン また、多対多の実装方法が 変更された際に修正が必要に

Slide 21

Slide 21 text

21 スキーマ設計:NGパターン 実装の詳細をスキーマに含めると バックエンドの実装変更によって フロントエンドが影響を受けやすくなってしまう

Slide 22

Slide 22 text

22 スキーマ設計:GOODパターン Card 型に tags フィールドを追加する

Slide 23

Slide 23 text

23 スキーマ設計:GOODパターン 関連テーブルを挟まないので フロント側で扱いやすくなる

Slide 24

Slide 24 text

24 スキーマ設計:GOODパターン 実装の詳細が含まない ↓ バックエンドの実装変更による影響を受けづらい

Slide 25

Slide 25 text

25 Agenda 1. 実装の詳細を含めない 2. ビジネスロジックを提供する 3. まとめ

Slide 26

Slide 26 text

26 サンプルに仕様追加 カードが作成から一定期間経過すると変色し、通知される仕様に

Slide 27

Slide 27 text

27 サンプルのテーブル構造 List - id - title Card - id - label - list_id - created_at

Slide 28

Slide 28 text

28 スキーマ設計:NGパターン Card 型のフィールドに created_at のみ追加する

Slide 29

Slide 29 text

29 スキーマ設計:NGパターン カードを変色させるために created_at を元に 一定期間経過したかを判定する ビジネスロジックをフロントに持つ必要がある

Slide 30

Slide 30 text

30 スキーマ設計:NGパターン 一方、カードの変色を通知するために バックエンドでも同じビジネスロジックが必要に

Slide 31

Slide 31 text

31 スキーマ設計:NGパターン created_at のみ提供する ↓ バックエンドとフロントエンドで ビジネスロジックの二重管理になりバグの温床に

Slide 32

Slide 32 text

32 スキーマ設計:GOODパターン Card 型のフィールドに created_atをもとに一定期間をど のくらい経過したか判定した corrosion_rateを提供する

Slide 33

Slide 33 text

33 スキーマ設計:GOODパターン 統一の corrosion_rate を元にカードの変色と 変色通知を実装できる

Slide 34

Slide 34 text

34 スキーマ設計:GOODパターン バックエンドにビジネスロジックを統一でき フロントエンドとの二重管理を防げる

Slide 35

Slide 35 text

35 Agenda 1. 実装の詳細を含めない 2. ビジネスロジックを提供する 3. まとめ

Slide 36

Slide 36 text

36 まとめ ● 適切なスキーマ設計により、バックエンドとフロントエンドの依存を 減らせて幸せになれる ● スキーマに実装の詳細を含めない ○ 安直にテーブル構造と同じにするのはダメゼッタイ ● ビジネスロジックも提供する ○ ロジックの二重管理から開放される

Slide 37

Slide 37 text

37 We Are Hiring! A1A