Xml 버전 관리 전략


XML 버전 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
XML 스키마를 버전 관리하는 가장 좋은 방법은 무엇입니까?
나는 종종 다른 XML 기반 임포트 루틴을위한 XML 스키마를 디자인해야한다. XML 스키마는 시간이 지남에 따라 발전하거나 버그가 수정 될 수 있으므로 스키마 버전을 캡처하고 특정 버전에 바인딩 할 수있는 메커니즘을 갖는 것이 중요합니다.
현재 두 가지 시나리오가 있습니다.
버그는 스키마 내에서 발견되며 모든 스키마 인스턴스는 고정 버전을 준수해야합니다.
스키마가 업그레이드되어 더 바람직하다고 생각해야하지만 이전 스키마도 지원되어야합니다.
마지막으로 스키마의 네임 스페이스에 버전 정보를 저장하는 작업을했습니다.
버그를 고칠 때 같은 네임 스페이스에서 수정하지만 스키마를 업그레이드하려고하면 새 네임 스페이스를 만들어야하지만 업그레이드 월이 추가됩니다.
그리고 한 달에 한 번 이상 업그레이드 한 경우 하루 만 추가하면됩니다.
더 나은 접근법을 알고 있습니까?
이것은 재미 없기 때문에 어려운 주제이며 컨설팅 지원을 제공하는 데 수년을 보냈습니다.
거기에는 많은 우수 사례가 있지만 대부분은 모든 상황에서 작동하지 않습니다. 예를 들어, 많은 사람들이 확장을 허용하기 위해 "xsd : any"를 사용하도록 권장합니다. 개발자가 스키마를 유지 관리하고이를 덤프로 만들면 재앙을 피할 수있는 방법 일뿐입니다.
시작하는 경우 다음과 같은 몇 가지 도움말을 참조하십시오.
부 버전 번호, 마이크로 버전 번호, 날짜 또는 그 밖의 다른 것을 네임 스페이스에 넣지 마십시오. 네임 스페이스를 변경할 때마다 모든 처리 응용 프로그램이 중단됩니다. XML 인스턴스 문서에 "version"속성을 두십시오. 이를 통해 처리 응용 프로그램 또는 v 전 어댑터 서비스가 처리중인 것을 판별 할 수 있습니다. 선택적인 요소를 추가해도 송신자가 중단되지 않으며, 모르는 요소를 무시하는 정책을 사용하는 경우 수신자가 중단되지 않습니다 (JAXB 및 XMLBeans는이 방식으로 구성 될 수 있음) )

