アーキテクチャフィールド/ディレクティブベースのバージョニング
フィールド/ディレクティブベースのバージョニング
フィールドとディレクティブは独立してバージョン管理でき、使用するバージョンをフィールド/ディレクティブの引数 versionConstraint を通じてクエリ内で指定できます。
フィールド/ディレクティブのバージョンを選択するために、Gato GraphQL は Composer が採用するのと同じ semver バージョン制約を使用します。
なぜバージョニングが必要か
GraphQL が採用している進化戦略には問題があります。フィールドを非推奨にして新しい実装に置き換える場合、新しいフィールドは新しいフィールド名を持つ必要があります。そして、非推奨のフィールドを削除できない場合(たとえば、一部のクライアントがまだそのフィールドにアクセスしており、クエリが見直されていない場合など)、同じ機能に対するフィールドがスキーマに蓄積される傾向があり、新しい実装のフィールドは最適な名前を持てなくなります(実際、非推奨のフィールド名よりも劣ったものになります)。
進化だけでは、時間の経過とともにスキーマが望ましくない定義で汚染される傾向があります。フィールド/ディレクティブ単位でスキーマをバージョン管理することで、この問題を解決できます。
クエリを通じた対象バージョンの指定
引数 versionConstraint を使用して、フィールドまたはディレクティブに制約を渡します。
# Selecting version for fields
query {
#This will produce version 0.1.0
firstVersion: userServiceURLs(versionConstraint: "^0.1")
# This will produce version 0.2.0
secondVersion: userServiceURLs(versionConstraint: ">0.1")
# This will produce version 0.2.0
thirdVersion: userServiceURLs(versionConstraint: "^0.2")
}
# Selecting version for directives
query {
post(by: { id:1 }) {
titleCase: title @makeTitle(versionConstraint: "^0.1")
upperCase: title @makeTitle(versionConstraint: "^0.2")
}
}