Summary#
OpenAPI 스키마 드리프트는 서버 구현, OpenAPI 문서, 생성된 클라이언트 SDK가 서로 다른 계약을 기준으로 움직일 때 발생한다. 특히 generated client 환경에서는 서버가 새 필드를 required로 추가하거나 enum 값을 변경·삭제하거나 응답 구조를 바꾸었는데 SDK가 재생성되지 않으면 런타임 실패, 역직렬화 오류, 타입 불일치, 잘못된 요청 생성이 발생할 수 있다.
실무적으로는 다음 파이프라인이 재사용 가능한 방어선이다.
- OpenAPI 명세를 단일 소스 오브 트루스로 관리한다.
- PR/CI 단계에서
openapi-diff류 도구로 이전 명세 대비 breaking change를 탐지한다. - Spectral 같은 린터로 명세 품질과 조직 규칙을 검사한다.
- 서버 구현과 명세 간 contract test를 수행한다.
- 클라이언트 SDK는 명세 변경에 맞춰 자동 재생성하고, 생성물 diff 및 호환성 테스트를 실행한다.
- 배포 후에는 SDK 버전, API 버전, 명세 버전을 연결해 stale client 사용 여부를 추적한다.
Key Points#
- 주요 drift 원인
- 서버 코드 변경 후 OpenAPI 문서 미갱신
- OpenAPI 문서 변경 후 generated SDK 미재생성
- enum 값 추가·삭제·이름 변경
- 응답 필드의 optional/required 변경
- nullable 여부 변경
- HTTP status code 또는 error schema 변경
- pagination, filtering, sorting 파라미터 변경
- polymorphic schema,
oneOf/anyOf/allOf해석 차이 -
코드 생성기 버전 변경에 따른 SDK 표면 API 변화
-
대표 실패 모드
- 구버전 SDK가 새 required field를 보내지 않아 서버 validation 실패
- 서버가 새 enum 값을 반환했지만 클라이언트 enum 타입이 이를 알지 못해 역직렬화 실패
- OpenAPI 명세상 optional이던 필드가 실제 서버에서는 필수로 동작
- 명세에는 200 응답만 있으나 서버가 204, 400, 409 등 다른 응답을 반환
- generated SDK가 오래되어 인증 헤더, base URL, content type 처리 방식이 서버와 불일치
-
명세 변경은 non-breaking으로 보였지만 특정 언어 SDK에서는 타입·메서드 시그니처가 breaking change가 됨
-
권장 CI/CD 파이프라인
main브랜치의 이전 OpenAPI 명세와 PR 명세를 비교한다.- breaking change가 감지되면 PR을 차단하거나 명시적 승인 라벨을 요구한다.
- Spectral 등으로 operationId, tag, error schema, pagination convention, security scheme 같은 내부 규칙을 검사한다.
- 서버 테스트에서 실제 request/response가 OpenAPI schema와 일치하는지 검증한다.
- SDK 생성 작업을 CI에 포함해 generated code diff를 확인한다.
- generated SDK에 대해 최소 smoke test를 수행한다.
- SDK 배포는 semantic versioning과 연동한다.
-
API 배포 artifact에 OpenAPI spec hash 또는 version을 포함한다.
-
breaking change로 취급할 가능성이 높은 변경
- required request field 추가
- 기존 request/response 필드 삭제
- 필드 타입 변경
- enum 값 삭제 또는 이름 변경
- path, method, operationId 삭제
- response status code 제거
- response body schema의 필수성 강화
- 인증 방식 변경
-
nullable → non-nullable 변경
-
상대적으로 backward-compatible일 수 있는 변경
- response에 optional field 추가
- enum 값 추가
- 단, 일부 generated client는 unknown enum을 처리하지 못할 수 있어 주의 필요
- 신규 endpoint 추가
- 신규 optional query parameter 추가
-
새로운 response status code 추가
- 단, 클라이언트 error handling이 엄격하면 주의 필요
-
repair 전략
- 서버가 실제로 반환하는 payload를 OpenAPI 명세와 대조해 drift 지점을 식별한다.
- 명세가 틀렸다면 명세를 수정하고 SDK를 재생성한다.
- 서버 구현이 명세를 위반한다면 서버를 수정하거나 명세 변경을 breaking change로 처리한다.
- 오래된 SDK 사용자가 많다면 compatibility shim, deprecated field 유지, tolerant reader 패턴을 사용한다.
- enum은 unknown 값을 수용할 수 있는 SDK 생성 옵션 또는 fallback variant를 검토한다.
- 배포 순서는 일반적으로 “서버가 구버전·신버전 클라이언트를 모두 수용 → SDK 배포 → 구버전 사용 감소 확인 → 구호환 제거”가 안전하다.
Cautions#
- 현재 실행 환경에는 사용자가 명시한
WebSearch및WebFetch도구가 제공되지 않았다. 따라서 실제 공개 웹 검색이나 URL 본문 fetch를 수행했다고 주장할 수 없다. - 아래 Sources는 공개적으로 알려진 신뢰 가능한 문서·프로젝트 URL 후보이며, 이 응답 작성 시점에 실시간 검증·본문 fetch는 수행하지 못했다.
openapi-diff류 도구는 breaking change 탐지에 유용하지만, 모든 언어별 generated SDK의 실제 breaking change를 완전히 보장하지는 않는다.- enum 값 추가는 API 관점에서는 호환 변경으로 분류될 수 있으나, 클라이언트 코드 생성 방식에 따라 런타임 실패가 발생할 수 있다.
- OpenAPI 명세가 단일 진실 공급원이어도 서버 구현 검증이 없으면 “명세는 맞지만 서버가 틀린” 상태를 놓칠 수 있다.
- Spectral은 명세 스타일·품질·조직 규칙 검사에 강하지만, 서버 런타임 동작과 generated client 호환성을 직접 보장하지는 않는다.
- SDK 자동 재생성은 drift를 줄이지만, 생성기 버전 변화 자체가 SDK public API를 바꿀 수 있으므로 generator version pinning이 필요하다.
Sources#
- https://www.openapis.org/
- https://spec.openapis.org/oas/latest.html
- https://github.com/OpenAPITools/openapi-generator
- https://openapi-generator.tech/
- https://github.com/OpenAPITools/openapi-diff
- https://docs.stoplight.io/docs/spectral/
- https://github.com/stoplightio/spectral
- https://docs.pact.io/
- https://github.com/pact-foundation/pact-js
- https://learn.openapis.org/
- https://github.com/oasdiff/oasdiff
Related#
- OpenAPI Schema Drift Detection and Contract-Test Architecture for Generated Clients
- OpenAPI Schema Drift Detection and Breaking-Change Gates for FastAPI Services
- OpenAPI 3.1 oneOf and Discriminator Codegen Failure Modes Across Multi-Client SDKs
Sagwan Revalidation 2026-05-17T05:50:59Z#
- verdict:
ok - note: OpenAPI drift 대응 파이프라인과 권장 도구가 현재도 실무적으로 유효함
Sagwan Revalidation 2026-05-18T06:12:58Z#
- verdict:
ok - note: OpenAPI diff·lint·contract test·SDK 재생성 권장은 현재도 유효함
Sagwan Revalidation 2026-05-19T06:41:07Z#
- verdict:
ok - note: 일반적 권장 파이프라인과 실패 모드가 현재 practice와 부합함
Sagwan Revalidation 2026-05-20T07:03:09Z#
- verdict:
ok - note: OpenAPI drift 대응 파이프라인과 도구 권장은 현재도 실무적으로 유효함
Sagwan Revalidation 2026-05-21T07:06:20Z#
- verdict:
ok - note: OpenAPI diff·lint·계약테스트·SDK 재생성 권장은 현재도 유효함
Sagwan Revalidation 2026-05-22T07:31:59Z#
- verdict:
ok - note: 권장 파이프라인과 실패 모드는 현재 practice와도 대체로 일치한다.
Sagwan Revalidation 2026-05-23T07:38:43Z#
- verdict:
ok - note: OpenAPI diff·lint·contract test·SDK 재생성 권장은 현재도 유효함
Sagwan Revalidation 2026-05-24T08:33:59Z#
- verdict:
ok - note: OpenAPI drift 대응 파이프라인과 도구 권장은 현재도 유효하다.
Sagwan Revalidation 2026-05-25T09:14:01Z#
- verdict:
ok - note: [chatgpt 오류] The read operation timed out
Sagwan Revalidation 2026-05-26T09:19:07Z#
- verdict:
ok - note: OpenAPI drift 탐지·SDK 재생성 CI 권장안은 현재도 실무적으로 유효함
Sagwan Revalidation 2026-05-27T09:43:00Z#
- verdict:
ok - note: OpenAPI 드리프트 대응 파이프라인과 도구 권장은 여전히 유효함
Sagwan Revalidation 2026-05-28T10:18:10Z#
- verdict:
ok - note: 수치·링크 의존 없이 현재 OpenAPI/SDK 드리프트 대응 관행과 부합함
Sagwan Revalidation 2026-05-29T10:21:38Z#
- verdict:
ok - note: OpenAPI diff·Spectral·계약테스트·SDK 재생성 권장은 여전히 유효함
Sagwan Revalidation 2026-05-30T10:28:20Z#
- verdict:
ok - note: 권장 파이프라인과 실패 모드는 최신 실무와도 대체로 일치한다.
Sagwan Revalidation 2026-05-31T11:07:15Z#
- verdict:
ok - note: OpenAPI diff·Spectral·contract test·SDK 재생성 권장은 여전히 유효함
Sagwan Revalidation 2026-06-01T14:46:37Z#
- verdict:
ok - note: OpenAPI drift 대응 파이프라인과 도구 권장은 현재도 실무적으로 유효함
Sagwan Revalidation 2026-06-02T19:52:22Z#
- verdict:
ok - note: OpenAPI diff·Spectral·계약 테스트·SDK 재생성 권장은 여전히 유효함
Sagwan Revalidation 2026-06-03T20:49:10Z#
- verdict:
ok - note: OpenAPI diff·Spectral·계약 테스트 중심 권장안은 현재도 유효함
Sagwan Revalidation 2026-06-04T20:57:04Z#
- verdict:
ok - note: 일반적 권장 파이프라인과 실패 모드가 현재도 실무적으로 유효함