[Network][Web] REST API 버전 관리

2021. 9. 24. 11:22·Software Engineering
반응형

Abstract

클라우드 네이티브 애플리케이션 개발에 대해 마이크로 서비스가 핫 트렌드입니다.

마이크로 서비스의 이점 ?

  • 향상된 확장성
  • 회복 탄력적인 애플리케이션
  • 기술에 구애받지 않는 애플리케이션
  • 출시 시간 단축
  • CI/CD 지원을 통한 비즈니스 민첩성 향상

등등 다양한 이점이 있어서라고 합니다.

API 버전 관리는 언제?

마이크로 서비스 기반 아키텍처 MSA 의 핵심 구성 요소 중 하나는 'API design & contract' 임.

API 버저닝은 매우 중요하다.

클라이언트가 준비 될 때 언제든지, 기존 클라이언트가 기존 REST API 를 지속적으로 사용하게 해주고, 클라이언트 애플리케이션이 새로운 API 로 마이그레이션을 할 수 있게 한다.

버전 관리의 이점

버저닝은 API 변경 사항을 탐색하는데 도움을 준다.

  • Changes made to the request format by introducing mandatory parameters
    필수 파라미터가 추가됨에 따라 변경되는 요청 형식.
  • Changes made to the response data either due to format change or structure of the response message
    응답 메시지 형식 변경 또는 구조 변경으로 인한 응답 데이터 변경.
  • Deprecation of the API to provide the enhanced functionalities
    보다 향상된 기능 제공을 위한 기존 API 사용 중단.

API 버전화 방법

  1. URI Path(URI 경로) 를 통한 버전 지정
  2. Query Parameters(쿼리 매개변수) 를 통한 버전 지정
  3. Custom Headers(사용자 지정 헤더) 를 통한 버전 지정
  4. Content Negotiations (컨텐츠 협상) 을 통한 버전 지정

Version Through URI path

엔드포인트를 버저닝 하는데 가장 보편적인 방식입니다.

형식은 구애 받지 않습니다. 의미 있는 식별자로 사용할 수 있으므로 API 개발팀이 새로운 변경 사항을 원활하게 통합할 수 있습니다.

http://api.example.com/v1

Versioning Through Query Parameters

다음과 같이 쿼리 매개 변수로 버전을 사용하는 방식입니다.

간단하고 구현하기 쉽습니다. 명시적으로 지정하지 않으면 무조건 최신 API 버전을 기본값으로 만들 수 있습니다.

http://api.example.com/customers?version=v1

Versioning Through Custom Headers

Header 에 커스텀 헤더를 통해서 버전 관리를 하는 방식입니다.

이 방식은 URI 를 훼손하지 않고도 버전 관리를 하도록 해줍니다.

단점은 헤더를 처리하고 버전을 사용하기 위해서 헤더를 유지 보수해야 합니다.

@RestController
@RequestMapping("/")
public class ProductController {

      @Autowired
     private ProductRepository repository;

      @GetMapping(value= "products", headers = {"X-API-VERSION=v1"})
    public List<Product> findAll() {
           return repository.findAll();
     }

     @GetMapping(value= "products", headers = {"X-API-VERSION=v1"})
     public List<Product> findAllV2() {
           return repository.findAll();
     }
}

Versioning Through Content negotiations

클라이언트가 특별하게 'Accept Header' 가 있는 버전을 요청하도록 함으로서 버저닝하는 방식입니다.

특정 버전을 요청하지 않는 경우 default 구현을 제공하기 위해서 서비스를 구현해야 합니다.

Github 의 경우 이런 방식으로 구현되어 있습니다.

GET /customers/1234 HTTP/1.1 Accept: application/vnd.v1+json
@RestController
@RequestMapping("/")
public class ProductController {

     @Autowired
     private ProductRepository repository;

        // Find
        @GetMapping(value= "products", headers = {"Accept=application/vnd.v1+json"})
        List<Product> findAll() {
            return repository.findAll();
        }

