Laravel API Versionist, API 버전 관리의 새로운 해법!

by DD
2개월 전
조회수 4

Stripe의 API 버전 관리 기법을 벤치마킹하여, Laravel API Versionist 패키지를 소개함

Transformer 클래스를 활용, 기존 API 요청 및 응답을 최신 버전으로 자동 변환하는 방식

컨트롤러 중복(Controller Duplication)버전 분기(Version Branching) 문제를 해결하여 코드 유지보수성을 향상시킴

데이터베이스(Database) 구조 변경기능적 변화(Functional Changes)에 대한 트레이드오프(Trade-offs) 및 한계점 논의

Transformer 기반 API 버전 관리의 핵심 원리

Laravel API Versionist는 Transformer 클래스(Transformer Class)를 활용하여 API 버전 호환성을 유지한다. 핵심은 `upgradeRequest()`와 `downgradeResponse()` 메서드를 통해 요청(Request)응답(Response) 데이터를 변환하는 것이다. 즉, 오래된 버전의 요청은 최신 버전으로 업그레이드되고, 최신 버전의 응답은 이전 버전으로 다운그레이드되어, 컨트롤러는 항상 최신 버전의 데이터로 동작한다. 이러한 방식은 코드 중복(Code Duplication)을 방지하고, API 변경에 유연하게 대응할 수 있도록 돕는다.

API 버전 관리의 장점과 단점

이러한 접근 방식은 API의 유지보수성(Maintainability)을 크게 향상시킨다. 새로운 API 버전을 출시할 때, 기존 컨트롤러를 수정할 필요 없이 Transformer 클래스(Transformer Class)만 업데이트하면 된다. 하지만, 기능적 변화(Functional Changes)가 발생할 경우, Transformer 내에서 복잡한 로직을 처리해야 할 수 있다. 또한, 데이터베이스(Database) 구조 변경이 동반될 경우, Transformer에서 데이터베이스 쿼리를 직접 수행해야 하는 상황이 발생할 수 있으며, 이는 아키텍처(Architecture) 복잡성을 증가시킬 수 있다.

데이터베이스(Database) 구조 변경에 대한 고려 사항

댓글에서는 데이터베이스(Database) 구조 변경과 관련된 문제점을 지적한다. 특히, 이전 API 버전에서 사용되던 데이터가 최신 버전에서 제거된 경우, Transformer에서 해당 데이터를 어떻게 처리할 것인지에 대한 고민이 필요하다. 이는 Transformer가 데이터베이스(Database) 직접 접근을 해야 하는 상황을 만들 수 있으며, 이는 데이터 격리 아키텍처(Data Isolation Architecture) 원칙에 위배될 수 있다. 따라서, API 설계 시 데이터베이스(Database) 구조 변경을 최소화하고, Transformer의 역할 범위를 명확히 정의하는 것이 중요하다.

실제 API 버전 관리 사례 및 한계점

커뮤니티에서는 Stripe의 API 버전 관리 방식에 대한 논의가 있었다. Stripe는 Transformer와 유사한 방식을 사용하여 API의 후방 호환성(Backward Compatibility)을 유지하는 것으로 알려져 있다. 하지만, 일부 사용자는 Stripe의 API가 완벽하게 후방 호환(Backward Compatible)되지 않으며, 새로운 API 버전 출시 시 기존 기능에 대한 변경이 발생한다고 지적했다. 또한, Transformer 기반의 API 버전 관리 방식은 핵심 기능(Core Functionality)의 변경에는 적합하지 않다는 의견도 제시되었다.

How Stripe supports API versions going back to 2014 without maintaining multiple codebases — and how to implement the same pattern