eBay 스키마 버전 관리 전략.
2015 년 8 월부터 지원되는 가장 낮은 버전은 863입니다.
이 주제에서는 Trading API (및 Shopping API)에 대한 eBay의 버전 전략에 대해 설명합니다. 이 전략을 통해 최소한 18 개월 동안 이전 버전과의 호환성을 유지하면서 스키마를 발전시킬 수 있습니다. 이 전략은 이러한 우려를 해결하기위한 것입니다.
eBay는 2 주마다 새로운 기능을 추가합니다. 클라이언트 소프트웨어를 자주 업데이트하지 않으면 eBay에서 인식 할 수없는 데이터를 처리 할 수있는 소프트웨어가 필요합니다. 시간이 지남에 따라 eBay는 오래된 비즈니스 논리 또는 기능을 사용하는 타사 소프트웨어를 지원하기가 더 어려워집니다. eBay는 구형 기능에 대한 지원을 결국 중단 할 수있는 방법이 필요합니다. 귀하가 짧은 시일 내에 귀하의 소프트웨어를 업데이트하는 것이 어려울 수도 있음을 알고 있습니다. 도움을 받으려면 이베이는 일정 기간 동안 구형 기능에 대한 지원을 유지해야하며 기능 지원을 완전히 중단하기 전에 가능한 한 많은 정보를 제공해야합니다.
각 릴리스에서는 역 호환 방식으로 스키마를 업데이트하기 위해 최선을 다하고 있습니다. 그러나 때로는 이전 버전과 호환되지 않는 변경 작업이 필요할 수 있습니다.
XML 스키마 구조가 입력 될 때 형식 변경을 초래할 수있는 수정은 잠재적 인 비 호환성입니다. 아주 간단한 예로서, 현재 정수 값 (xs : int)에 측정 값 또는 계수를 표시 할 수 있지만, 이후의 향상에서는 동일한 값 (xs : double)에 대해 소수점 이하 자릿수를 허용하는 방법이 필요할 수 있습니다. 응용 프로그램이 런타임에 필드가 정수를 반환 할 것으로 예상하고 대신 double을 반환하기 시작하면 응용 프로그램이 실패 할 수 있습니다. 따라서 유형을 직접 변경하지 않는 방법이 필요합니다. 요소의 다중도를 변경하는 것도 잠재적 인 비 호환성입니다. 예를 들어 현재 단일 URL 입력란을 허용 할 수 있지만 향후 URL 항목 반복을 허용 할 수 있습니다 (maxOccurs = "unbounded"). 일부 툴킷은 반복 필드를 배열로 해석하기 때문에 유형 변경과 동일합니다.
그러한 변화가 필요할 때, 우리는 새로운 접근법을 단계적으로 단계적으로 이전하고 단계적으로 단계적으로 제거하는 방법이 필요합니다. 즉, 타사 응용 프로그램이 예기치 않게 실패하지 않고 변경해야하며 일상적인 변경 사항을 수용하도록 응용 프로그램을 설계해야합니다. 이 방법은 아래에서 설명합니다.
기본 스키마 개념.
이 문서를 읽기 전에이 기본 개념을 잘 알고 있어야합니다.
버전 관리 전략 요점.
이 섹션에서는 버전 관리 전략에 대해 알아야 할 핵심 사항을 요약합니다. 이 점에 대해서는 이후 섹션에서 자세히 설명합니다.
사용되지 않는 개체는 더 이상 권장하지 않는 개체입니다. 이 비추천이 발생했을 때의 스키마 버전은 객체의 비추천 버전입니다. 예를 들어, 스키마의 버전 803에서 "Flavor"라는 객체를 사용 중지 한 경우 해당 객체의 비추천 버전은 803입니다.
우리가 객체를 비추천 할 때마다, 우리는 또한 (특별히 명시하지 않는 한) 최신 스키마에서 객체를 동시에 삭제합니다. 최신 버전의 스키마로 업그레이드 할 때까지 응용 프로그램이 이러한 삭제의 영향을받지 않아야합니다. 스키마에서 삭제 된 이전에 비추천 된 객체 목록에 대해서는 객체 지원 중단 일정을 참조하십시오.
요청 버전에 따라 사용되지 않는 객체의 사용을 제어합니다.
입력 객체 인 경우 요청 버전과 관계없이 경고 만받을 수 있습니다. 출력 객체 인 경우 달리 명시되지 않는 한 지원 중단 버전보다 낮은 요청 버전으로 만 반환합니다. 이것이 어떻게 작동하는지에 대한 예제는 아래의 Object Deprecation Example을 보라. 지원되는 가장 낮은 버전 (아래 참조)보다 이전 버전이 더 이상 사용되지 않으면 더 이상 작동하지 않습니다.
6 개월마다 가장 낮은 지원 버전을 늘립니다. 지원되는 최저 버전은 18 개월입니다. eBay의 버전 지원 일정을 참조하십시오.
eBay의 버전 지원 일정.
매년 2 월과 8 월에 eBay는 지원되는 가장 낮은 스키마 버전을 증가시킵니다.
아래 표에는 eBay의 스키마 버전 지원 일정이 나와 있습니다. 굵게 표시된 행은 현재 지원되는 가장 낮은 버전을 나타냅니다. 회색 텍스트 행은 아직 게시되지 않은 이후 버전 또는 더 이상 지원되지 않는 이전 버전을 나타냅니다.
버전 지원 일정 (예상)
다음은 표를 해석하는 방법의 예입니다.
2015 년 8 월 기준 최저 지원 버전은 837이며 2015 년 8 월에는 지원되는 최저 버전을 863으로 증분합니다. 2015 년 8 월 이전의 861 버전으로 업그레이드하면 2015 년 8 월까지 861을 사용할 수 있습니다. 지원되는 버전은 863으로 이동).
이 일정이 귀하에게 미치는 영향은 다음과 같습니다.
응용 프로그램이 지원되는 가장 낮은 버전보다 낮은 버전을 사용하는 경우 지원되는 버전을 사용하도록 소프트웨어를 업그레이드해야합니다. 사용 가능한 최신 버전 중 하나를 사용하는 것이 좋습니다. 새 응용 프로그램을 만드는 경우 사용 가능한 최신 버전을 사용해야합니다.
중요 : 스키마 버전이 더 이상 지원되지 않으면 해당 버전 (또는 그 이전 버전)으로 비추천 된 개체는 요청 버전과 상관없이 지원되지 않습니다.
호환성에 영향을주는 스키마 변경.
eBay는 세 가지 기본 종류의 스키마 변경을 수행합니다.
새로운 객체를 추가합니다. 우리는 기존 객체를 사용하지 않습니다. 기존 개체를 대체하거나 개체 유형을 변경합니다.
대부분의 경우 이러한 변경 사항은 새로운 스키마로 업그레이드 할 때까지 응용 프로그램에 영향을 미치지 않습니다. 효과는 응용 프로그램이 변경된 기능을 사용하는지 여부와 사용중인 스키마의 버전에 따라 달라질 수 있습니다.
우리는 스키마 문서, 릴리스 노트, eBay 개발자 프로그램 블로그, 사이트 상태 및 기타 메커니즘을 통해 스키마 변경 사항을 알려주도록 최선을 다하고 있습니다.
새 객체 추가.
스키마의 언제나 어떤 단계에서나 새로운 객체를 도입 할 수 있습니다.
일반적으로 요청 버전은 별도로 명시하지 않는 한 새로운 요소 나 호출 기능을 제어하지 않습니다. 예를 들어, 새 출력 요소는 일반적으로 모든 요청 버전에 대해 반환됩니다. 우리는 xs : any 요소를 각 유형의 끝에 추가하여 이러한 개방성을 표현합니다. 정책에 따라 xs : any 요소 앞에 유형의 끝에 요소를 추가하려고합니다. 이는 정책에 불과하며 보증은 아닙니다.
그러나 요청 버전은 응답에 새로운 코드 유형 값 (열거 형)을 반환할지 여부를 제어합니다. 소프트웨어가 이미 코드 유형 인 요소를 사용하고 있다면 소프트웨어가 아직 인식하지 못하는 새로운 값을 처리 할 수있는 안전한 방법이 필요합니다. 따라서 요청 버전을 확인한 다음 Google의 응답에서 새로운 코드 유형 값을 인식 할 수있는 기본값 (CustomCode)으로 매핑합니다. 코드 유형에 대한 자세한 내용은 API 스키마 개요를 참조하십시오.
이전 버전과의 호환성 :
스키마에 추가하는 추가 요소를 처리하거나 정상적으로 무시할 수 있도록 소프트웨어를 설계해야합니다. 예를 들어 언제든지 API 호출은 사용중인 스키마 버전에서 선언 된 요소 외에 새로운 요소를 반환 할 수 있습니다. 소프트웨어는 또한 현재 요청 버전보다 새로운 버전의 코드 유형에 추가 한 값에 대해 "CustomCode"(따옴표 제외)를보고 처리 할 준비가되어 있어야합니다.
기존 객체의 사용 중단.
이전에 언급했듯이, 비추천 객체는 더 이상 권장하지 않는 객체입니다 (여전히 지원하지만). 우리는 객체를 비추천하지 않기 위해 최선을 다하지만 때로는 비즈니스, 법적 또는 기능적 문제로 인해 객체를 비추천 할 필요가 있습니다. 이 비추천이 발생했을 때의 스키마 버전은 객체의 비추천 버전입니다.
다음은 API에서 일어나는 일입니다.
우리가 객체를 비추천하면 동시에 스키마에서 객체를 삭제합니다. (애플리케이션이 이미 객체를 사용하고 있다면 더 이상 지원되지 않는 버전으로 업그레이드하기 전까지는 영향을받지 않아야합니다.) 지원되는 가장 낮은 스키마 버전을 증가시킬 때 더 낮은 버전에서 사용되지 않는 모든 객체에 대한 지원이 중단됩니다. eBay의 버전 지원 일정을 참조하십시오.
기대할 수있는 행동은 다음과 같습니다.
좋은 코딩 방법을 사용하는 한 새로 삭제 한 객체의 영향을받지 않아야합니다. 예를 들어 응답의 "20 번째 요소"에 대한 검사를 하드 코딩해서는 안됩니다. 이전 버전과의 호환성을 위해 비추천 객체 사용 방법은 객체가 요청 (입력)인지 응답 (출력)인지에 따라 다릅니다. 아래 표의 정책은 지원 중단 버전과 요청 버전이 모두 지원됩니다 (지원되는 가장 낮은 버전보다 큼).
다이어그램을 포함한 구체적인 예는 Object Deprecation Example을 참조하십시오.
호출을 테스트 할 때 WarningLevel을 High로 설정하여 요청에서 더 이상 사용되지 않는 객체를 사용하고 있는지 여부를 식별 할 수 있습니다.
교체 및 유형 변경.
때로는 기존 객체를 다른 유형으로 효과적으로 변경하거나 객체를 바꾸거나 이름을 바꿀 필요가 있습니다. 객체를 직접 바꾸는 대신 위에 설명 된 추가 및 비추천 접근법을 사용합니다. 즉, 우리는 다른 이름을 가진 새로운 객체를 추가하고 이전 객체를 사용하지 않습니다.
이전 버전과의 호환성 :
새로운 객체를 다른 새로운 객체처럼 취급하십시오. 요청 버전과 상관없이 사용할 수 있습니다 (별도로 명시하지 않는 한). 위의 새 객체 추가를 참조하십시오. 이전 객체를 다른 비추천 객체처럼 취급하십시오. 위의 기존 객체 사용 중단을 참조하십시오.
오래된 객체에 의존하는 클라이언트 소프트웨어는 가능한 한 빨리 새 객체를 사용 (또는 예상)해야합니다. 이전 개체가 현재의 eBay 사이트 논리와 일치하지 않는 기능을 반영하는 경우 특히 중요합니다. 그렇지 않으면 응용 프로그램의 사용자에게 예기치 않은 (또는 바람직하지 않은) 동작이 나타날 수 있습니다.
경우에 따라 기존 개체의 동작을 바꾸지 않고 변경할 수 있습니다. 예제에 대한 호환성에 영향을주는 논리적 변경 사항을 참조하십시오. 다시 한 번 이러한 종류의 변화를 최소화하기 위해 최선을 다하고 있습니다.
Object Deprecation Example.
eBay가 새로운 "맛"기능을 제공한다고 가정 해 보자. 그러면 나중에 역 호환되지 않는 방식으로 기능이 향상됩니다.
이 경우 스키마와 객체의 사용이 어떻게 바뀔 수 있습니다 :
호환성에 영향을주는 논리적 변경.
호환되지 않는 변경은 논리적이거나 기능적 일 수 있습니다. 반드시 스키마 자체로 변경되는 것은 아닙니다. deprecated 객체와 마찬가지로 우리는 가능할 때마다 버전에 따라 이러한 종류의 변경을 구현합니다.
예를 들어, 호출이 ManyDetails라는 노드를 반환한다고 가정합니다.
버전 483에서는 항상 ManyDetails를 반환합니다. 버전 503에서는 요청에 새로운 IncludeManyDetails 필드를 추가하고 기본값을 false로 설정하여 ManyDetails가 특별히 요청할 때만 반환합니다.
이 예에서 ManyDetails를 비추천으로 사용하거나 스키마를 변경하는 것은 아니지만이 변경으로 인해 ManyDetails를 특별히 찾은 응용 프로그램이 중단되고 기본적으로 반환 될 것으로 예상됩니다. 따라서 요청 버전 503 이상을 지정하는 클라이언트 만 새로운 동작을 볼 수 있도록이 변경을 구현합니다.
요청 버전에 따라 다르게 동작하는 오브젝트 요약에 대해서는 버전 종속적 인 논리 변경 사항 테이블을 참조하십시오.
호환되는 응용 프로그램 검사를위한 스키마 버전 및 요구 사항
호환 가능한 응용 프로그램 검사에 대한 eBay의 요구 사항을 준수하려면 새 응용 프로그램은 호환 가능한 응용 프로그램 검사시 프로덕션 환경에서 사용할 수있는 최신 버전을 사용해야합니다.
예를 들어 응용 프로그램에 버전 525의 호환 응용 프로그램 검사가 있다고 가정합니다. 버전 555가 프로덕션 환경에서 사용 가능한 최신 버전 인 경우 버전 525 이상을 사용할 수 있습니다.
다른 한편, 호환 가능한 응용 프로그램 검사에 대한 새 요청을 제출한다고 가정합니다. 버전 555가 프로덕션 환경에서 사용 가능한 최신 버전이면 최신 버전 (이 예제에서는 555)을 사용해야합니다.
지원되는 가장 낮은 버전을 주기적으로 증가시킵니다. 이러한 변경 사항으로 인해 응용 프로그램이 어떻게 영향을 받는지 이해하십시오 (eBay의 버전 지원 일정 참조). 사용중인 버전에 대한 지원을 중단하기 전에 최신 버전을 사용하도록 응용 프로그램을 조정할 계획을 세웁니다. (최신 버전으로 업그레이드하는 경우에만 응용 프로그램의 호환 가능한 응용 프로그램 검사를 다시 수행 할 필요는 없습니다.)
새 버전을 지원하도록 응용 프로그램 업그레이드.
높은 수준에서 애플리케이션을 새로운 버전의 스키마로 업그레이드 할 때이 프로세스를 따르는 것이 좋습니다.
응용 프로그램이 잘못된 개체 나 기능을 사용하지 않는지 확인하십시오. 예 : 각 호출에 대해 업그레이드 할 버전에 대해 더 이상 사용되지 않는 개체에 대한 종속성을 제거합니다. 각 통화에 대해 요청에 적용 가능한 올바른 필드 만 포함되어 있는지 확인하십시오. 예를 들어, AddItem 호출에서 유효한 특정 필드는 ReviseItem 호출에서 유효하지 않을 수 있습니다. 샌드 박스를 사용하여 응용 프로그램의 새 버전과의 호환성을 테스트하십시오. 모든 요청이 경고 또는 오류를 트리거하지 않도록하십시오. WarningLevel을 High로 설정하여 스키마 경고가 반환되지 않도록하십시오.
호환성 수준이란 무엇입니까?
포럼, 기술 자료 기사, 오래된 문서 및 기타 리소스에서 "요청 버전"대신 "호환성 수준"이라는 오래된 용어를 사용하는 사람들이 있습니다. 이 용어는 XML 요청의 경우 X-EBAY-API-COMPATIBILITY-LEVEL 헤더에도 사용됩니다. 이것은 단순히 요청 버전의 이전 이름입니다.
저작권 및 사본; 2005 년 & 2015 년 이베이, Inc. 모든 권리 보유. 이 문서 및 API는 eBay 개발자 프로그램 및 API 라이센스 계약에 따라 사용해야합니다.

