Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
マイベストのREST APIをGraphQLに置き換えた話 Kyohei Katada (@katakyo_51) update April 19, 2024
Slide 2
Slide 2 text
⾃⼰紹介 Index 1 GraphQLへの移⾏の背景 2 移⾏⼿順に関して 3 移⾏時の気づき 4 結果 5
Slide 3
Slide 3 text
⽚⽥ 恭平 Katada Kyohei Backend Engineer 23卒にマイベストのバックエンドエンジニアとして⼊社 触る技術: Ruby on Rails, GraphQL, Next.jsを触ります 趣味: サウナ週⼀くらいで⾏きます、野球観戦、国内観光が最近の趣味 最近、社内の脱⽑の検証で、すね⽑の⼀部が⽣えてこなくなりました 画像 ⾃⼰紹介
Slide 4
Slide 4 text
GraphQLへの移⾏の背景 画像
Slide 5
Slide 5 text
マイベストは2019年からGraphQLを導⼊しているが、導⼊の背景として以下の3つの理由がある GraphQL移⾏の背景 マイベストのGraphQLの導⼊の背景 1 2 3 スキーマと型によってインタフェースが定義される オーバーフェッチやアンダーフェッチを防げる クエリがクライアント(フロントエンド)側で柔軟に調整できる 規約‧書き⽅が統⼀できる 運⽤が(⽐較的)容易である OpenAPIは数が増えれば増えるほど運⽤が⼤変になってくる
Slide 6
Slide 6 text
GraphQL移⾏の背景 mybestのwebアプリケーション mybest favlist admin
Slide 7
Slide 7 text
GraphQL移⾏の背景 2023年4⽉時の状況 ● ⾃分が新卒⼊社したタイミングではmybestの表側のみGraphQLのみ終わっており、管理画⾯ (admin)や新規事業のFavlistは移⾏が途中もしくはほぼ⼿がついていない状態であった favlist admin Railsの画⾯とNext.jsの画⾯が混在 mybest Next.jsに移⾏が完了
Slide 8
Slide 8 text
GraphQL移⾏の背景 2023年4⽉時の状況 ‧FrontendもReact/Slimが混在しており、Next.jsに置き換えるにあたり、マイベストのサービスの REST API通信を新卒2⼈が中⼼となってGraphQLに置き換えるプロジェクトが始まった Backend Frontend API
Slide 9
Slide 9 text
移⾏の⼿順 画像
Slide 10
Slide 10 text
移⾏の⼿順 移⾏の⼤まかな⼿順 ❶既存のAPIの調 査 ❷GraphQL スキーマ定義 ❸GraphQL Resolverの実装 ❹Next.js/ GraphQLの繋ぎ込 み 以下のような⼯程でREST APIからGraphQLへ置き換えた 1. 既存のAPIの調査 2. GraphQLスキーマ定義 3. GraphQL Resolverの実装 4. Next.js/ GraphQLの繋ぎ込み 5. 不要になったソースコードの削除 ❺不要になった ソースコードの削 除
Slide 11
Slide 11 text
移⾏の⼿順① 既存のAPIの調査 ● RailsのControllerやroutingなどを調べ、置き換え対象のAPIを洗い出す ● QueryかMutationかはREST APIのHTTPメソッドによって判断する 操作 REST SQL GraphQL データ取得 GET Select Query データ追加 POST Create Mutation データ更新 PATCH Update Mutation データ削除 DELETE Delete Mutation イベント監視 - - Subscription
Slide 12
Slide 12 text
既存のAPIの調査 ● Controllerや画⾯をみて、例えばIndexメ ソッドやEditメソッドのような表⽰系なら QueryとしてAPIを作成する ● Createメソッド、Updateメソッドのような データ操作をするようなメソッドなら MutationとしてAPIを作成する これを地道に調査します Query Mutation Query Mutation 移⾏の⼿順①
Slide 13
Slide 13 text
移⾏の⼿順① 既存のAPIの調査 ● プロジェクトの開始時はGraphQLとREST APIが混在しているような状況であったため、 Notionに置き換える対象の画⾯やAPIを洗い出して進捗を可視化できるようにした
Slide 14
Slide 14 text
● 今回は具体例としてUser情報のupdateのMutation を作る 移⾏の⼿順② GraphQLの実装 ● Userテーブルには以下のカラムがあるとする ● リダイレクトの処理はFrontendで⾏うためAPIの 処理としては書かない カラム名 型 nullable ID ID false name String false email String false
Slide 15
Slide 15 text
● Resolverで返す値の型やnullableかはObjectTypeとして定義する 移⾏の⼿順② GraphQLスキーマ定義(ObjectTypeの実装)
Slide 16
Slide 16 text
‧Mutationの処理に必要な引数をInputTypeとして定義する 移⾏の⼿順② GraphQLスキーマ定義(InputTypeの実装)
Slide 17
Slide 17 text
先程定義したObjectTypeやInputTypeをfieldやargumentの型として定義しResolver関数を書く 移⾏の⼿順③ GraphQL Resolverの実装(Mutationの実装) ● ユーザーの名前とメールアドレスを更新す る処理をMutationで実装するなら右のよう なコードになる
Slide 18
Slide 18 text
‧リプレイスの前後では古いシステムと新しいシステムが混在する ‧mybestではRailsとNext.jsでportを出し分けしてアクセスの向きをNginXの設定で振り分けている 移⾏の⼿順④ リプレイス前後の表⽰の制御に関して
Slide 19
Slide 19 text
● Frontendは既存の画⾯をそのままNext.jsで表⽰できるようにした上でGraphQLの通信でデータ の操作ができるように実装した ● Frontend、Backendを置き換えたら、Nginxの設定を変更し、Next.jsの表⽰に切り替える 移⾏の⼿順④ Next.jsの実装とGraphQLの繋ぎ込み
Slide 20
Slide 20 text
● 動作が問題ない、安定稼働できることが確認できたら、使わなくなった古いViewファイルや Controller、Routingなどのファイルを削除する 移⾏の⼿順⑤ 使わなくなったコードの削除
Slide 21
Slide 21 text
移⾏時の気づき 画像
Slide 22
Slide 22 text
● リプレイスの⼯数の重さによって開発フローを適宜切り替える ● スキーマ定義はBackend、Frontend間で合意をとりながら設計をする 移⾏時の気づき ⼤規模な移⾏プロジェクトをやって得た学び
Slide 23
Slide 23 text
移⾏時にBackend側とFrontend側は実装するAPIの開発の重さによって実装⼿順を変えた 1. 開発⼯数が重めの場合、GraphQLのスキーマ定義のあとResolverはモックデータを返すよう に実装し、FrontendとBackendのロジックを同時に実装する 2. 開発⼯数が軽めの場合は、Backendを作ってからFrontendに実装を依頼する 移⾏時の気づき リプレイスの⼯数の重さによって開発フローを適宜切り替える ❶既存のAPIの調 査 ❷GraphQL スキーマ定義 ❸GraphQL Resolverの実装 ❹Next.js/ GraphQLの繋ぎ込 み ❺不要になった ソースコードの削 除 Backend Frontend 調査 削除
Slide 24
Slide 24 text
リプレイスにあたり、Frontend側でコンポーネントを分けたい画⾯があり、コンポーネント再設計 に伴いスキーマ構造も変更が必要になった Backend側でパフォーマンスや可読性の問題が発⽣したため、再度スキーマ設計が必要になった 移⾏時の気づき スキーマ定義はBackend、Frontend間で合意をとりながら設計をする
Slide 25
Slide 25 text
複雑なリファクタリングが必要な場合は、DesignDocs にProsConsなどを書いてスキーマの再設計を⾏い、リ プレイスの作業の際にリファクタリングも兼ねて実装し た この際にBackend側とFrontend側でベストなスキーマ が必ずしも⼀致するとは限らないので合意をとりながら 進めると良さそうだった 移⾏時の気づき スキーマ定義はBackend、Frontend間で合意をとりながら設計をする
Slide 26
Slide 26 text
結果 画像
Slide 27
Slide 27 text
外部APIを除くほぼ全てのAPIを GraphQLに置き換えることができた
Slide 28
Slide 28 text
ご清聴ありがとうございました
Slide 29
Slide 29 text
画像 宣伝 4/15(⽉)から1ヶ⽉間テックブログの連載しています! Xで告知してますので是⾮@mybest_devをフォローしてください!