        @GetMapping(value= "products", headers = {"Accept=application/vnd.v2+json"})
        List<Product> findAllV2() {
            return repository.findAll();
        }

}
  • v1 버전으로 요청한 경우 v1 응답을 받습니다.
curl -L -X GET 'http://localhost:8080/products' \ -H 'Accept: application/vnd.v1+json'
 [    
    {       
        "name": "IdeaPad Slim 5 (15, AMD)"  
    } 
]
  • v2 버전으로 요청한 경우 v2 응답을 받는다.
curl -L -X GET 'http://localhost:8080/products' \
-H 'Accept: application/vnd.v2+json'

[
    {
        "name": "IdeaPad Slim 5 (15, AMD)"
     }
]
  • Accept 헤더 없이 그냥 보낸 경우

그냥 v1 기본 값으로 버전 처리한다.

curl -L -X GET 'http://localhost:8080/products' 
 [    
    {       
        "name": "IdeaPad Slim 5 (15, AMD)"  
    } 
]

  • 406 Not Acceptable
curl -L -X GET 'http://localhost:8080/products' 
-H 'Accept: application/vnd.v3+json'

{
    "timestamp": "2021-09-13T14:30:12.263+0000",
    "status": 406,
    "error": "Not Acceptable",
    "message": "Could not find acceptable representation",
    "path": "/products"
}

Summary

API 기반 아키텍처가 진화하고 점점 더 많은 사람들이 채택하고 있는 만큼 API 버전에서는 API 변경으로 인한 중단을 최소화하고 이전 버전과의 호환성을 높이는 것이 중요하다. 위에서 언급한 각각의 버전 기술들은 각각의 장단점을 돕는다.

Refer.

https://dzone.com/articles/rest-api-versioning-strategies-1#

저작자표시 비영리 변경금지 (새창열림)

'Software Engineering' 카테고리의 다른 글

[Linux] 압축 명령어 - Zip  (0) 2021.10.09
자바(Java) 설치, 버전 및 전체 목록 파악, 선택 지정해서 사용하기  (0) 2021.09.27
[Git] cannot lock ref 오류  (0) 2021.09.23
보이는 정렬 알고리즘  (0) 2021.09.04
Book Notes in Github by mgp  (0) 2021.01.26
'Software Engineering' 카테고리의 다른 글
  • [Linux] 압축 명령어 - Zip
  • 자바(Java) 설치, 버전 및 전체 목록 파악, 선택 지정해서 사용하기
  • [Git] cannot lock ref 오류
  • 보이는 정렬 알고리즘
fogthegreat
fogthegreat
아주 오랫동안 이것 저것 개발하면서 배우고 찾아 본 것들을 적거나 모았습니다. 불편한 점이 있다면 알려주세요. (과거에 불펌한 글들을 모두 제거하고 있는 중이에요. 🙏)
  • fogthegreat
    꿈소년의 개발 이야기
    fogthegreat
  • 전체
    오늘
    어제
    • 전체보기 (242)
      • Software Engineering (56)
      • Android Development (78)
      • 일상다반사 (63)
      • 책에 대한 거의 모든 것 (11)
      • 영어공부 (1)
      • ETC (0)
      • 챌린지 (1)
      • Do it 스터디! (32)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 향로
    • 청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 …
    • WhoRU? Story...♡
    • Snapshot
    • 두잇! - 이지스퍼블리싱
    • 제이펍의 참 똑똑한 2비트 책 이야기
    • Inpa Dev
  • 공지사항

  • 인기 글

  • 태그

    gradle
    코틀린
    hcj
    kotlin
    안드로이드 개발
    js
    보안
    JavaScript
    안철수
    git
    하버드
    구글
    안드로이드
    css
    리눅스
    Eclipse
    java
    자바
    build.gradle
    OOM
    개발
    ActiveX
    노개북
    Android 4.1
    Android
    html
    탐지기법
    C++
    linux
    google
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
fogthegreat
[Network][Web] REST API 버전 관리
상단으로

티스토리툴바