アーキテクチャ
アーキテクチャフィールド/ディレクティブベースのバージョニング

フィールド/ディレクティブベースのバージョニング

フィールドとディレクティブは独立してバージョン管理でき、使用するバージョンをフィールド/ディレクティブの引数 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")
  }
}