XML 버전 전략
App Store를 통해 가져 오기 우리의 응용 프로그램 에서이 게시물을 읽으십시오!
API 버전 관리 모범 사례? [닫은]
웹 서비스 REST API 버전 관리를위한 알려진 방법 또는 모범 사례가 있습니까?
나는 AWS가 엔드 포인트의 URL에 의한 버전 관리를한다는 것을 알았다. 이것이 유일한 방법입니까 아니면 같은 목표를 성취 할 수있는 다른 방법이 있습니까? 여러 가지 방법이 있다면 각 방법의 장점은 무엇입니까?
templatetypedef, amon, George Stocker & # 9830;에 의해 주로 의견 기반으로 마감되었습니다. 3 월 6 일 14시 13 분 22 초
많은 좋은 질문은 전문가의 경험을 토대로 어느 정도 의견을 제시하지만, 이 질문에 대한 답변은 사실, 참고 문헌 또는 특정 전문 지식보다는 의견에 거의 근거를 두는 경향이 있습니다. 이 질문을 도움말 센터의 규칙에 맞게 수정하려면 질문을 수정하십시오.
animuson 님에 의해 잠김 & # 9830; 3 월 8 일 16시 3시 40 분.
이 질문은 역사적인 의미가 있기 때문에 존재하지만이 사이트에 대한 주제에 관한 좋은 질문으로 간주되지 않으므로 여기에서 비슷한 질문을 할 수있는 증거로 사용하지 마십시오. 이 질문과 답변은 고정되어 있으며 변경할 수 없습니다. 추가 정보 : 도움말 센터.
이것은 좋고 까다로운 질문입니다. URI 디자인의 주제는 동시에 REST API의 가장 중요한 부분이며, 따라서 해당 API 사용자에 대한 잠재적 인 장기적 약속입니다.
응용 프로그램의 진화와 그보다 낮은 수준의 API는 삶의 사실이며 프로그래밍 언어와 같이 겉보기에는 복잡한 제품의 발전과 유사하기 때문에 URI 디자인은 자연적인 제약이 적어야하며 보존해야합니다. 시간이 지남에. 응용 프로그램과 API의 수명이 길어질수록 응용 프로그램과 API의 사용자에 대한 책임이 커집니다.
반면에, 또 다른 삶의 사실은 API를 통해 소비 될 모든 자원과 측면을 예측하기 어렵다는 것입니다. 다행히 Apocalypse까지 사용할 전체 API를 설계 할 필요는 없습니다. 모든 자원 및 자원 인스턴스의 모든 자원 끝점과 주소 체계를 올바르게 정의하면 충분합니다.
시간이 지남에 따라 각 특정 리소스에 새로운 리소스와 새로운 특성을 추가해야 할 수도 있습니다. 하지만 API 사용자가 특정 리소스에 액세스하기 위해 따르는 방법은 리소스 주소 지정 체계가 공개되고 최종적으로 변경되지 않아야합니다.
이 방법은 HTTP verb 의미론 (예 : PUT은 항상 업데이트 / 대체해야 함) 및 이전 API 버전에서 지원되는 HTTP 상태 코드에 적용됩니다 (사용자 개입없이 작업 한 API 클라이언트가 계속 작동 할 수 있어야 함). 그런 식으로).
또한 API 버전을 URI에 포함 시키면 시간이 지남에 따라 변할 리소스 주소 / URI가 있으므로 응용 프로그램 상태 엔진 (Roy T. Fieldings PhD 논문에서 언급 한)의 하이퍼 미디어 개념이 중단되므로 API 버전은 API 사용자가 의존 할 수있는 리소스 URI가 퍼머 링크가되어야 함을 의미하는 오랜 시간 동안 리소스 URI에 보관되어서는 안됩니다.
물론 기본 URI에 API 버전을 포함 할 수는 있지만 새 API 버전에서 작동하는 API 클라이언트를 디버깅하는 것과 같이 합리적이고 제한된 용도로만 사용할 수 있습니다. 이러한 버전이있는 API는 시간 제한적이어야하며 폐쇄 된 베타와 같이 제한된 API 사용자 그룹 만 사용할 수 있습니다. 그렇지 않으면, 당신은 당신이하지 말아야 할 곳을 저 지르게됩니다.
만료 날짜가있는 API 버전 유지에 관한 몇 가지 생각. 웹 서비스 (Java, PHP, Perl, Rails 등)를 구현하는 데 일반적으로 사용되는 모든 프로그래밍 플랫폼 / 언어는 웹 서비스 끝점을 기본 URI에 쉽게 바인딩 할 수 있도록합니다. 이렇게하면 여러 API 버전간에 파일 / 클래스 / 메소드 모음을 쉽게 수집하고 보관할 수 있습니다.
API 사용자 인 POV에서 특정 API 버전으로 작업하고 바인딩하는 것이 더 쉬울뿐만 아니라 제한된 시간 동안 (즉 개발 중에) 분명합니다.
API 관리자의 POV에서, (소스 코드) 버전 관리의 가장 작은 단위로 주로 파일에서 작동하는 소스 제어 시스템을 사용하여 다른 API 버전을 병렬로 유지하는 것이 더 쉽습니다.
그러나 API 버전이 URI에 명확하게 표시되어 있으면주의해야합니다. URI 기록에서 API 기록이 가시적으로 보이고 aparent가되므로 REST의 지침에 위배되는 시간이 지남에 따라 변경되기 쉽습니다. 나는 동의한다!
이러한 합리적인 반대를 피하는 방법은 버전없는 API 기본 URI로 최신 API 버전을 구현하는 것입니다. 이 경우 API 클라이언트 개발자는 다음 중 하나를 선택할 수 있습니다.
최신 API에 맞서 개발하십시오 (잘못 설계된 API 클라이언트를 깨뜨릴 수있는 API 변경을 막기 위해 응용 프로그램을 유지 관리해야 함).
제한된 시간 동안 만 API의 특정 버전에 바인딩됩니다 (명백 해짐).
예를 들어 API v3.0이 최신 API 버전 인 경우 다음 2 개는 별칭이어야합니다 (즉 모든 API 요청과 동일하게 작동해야 함).
또한 이전 API를 가리키는 API 클라이언트는 사용중인 API 버전이 더 이상 지원되지 않거나 더 이상 지원되지 않는 경우 최신 API 버전을 사용하도록 알려야합니다. 따라서 다음과 같은 쓸모없는 URI에 액세스하십시오.
Location URI 헤더와 함께 사용되는 리디렉션을 나타내는 30x HTTP 상태 코드 중 하나를 반환해야합니다. 이 상태 코드는 리소스 URI의 해당 버전으로 리디렉션됩니다.
API 버전 관리 시나리오에 적합한 리디렉션 HTTP 상태 코드가 두 개 이상 있습니다.
301 요청 된 URI를 가진 자원이 다른 URI (API 버전 정보가없는 자원 인스턴스 퍼머 링크이어야 함)로 영구적으로 이동되었음을 나타내는 영구적으로 이동되었습니다. 이 상태 코드는 버전이 지정된 리소스 URI가 리소스 퍼머 링크로 대체되었음을 API 클라이언트에 알리지 않고 더 이상 지원되지 않는 API 버전을 나타내는 데 사용할 수 있습니다.
302 요청한 리소스가 일시적으로 다른 위치에 있지만 요청한 URI가 계속 지원 될 수 있음을 나타내는 Found입니다. 이 상태 코드는 버전없는 URI를 일시적으로 사용할 수없고 리디렉션 주소 (예 : APi 버전이 포함 된 URI를 가리키는 등)를 사용하여 요청을 반복해야하며 클라이언트가 계속 사용하도록 알리고 싶을 때 유용합니다 (예 : permalinks).
URL에 버전이 없어야합니다. 이 버전은 요청한 리소스의 "아이디어"와 아무런 관련이 없습니다. URL을 원하는 개념에 대한 경로로 생각해야합니다. 즉, 항목을 어떻게 반환 할 것인지를 결정하는 것이 아닙니다. 버전은 객체의 개념이 아니라 객체의 표현을 나타냅니다. 다른 포스터가 말했듯이 요청 헤더에 형식 (버전 포함)을 지정해야합니다.
버전이있는 URL에 대한 전체 HTTP 요청을 살펴보면 다음과 같습니다.
헤더에는 요청한 표현이 들어있는 행이 있습니다 ( "Accept : application / xml"). 바로 그 버전이 있어야합니다. 모두는 당신이 다른 형식으로 동일한 것을 원하고 클라이언트가 원하는 것을 요구할 수 있어야한다는 사실에 대해 광택을주는 것처럼 보입니다. 위의 예에서 클라이언트는 리소스의 XML 표현을 요구합니다. 실제로 원하는 표현을 나타내는 것은 아닙니다. 서버는 이론적으로 XML 인 경우 요청과 관련이없는 무언가를 반환 할 수 있으며 잘못되었다는 것을 파싱해야합니다.
더 좋은 방법은 다음과 같습니다.
더 나아가, 클라이언트가 XML이 너무 장황하다고 생각하고 대신 JSON을 원한다고 가정 해 봅시다. 다른 예제에서는 동일한 고객에 대한 새 URL을 가져야하므로 다음과 같이 끝납니다.
(또는 비슷한). 실제로 모든 HTTP 요청에는 원하는 형식이 포함됩니다.
이 방법을 사용하면 훨씬 더 자유롭게 디자인 할 수 있으며 실제로 REST의 원래 아이디어를 고수하고 있습니다. 클라이언트를 방해하지 않고 버전을 변경하거나 API가 변경되면 점진적으로 클라이언트를 변경할 수 있습니다. 표현 지원을 중지하도록 선택한 경우 HTTP 상태 코드 또는 사용자 정의 코드로 요청에 응답 할 수 있습니다. 클라이언트는 응답이 올바른 형식인지 확인하고 XML의 유효성을 검사 할 수도 있습니다.
URL에 버전을 넣는 것이 나쁜 방법을 보여주는 마지막 예가 하나 있습니다. 오브젝트 내부에 정보를 원한다고 말하면서 다양한 오브젝트를 버전 관리했다 (고객은 v3.0, 주문은 v2.0, shipto 오브젝트는 v4.2). 다음은 클라이언트에서 제공해야하는 불쾌한 URL입니다.
우리는 버전을 URL에 넣는 것이 실용적이고 유용하다는 것을 알았습니다. 그것은 당신이 한 눈에 사용하고있는 것을 쉽게 알려줍니다. 허용 된 답변에서 제안하는 바와 같이 / foo / (가장 최신 버전)의 별칭 / foo를 사용 용이성, 더 짧고 / 깨끗한 URL 등을 위해 수행합니다.
하위 호환성을 영원히 유지하는 것은 종종 비용이 많이 들거나 매우 어렵습니다. 더 이상 지원 중단 될 것이라는 점, 여기에 제안 된 것과 같은 리디렉션, 문서 및 기타 메커니즘을 사전에 알리는 것이 좋습니다.
리소스 표현의 버전 관리가 REST 접근법을 따르는 것이 더 낫다는 것에 동의합니다. 하지만 사용자 정의 MIME 유형 (또는 버전 매개 변수를 추가하는 MIME 유형)의 큰 문제점 중 하나는 HTML 및 JavaScript의 Accept 및 Content-Type 헤더에 쓸 수없는 지원입니다.
예를 들어 리소스를 만들려면 HTML5 양식에 다음 헤더를 사용하여 POST 할 수 없습니다.
이것은 HTML5 enctype 속성이 열거 형이므로 일반적인 application / x-www-formurlencoded, multipart / form-data 및 text / plain 이외의 다른 것은 유효하지 않기 때문입니다.
. HTML4에있는 모든 브라우저에서 지원되는지 확신 할 수 없습니다 (좀 더 느슨한 encytpe 속성을 갖지만 MIME 유형이 전달되었는지 여부에 대한 브라우저 구현 문제 일 것입니다)
이 때문에 나는 URI를 통해 버전을 만드는 가장 적절한 방법이 있다고 생각하지만 올바른 방법이 아니라고 생각합니다.
귀하의 버전을 URI에 넣으십시오. 한 버전의 API가 다른 유형의 API를 항상 지원하지는 않기 때문에 리소스가 한 버전에서 다른 버전으로 마이그레이션된다는 논쟁은 단순한 잘못된 것입니다. XML에서 JSON으로 형식을 전환하는 것과 같지 않습니다. 유형이 존재하지 않거나 의미 적으로 변경되었을 수 있습니다.
버전은 리소스 주소의 일부입니다. 하나의 API에서 다른 API로 라우팅합니다. 헤더에서 주소 지정을 숨기려면 RESTful이 아닙니다.
REST API에서 버전 관리를 할 수있는 몇 가지 장소가 있습니다.
언급 한 바와 같이, URI에서. 리다이렉트 (redirect) 등이 잘 사용된다면 이는 다루기 쉽고 심미적으로 즐겁다.
Accepts : 헤더에서 버전이 파일 유형에 있도록합니다. 'mp3'vs 'mp4'처럼. 이것은 IMO가 다소 덜 능숙하게 작동하지만 작동합니다.
자원 그 자체. 많은 파일 형식에는 일반적으로 헤더에 버전 번호가 포함되어 있습니다. 이것은 새로운 소프트웨어가 파일 형식의 모든 기존 버전을 이해함으로써 '정당한 작업'을 할 수있게하며, 구 버전의 소프트웨어가 지원되지 않는 (최신) 버전이 지정된 경우 펀트 할 수 있습니다. REST API의 컨텍스트에서 URI가 변경 될 필요가 없으며 전달 된 데이터의 특정 버전에 대한 응답 만 의미합니다.
세 가지 접근법을 모두 사용해야하는 이유를 알 수 있습니다.
'깨끗한 스윕 (clean sweep)'새로운 API를 원한다면, 또는 그러한 접근 방식을 원할 경우 주요 버전을 변경하십시오. 클라이언트가 PUT / POST를 수행하기 전에 클라이언트가 알 수 있도록하려면 작동 여부를 결정해야합니다. 클라이언트가 PUT / POST를 수행하여 작동 여부를 확인해야한다면 괜찮습니다.
REST API의 버전 관리는 다른 API의 버전 관리와 유사합니다. 사소한 변경 작업을 수행 할 수 있으며 주요 변경 사항에는 완전히 새로운 API가 필요할 수 있습니다. 가장 쉬운 방법은 매번 처음부터 시작하는 것입니다. URL에 버전을 넣는 것이 가장 적합합니다. 클라이언트의 삶을 편하게하려면 역 호환성을 유지하려고 노력합니다. 영구적 인 리디렉션, 영구적 인 리디렉션, 여러 버전의 리소스 등을 통해 수행 할 수 있습니다. 이는 더 까다 롭고 많은 노력이 필요합니다. 그러나 REST가 "멋진 URI는 변경되지 않습니다"에서 권장하는 사항이기도합니다.
결국 다른 API 디자인과 같습니다. 고객의 편의를 위해 노력하십시오. API에 대한 의미있는 버전 관리를 채택하는 것이 좋습니다. 그러면 클라이언트가 새 버전과의 하위 호환성 방법을 명확하게 알 수 있습니다.

