아키텍처필드/디렉티브 기반 버전 관리
필드/디렉티브 기반 버전 관리
필드와 디렉티브는 독립적으로 버전 관리할 수 있으며, 사용할 버전은 필드/디렉티브 인수 versionConstraint를 통해 쿼리 내에서 지정할 수 있습니다.
필드/디렉티브의 버전을 선택하기 위해 Gato GraphQL은 Composer가 채택한 것과 동일한 semver 버전 제약을 사용합니다.
버전 관리가 필요한 이유
GraphQL이 채택한 진화 전략에는 문제가 있습니다. 필드를 더 이상 사용하지 않도록 지정(deprecate)하고 새로운 구현으로 교체할 때, 새 필드는 새로운 이름을 가져야 합니다. 그런데 deprecated 필드를 제거할 수 없는 경우(예를 들어, 일부 클라이언트가 아직 해당 필드에 접근하고 있고 쿼리가 수정되지 않은 경우), 같은 기능에 대한 필드들이 스키마에 축적되는 경향이 있으며, 새로운 구현의 필드는 최적의 이름을 갖지 못하게 됩니다(실제로 deprecated 필드 이름보다 좋지 않을 수 있습니다).
진화만으로는 시간이 지남에 따라 스키마가 불필요한 정의로 오염되는 경향이 있습니다. 필드/디렉티브 단위로 스키마를 버전 관리하면 이 문제를 해결할 수 있습니다.
쿼리를 통한 버전 지정
인수 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")
}
}