API 요청 버전 관리

Versioning API requests | Petr Hlavicka

작성자
발행일
2025년 06월 23일

핵심 요약

  • 1 이 글은 Rails에서 API 요청을 효과적으로 버전 관리하는 방법에 대해 다룹니다.
  • 2 기존 방식의 한계를 극복하고, OpenAPI 지원, DRY 원칙 준수, 내부 구현 숨기기, 오류 매핑 지원 등의 요구사항을 충족하는 'verquest' 젬을 소개합니다.
  • 3 'verquest' 젬은 JSON Schema를 기반으로 요청 유효성 검사 및 내부 구조 매핑을 자동화하여 API 변경 관리를 용이하게 합니다.

도입

이 글은 Rails 환경에서 API 요청을 버전 관리하는 심층적인 방법을 제시합니다. 이전 글에서 동일한 컨트롤러를 사용하는 유연한 API 버전 관리 방식을 소개한 데 이어, 이번에는 요청 매개변수와 응답을 버전 관리하는 구체적인 예시와 함께 요청 버전링의 필요성을 강조합니다. 특히, API의 호환성을 유지하면서도 변화에 유연하게 대응하기 위한 방안으로 새로운 젬인 'verquest'의 개발 배경과 주요 기능에 대해 설명합니다. 기존 방식의 한계와 새로운 솔루션이 충족해야 할 요구사항들을 명확히 제시하며, 독자에게 심도 있는 이해를 돕습니다.

API 요청 버전 관리는 기존 클라이언트에 영향을 주지 않으면서 API의 파괴적 변경(예: 구조 변경, 필드 이름 변경, 필드 제거, 필수 필드 추가)을 적절히 처리하기 위해 필수적입니다. 반면, 선택적 필드 추가나 필드를 선택적으로 변경하는 경우에는 버전 업이 필요하지 않습니다.

이러한 요청 버전 관리를 위해 다음과 같은 요구사항들이 고려되어야 합니다:

  • OpenAPI 지원: API 문서화의 중요성을 강조하며, OpenAPI를 통해 API의 사용성을 높일 수 있습니다. ‘verquest’ 젬은 JSON Schema 기반의 OpenAPI 컴포넌트 생성을 지원하여 문서화의 복잡성을 줄입니다.
  • DRY (Don’t Repeat Yourself): 각 버전마다 요청 정의를 반복하지 않고, 이전 버전과의 차이점만 정의함으로써 코드 중복을 최소화해야 합니다.
  • 내부 구현 숨기기: 내부 모델 및 속성 명명 규칙과 외부 API 명명 규칙을 분리하여 API의 사용자 친화성을 높여야 합니다. ‘verquest’는 map 옵션을 통해 외부 요청 구조를 내부 구조로 매핑하는 기능을 제공합니다.
  • 내부 오류 외부 구조로 매핑: 사용자에게 오류 발생 위치를 명확히 알려주기 위해 내부 오류 메시지를 외부 API 구조에 맞게 변환하는 기능의 필요성을 언급하며, ‘verquest’에서는 향후 지원할 기능으로 계획하고 있습니다.

저자가 직접 개발한 ‘verquest’ 젬은 위에 언급된 요구사항 대부분을 충족합니다.

  • 스키마 정의: ‘verquest’는 Verquest::Base 클래스를 상속받아 스키마를 정의하며, version 블록을 통해 특정 버전의 스키마를 정의할 수 있습니다. fieldobject DSL을 사용하여 JSON Schema를 쉽게 정의할 수 있으며, map 옵션을 통해 외부/내부 구조 매핑을 지원합니다.
  • Rails에서의 사용 예시: UsersControllercreate 액션에서 UserCreateRequest.process(params, version: params[:api_version])를 사용하여 요청 파라미터를 유효성 검사하고 내부 구조로 매핑하는 방법을 보여줍니다. Verquest::InvalidParamsError를 통해 유효하지 않은 파라미터에 대한 오류 응답을 처리할 수 있습니다.
  • 파괴적 변경 처리: 새로운 필수 필드 추가와 같은 파괴적 변경 발생 시, version 블록 내에서 exclude_properties를 사용하여 이전 버전의 필드를 제외하고 새로운 버전에 맞게 재정의할 수 있습니다. ‘verquest’는 명시된 버전이 없을 경우 가장 가까운 이전 버전을 사용하는 “downgrading” 전략을 구현합니다.
  • OpenAPI 지원: component_name, to_ref, to_schema와 같은 메서드를 제공하여 rswag 젬과 같은 도구를 활용한 OpenAPI 문서 생성을 돕습니다.

결론

결론적으로, 'verquest' 젬은 Rails API 요청 버전 관리에 대한 유망한 해결책을 제시합니다. 현재 프로덕션 사용을 위한 준비가 완료된 상태는 아니지만, 성능, 복잡성 대 이점, 학습 곡선, 오류 매핑과 같은 누락된 기능 등 여러 고려 사항이 있음을 솔직하게 밝힙니다. 저자는 이 글을 통해 피드백을 받고자 하며, 사용자 경험 공유, 개선 제안, 풀 리퀘스트 등을 통해 젬의 발전에 기여할 것을 독려합니다. 이는 'verquest' 젬이 커뮤니티의 참여를 통해 더욱 견고하고 완성도 높은 솔루션으로 발전할 수 있음을 시사합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!