시스템 설계에 대한 XML 스키마 버전 관리의 영향.
(시스템 진화 촉진 전략)
소개.
새로운 버전의 XML 스키마를 생성하면 시스템의 많은 부분에서 파급되는 효과가있을 수 있습니다. 이러한 효과를 관리하는 것은 많은 비용이 듭니다. 따라서 새로운 버전의 스키마가 초래하는 값 비싼 파급 효과를 완화 할 수있는 방법을 검토하는 것이 좋습니다.
종종 스키마 버전 관리는 나머지 시스템과 분리되어 고려됩니다. 그러나 스키마 변경은 시스템의 다른 부분에 영향을 줄 수 있으므로 Schema 버전 관리가 통합 시스템 개발 계획의 일부가 될 것을 권장합니다. 스키마 버전 관리는 시스템 진화의 원동력 중 하나입니다.
시스템 진화를 촉진하기위한 전략으로 시스템의 세 부분 인 스키마, 인스턴스 문서 및 응용 프로그램에 중점을 둡니다. 전체 론적 방식으로이 세 부분을 처리하기 위해 다음 권장 사항을 작성합니다.
스키마 설계 권장 사항 :
인스턴스 문서 디자인 권장 사항 :
응용 프로그램 설계 권장 사항 :
이 권고의 각각에 대한 이론적 근거는이 백서의 과정에서 설명된다. 그러나 먼저 대상 시스템의 특성을 정의하는 것으로 시작합니다.
시스템.
문제 설명.
인스턴스 문서 및 응용 프로그램에 영향을 미치는 스키마 변경 범주
참고 : 위에 나열된 것보다 XML 스키마에서 발생할 수있는 많은 다른 종류의 변경 사항이 있습니다. 그러나 스키마 내에서 변경되고 인스턴스 문서에는 명시되지 않습니다.
아래에서는 이러한 변경 사항의 영향을 완화하는 방법에 대해 설명합니다.
1. 이름 공간 인식 응용 프로그램.
대부분의 XML 응용 프로그램은 "네임 스페이스를 인식합니다". 즉, 응용 프로그램은 특정 네임 스페이스에 속한 요소를 처리하도록 설계되었습니다.
예를 들어, XSLT (XML Stylesheet Language Transformations) 프로세서는 XSLT 네임 스페이스를 이해하는 응용 프로그램입니다. 구체적으로 말하면 XSLT 프로세서 (응용 프로그램)는 & lt; 템플릿>, , 등의 요소가 포함될 수 있습니다. 요소가 XSLT 네임 스페이스와 연결되어 있어야합니다.
네임 스페이스를 변경하면 네임 스페이스 인식 응용 프로그램이 손상됩니다. 이것은 우리의 첫 번째 권고안을 제시합니다 :
권장 사항 1 : XML 스키마의 새로운 버전마다 네임 스페이스 인식 응용 프로그램을 손상시키지 않으려면 모든 버전에 동일한 네임 스페이스를 사용하십시오.
2. 새 버전의 스키마를 새 위치에 배치하여 이전 인스턴스 문서를 손상시키지 않습니다.
XML Schema의 새로운 버젼이 생성되었다고 (위에서 설명한 것과 같은 네임 스페이스를 사용) 가정하십시오. 그리고 새 버전은 단순히 이전 버전을 덮어 씁니다. 즉, 새 버전의 파일 이름은 이전 스키마와 동일한 URL 위치입니다. 변경 내용의 종류에 따라 이전 스키마에 맞게 작성된 모든 인스턴스 문서가 손상 될 수 있습니다.
권장 사항 2 : 이전 인스턴스 문서가 손상되지 않도록하려면 새 스키마 버전에 다른 파일 이름이나 다른 URL 위치 또는 둘 다를 제공하십시오.
3. 요소의 콘텐츠 모델 변경 처리.
XML 스키마의 새 버전을 만들 때 일반적으로 발생하는 것은 요소의 내용을 변경하는 것입니다. (기술 표현은 "요소의 콘텐츠 모델 변경"입니다.)
예를 들어, 버전 1 스키마에서 요소는 & lt; lat> 및 으로 구성되도록 선언되었을 수 있지만 버전 2에서는 그 내용이 & lt; x> 및 일 수 있습니다.
응용 프로그램이 최신 버전의 스키마를 준수하는 인스턴스 문서를 수신한다고 가정합니다. 그리고 응용 프로그램이 여전히 이전 버전의 스키마로 코딩되었다고 가정 해 봅시다. 애플리케이션은 인스턴스 문서를 파싱하고 & lt; location> 요소에 도착합니다. 애플리케이션이 위치의 콘텐츠 모델이 변경되었음을 어떻게 인식합니까?
애플리케이션이 파서를 참조 할 수 있다면 유용 할 것입니다 : "의 유형 (콘텐츠 모델)은 무엇입니까?" 유형이 기대하는 유형이 아닌 경우 애플리케이션은 진행 방법을 결정해야합니다.
요소 유형을 인식 할 때 응용 프로그램을 어떻게 용이하게 할 수 있습니까? 즉, 응용 프로그램이 마주 치는 각 요소의 유형을 어떻게 결정할 수 있습니까? 답변 : 명시 적 유형 정보를 제공하도록 XML 스키마를 설계해야합니다.
권장 사항 3 : 요소의 내용이 변경되었음을 인식하여 응용 프로그램을 용이하게하려면 익명 형식을 사용하지 마십시오. 대신, 명명 된 유형을 사용하십시오.
예. 다음과 같이 스키마를 디자인하지 마십시오.
위치 유형은 무엇입니까? 답변 : 익명입니다. 이 스키마는 형식 정보를 얻을 때 응용 프로그램을 용이하게하기 위해 설계되지 않았습니다.
대신 스키마를 다음과 같이 디자인하십시오. 위치 유형이란 무엇입니까? 답변 : 명명 된 유형 인 locationType-x_y_version. 따라서이 스키마는 형식 정보를 얻을 때 응용 프로그램을 용이하게하기 위해 설계되었습니다.
스키마 설계자가 권장 사항 3을 따르고 항상 명명 된 유형을 사용한다고 가정합니다. 이렇게하면 응용 프로그램에서 파서에 유형 정보를 쿼리 할 수 ​​있습니다 (예 : "위치 유형>은 무엇입니까?"). 파서는 "type is locationType-x_y_version"이라고 응답합니다. 이것이 애플리케이션이 기대하지 않은 타입 (즉, 이해를 위해 코딩되지 않은 타입)이라면, 상기 한 바와 같이 적절한 단계를 취할 것이다.
& lt; location> 예제를 계속하겠습니다. 위에서 우리는 명명 된 유형을 사용하려는 동기를 보았습니다. 응용 프로그램이 요소의 내용 모델을 쉽게 찾을 수 있습니다. 물론 새로운 버전의 스키마가 생성되고 & lt; location>의 유형이 변경되었지만 새로운 유형이 이전 유형과 동일한 이름으로 주어지면 유형 정보의 전체 목적을 상실합니다. 이는 다음 권장 사항으로 연결됩니다.
권장 사항 4 : 스키마의 새 버전을 만들 때 유형을 변경하면 유형에 다른 이름을 지정하십시오.
예. 버전 1 스키마 & lt; location>에 & lt; lat> 및 & lt; lon>이있는 것으로 가정합니다. 스키마는이 명명 된 형식을 선언합니다.
이제, 버전 2의 스키마에서 & lt; location & gt;의 내용이 & lt; x & gt; 및 & lt; y & gt;로 변경된다고 가정하십시오. 위치 유형에 새 이름을 지정하는 것이 중요합니다.
따라서, 버전 1 애플리케이션이 버전 2 인스턴스 문서를 수신하면 & lt; location> 요소를 분석 할 때 & lt; location>의 콘텐츠 모델이 변경되었음을 쉽게 인식 할 수 있습니다 ( locationType을 locationType-x_y_version으로 변경).
3.b 유형 변경 지역화.
& lt; location & gt; 요소가 & lt; aircraft & gt; 요소 내에 중첩되어 있다고 가정합니다 (예 :
기술적으로 의 내용이 변경된 이후 & lt; 항공기>의 콘텐츠가 변경되었습니다. & lt; 항공기>의 유형 이름을 변경해야합니까? 답변 : 아니오. 그 이유는 변화를 최소화하기 위해서입니다. 즉, 가능한 한 많은 익숙한 요소와 유형을 응용 프로그램에서 볼 수 있어야합니다. 항공기 유형은 친숙한 유형입니다. 그것은 여전히 ​​그 내용으로 요소를 가지고있다. 우리는이 친숙 함을 유지하기를 원합니다.
권장 사항 5 : 요소의 유형이 변경된 경우에만 요소 유형의 이름을 변경하십시오.
버전 속성을 사용한다.
응용 프로그램은 인스턴스 문서를 처리 할 때 변경 사항을 기대할 수 있는지 여부를 나타내는 것이 유용하다는 것을 알게됩니다. 이는 루트 요소의 version 속성을 사용하여 수행 할 수 있습니다.
이것이 XSLT의 기능입니다. XSLT 기술이 새 버전으로 마이그레이션됨에 따라 인스턴스 문서 (즉, XSLT 문서)는 루트 요소에서 버전 특성과 함께 사용중인 버전을 나타냅니다.
권장 사항 6 : 루트 요소에 버전 특성을 사용하십시오. 인스턴스 문서가 복합 문서 (XML 조각의 어셈블리) 인 경우 각 조각의 루트에 버전 특성을 배치합니다.
4. 셔플 링 요소의 효과.
스키마의 새 버전은 요소의 내용을 재정렬하는 것처럼 간단하게 변경할 수 있습니다. 예를 들어, 버전 1 스키마에서 주문은 A, B, C 일 수 있습니다 (예 :
버전 2 스키마에서, 주문은 B, C, A로 변경 될 수있다 (예 :
응용 프로그램이 특정 순서의 데이터를 예상하도록 코딩 된 경우 새 버전의 스키마는 응용 프로그램을 중단시킵니다. 이를 피하려면 응용 프로그램이 특정 데이터 순서에 의존해서는 안됩니다. 태그를 사용하여 데이터를 찾아야합니다.
권고 7 : 응용 프로그램은 태그 이름을 사용하여 인스턴스 문서의 데이터를 찾아야합니다. 응용 프로그램은 태그의 순서가 변경 될 수 있음을 예상하도록 설계되어야합니다.
5. 요소 또는 속성 제거의 효과.
XML 스키마의 새 버전을 만들면 요소 또는 특성이 제거 될 수 있습니다. 새 버전으로 업그레이드되지 않은 응용 프로그램을 고려하고 새 버전을 준수하는 인스턴스 문서를받습니다. 응용 프로그램은 요소 또는 속성의 부족이 재앙인지 또는 정보없이 살 수 있는지 여부를 결정해야합니다. 취해진 조치는 애플리케이션에 따라 다릅니다 (이 백서의 범위를 벗어납니다).
6. 요소 또는 속성 추가의 효과.
XML 스키마의 새 버전을 만들면 요소 또는 특성이 추가 될 수 있습니다. 새 버전으로 업그레이드되지 않은 응용 프로그램을 고려하고 새 버전을 준수하는 인스턴스 문서를받습니다. 응용 프로그램은 추가 정보로 수행 할 작업을 결정해야합니다. 다시 말하지만, 취해진 조치는 애플리케이션에 따라 다릅니다.
응용 프로그램이 중단 될 때 수행 할 작업.
위의 권장 사항은 스키마 변경으로 인한 손상을 완화하는 데 도움이됩니다. 그러나 응용 프로그램이 중단되지 않을 것이라고 보증하지는 않습니다. 오래된 응용 프로그램은 중요한 정보가 누락 된 새 인스턴스를 수신하거나 중요한 요소의 내용 모델이 동적으로 이해할 수없는 유형으로 변경되었을 수 있습니다.
그러한 사건을 예상하기 위해 파손이 발생했을 때 응용 프로그램이 취해야 할 조치를 지정하는 시스템 프로토콜을 마련하는 것이 좋습니다. 하나의 가능한 프로토콜은 애플리케이션이 오류 메시지와 함께 발신자에 응답하는 것입니다.
권고 8 : 애플리케이션이 다른 애플리케이션으로부터 수신 한 인스턴스 문서를 처리 할 수 ​​없을 때 사용되는 시스템 전반의 프로토콜 (예 : 오류보고 메커니즘)을 정의한다.
새 버전의 XML 스키마가 생성 될 때 기존 인스턴스 문서 및 응용 프로그램에 미치는 영향을 최소화하기 위해 다음 권장 사항을 작성합니다.
권장 사항 1 : XML 스키마의 새로운 버전마다 네임 스페이스 인식 응용 프로그램을 손상시키지 않으려면 모든 버전에 동일한 네임 스페이스를 사용하십시오.
권장 사항 2 : 이전 인스턴스 문서가 손상되지 않도록하려면 새 스키마 버전에 다른 파일 이름이나 다른 URL 위치 또는 둘 다를 제공하십시오.
권장 사항 3 : 요소의 내용이 변경되었음을 인식하여 응용 프로그램을 용이하게하려면 익명 형식을 사용하지 마십시오. 대신, 명명 된 유형을 사용하십시오.
권장 사항 4 : 스키마의 새 버전을 만들 때 유형을 변경하면 유형에 다른 이름을 지정하십시오.
권장 사항 5 : 요소의 유형이 변경된 경우에만 요소 유형의 이름을 변경하십시오.
권장 사항 6 : 루트 요소에 버전 특성을 사용하십시오. 인스턴스 문서가 복합 문서 (XML 조각의 어셈블리) 인 경우 각 조각의 루트에 버전 특성을 배치합니다.
권고 7 : 응용 프로그램은 태그 이름을 사용하여 인스턴스 문서의 데이터를 찾아야합니다. 응용 프로그램은 태그의 순서가 변경 될 수 있음을 예상하도록 설계되어야합니다.

Comments