다른 API 버전을 지원하는 방법


15

Rest API를 작성 중이며 다른 버전을 지원하는 가장 좋은 방법이 궁금합니다. 이것은 URI를 V2 또는 V3으로 정의하는 방법을 의미하는 것이 아니라 코드를 구성하는 방법을 의미합니다.

  • 여러 버전을 동시에 지원합니다 (예 : V1 & V2 & V3 URI는 동시에 작동해야합니다. 한 번에 지원되는 금액을 제한하기 위해 V4가 올 때 V1을 폐기합니다.
  • 코드 중복을 최대한 피하십시오
  • 다른 버전에 영향을주지 않으면 서 버전에 주요 변경 사항을 쉽게 추가 할 수 있습니다.

취할 수있는 접근법이 거의없는 것 같습니다.

  • Git을 사용하여 다른 버전의 분기 (및 이전 버전에서는 기본적으로 새로운 개발 작업이 수행되지 않은 버전)로 버전을 제어하십시오. 이는 최신 버전 만 코드에 포함되어 있기 때문에 코드 복제가 없다는 것을 의미하지만, 이전 버전은 폐기 될 때까지 새 버전의 DB를 사용해야합니다.

  • 각 버전이 동일한 응용 프로그램에서 처리되고 완전히 별도의 코드 경로가 있도록 코드를 복제하십시오. 그러나 이것은 많은 중복을 의미합니다.

  • 여러 버전에서 많은 코드를 재사용하십시오. 그러나 하나의 버전을 변경하면 이전 버전에 영향을 줄 수 있으므로 유지 관리가 어려워집니다

모든 옵션에 고유 한 문제가있는 것처럼 보이기 때문에이 문제를 처리하는 모범 사례가 있습니까?


1
URL에 버전 번호 (예 : myserver / api / 3.1.4 / user / get)를 지정하면 너무 많은 코드를 공유하지 않고 버전 별 동작을 현지화 할 수 있도록 호출하는 모든 기능에 버전 번호를 전달할 수 있습니다.
James McLeod

답변:


5

이 작업을 수행:

여러 버전에서 많은 코드를 재사용하십시오. 그러나 하나의 버전을 변경하면 이전 버전에 영향을 줄 수 있으므로 유지 관리가 어려워집니다

그러나 이전 버전을 중단하지 마십시오.

지원되는 모든 버전이 올바르게 작동하는지 확인하는 테스트가 있어야합니다. 해당 테스트가없는 경우 먼저 변경중인 코드를 포함하도록 테스트를 작성해야합니다.


2

GIT 릴리스 브랜치 (또는 각 버전을 별도의 저장소에 포크)를 사용하여 이전 API 버전을 지원 및 유지하고 공통 라이브러리와 같이 종속성으로 공유 할 수있는 재사용 가능한 코드를 갖는 조합이 가장 가능성이 높습니다 토고. 따라서 각 API 버전은 별도로 배포 가능한 아티팩트입니다. 예를 들어, API V1은 공통 V1에 의존 할 수있는 반면, API V2, V3, V4는 공통 V2에 의존 할 수있는 유연성을 허용합니다. 이것은 코드 기반이 각각의 새 버전과 곱하지 않기 때문에 개발 관점에서 가장 쉽고 깨끗합니다. 대신 모든 버전이 자체 프로젝트 / 코드 기반으로 분리되어 있으며 자체에만 관심이 있습니다.

별도의 아티팩트를 배치해야하는 또 다른 이유는 보안 메커니즘과 같은 교차 절단 문제가 있거나 최신 버전의 API에서 변경 될 수 있고 이전 API가 지원되는 경우 이전 API를 지원하는 데 많은 어려움을 초래할 수있는 종속성 주입 프레임 워크와 같은 프레임 워크 / 라이브러리가있을 수 있기 때문입니다. 모두 동일한 코드베이스 (및 런타임 인 ​​경우 Java 인 경우 클래스 로더)에 있습니다.

버전 별 브랜치 또는 모 놀리 식 복제 코드베이스에 관계없이 모든 접근 방식은 항상 변경이 필요한 공통 통합 지점 (DB 또는 분산 캐시 스키마 등)의 문제가 발생합니다. 이전 버전의 API는 이러한 변경 사항을 처리하기 위해 일종의 유지 관리가 필요하거나 호환성을 돕기 위해 데이터베이스 뷰와 같은 다른 도구를 도입해야 할 수도 있습니다. 변경의 특성에 따라 피할 수없는 어려움이있을 수 있습니다.


0

결과가 API 버전과 어떻게 다른지 모르겠지만 중간에 호환성 레이어가있어 버전 간을 전환하고 간격을 채우거나 데이터를 변환 할 수 있습니다.

즉, 일반적으로 일대일로 작동하지 않으므로 스위치 또는 상태 시스템 유형 설계 가이 문제를 해결하는 데 도움이되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.