【GraphQL】サービスを止めずにMutationに必須フィールドを追加する流れ
はじめに
モバイルアプリが利用するGraphQLのMutationに必須フィールドを追加するにあたって検討した際のメモです。
サービスを止めないで、ユーザーにわからないようMutationに必須フィールドを追加する際の作業の流れを記します。
特にモバイルアプリの場合は、修正をリリースしても一時的に新しいバージョンと古いバージョンが混在するので、注意が必要です。
方法
以下の順に、GraphQLサーバであるバックエンドと、それを利用するフロントエンドを段階に分けて修正・リリースします。
バックエンド: 必須フィールドをNullableなFieldとして追加する
いきなり必須フィールドとして追加してしまうと、当然ですがクライアントからのリクエストに対象フィールドが存在しないためエラーになってしまいます。
また同様に、フィールド定義がない状態でクライアントからリクエストを行う場合もエラーになります。("unknown field")
Nullableで追加さえしておけばエラーになることはありません。
フィールドさえ追加しておけば、この段階では送信されてきた値はフィールドの性質によっては無視しても構わないでしょう。先にフィールド追加だけしてデプロイすることで、クライアント側はリクエストに対象フィールドを積む修正を並行して進めることができます。
バックエンド: リゾルバでの処理を追加する
対象のフィールドを含むリクエストを処理できるように、リゾルバを修正します。
フロントエンド: 対象フィールドをリクエストに追加
対象のFieldを含むリクエストを送信できるように、クライアントを更新します。
モバイルアプリの場合は、対象のフィールドを送信するクライアントと、そうでないクライアントが一時的に混在します。
フロントエンド: 強制アップデートを行う
対象のフィールドを送信するクライアントが100%になるよう制御します。
バックエンド: 対象フィールドを必須フィールドに修正
これで、完了です!
おわりに
サービスを止めないで、ユーザーにわからないようMutationに必須フィールドを追加する際の作業の流れをまとめました。
特にモバイルアプリの場合は、修正をリリースしても一時的に新しいバージョンと古いバージョンが混在するので、注意が必要です。
Discussion