<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SDK Generation on jyukki's Blog</title><link>https://jyukki.com/tags/sdk-generation/</link><description>Recent content in SDK Generation on jyukki's Blog</description><generator>Hugo -- 0.147.0</generator><language>ko-kr</language><lastBuildDate>Wed, 06 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jyukki.com/tags/sdk-generation/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 개발 트렌드: Contract-first API가 문서가 아니라 제품 운영의 Source of Truth가 된다</title><link>https://jyukki.com/posts/2026-05-06-contract-first-api-source-of-truth-trend/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://jyukki.com/posts/2026-05-06-contract-first-api-source-of-truth-trend/</guid><description>API 계약을 문서 산출물이 아니라 mock, SDK, gateway policy, 테스트, 변경 승인까지 이어지는 운영 기준점으로 다루는 흐름을 실무 기준으로 정리합니다.</description><content:encoded><![CDATA[<p>API 스펙을 쓰는 팀은 많습니다. 하지만 스펙이 실제 운영의 기준이 되는 팀은 생각보다 적습니다. 문서 사이트에는 <code>status: string</code>이라고 적혀 있는데 실제 응답은 숫자를 주고, SDK는 3개월 전 스펙에서 생성되어 있고, 게이트웨이 정책은 또 별도 YAML로 관리됩니다. 이 상태에서 API 변경이 들어오면 리뷰어는 문서, 코드, 테스트, 클라이언트 영향, 배포 정책을 따로 확인해야 합니다. 결국 계약은 있는데 계약이 의사결정을 막아주지 못합니다.</p>
<p>요즘 흐름에서 중요한 건 &ldquo;OpenAPI를 쓰자&rdquo; 수준이 아닙니다. API 계약을 제품 운영의 <strong>Source of Truth</strong>로 놓고, 그 계약에서 mock, SDK, compatibility test, gateway policy, change review가 파생되게 만드는 것입니다. 저는 이 방향이 <a href="/learning/deep-dive/deep-dive-rest-api-design/">REST API 설계</a>, <a href="/learning/deep-dive/deep-dive-api-versioning/">API Versioning</a>, <a href="/learning/deep-dive/deep-dive-consumer-driven-contract-testing/">Consumer Driven Contract Testing</a>이 플랫폼 엔지니어링 쪽으로 확장된 흐름이라고 봅니다.</p>
<h2 id="이-글에서-얻는-것">이 글에서 얻는 것</h2>
<ul>
<li>Contract-first API가 단순 문서 작성 방식이 아니라 변경 관리와 릴리스 안정성의 문제라는 점을 이해할 수 있습니다.</li>
<li>OpenAPI, TypeSpec, protobuf 같은 계약을 어떤 산출물과 연결해야 실무 효과가 나는지 기준을 잡을 수 있습니다.</li>
<li>API 변경 승인에서 볼 숫자와 조건, 그리고 과도한 형식주의를 피하는 방법을 정리할 수 있습니다.</li>
</ul>
<h2 id="핵심-개념이슈">핵심 개념/이슈</h2>
<h3 id="1-문제는-스펙-부재보다-spec-drift다">1) 문제는 스펙 부재보다 spec drift다</h3>
<p>많은 조직이 API 스펙을 만들고도 실패합니다. 이유는 스펙이 없어서가 아니라 <strong>스펙과 실제 구현이 계속 벌어지기 때문</strong>입니다.</p>
<p>대표적인 drift는 아래처럼 생깁니다.</p>
<ul>
<li>응답 필드가 코드에서는 추가됐지만 스펙에는 없다.</li>
<li>nullable 여부가 문서와 다르다.</li>
<li>에러 코드가 실제 운영에서만 늘어난다.</li>
<li>pagination, filtering, sorting 규칙이 endpoint마다 다르다.</li>
<li>SDK는 예전 스펙으로 생성되어 클라이언트가 런타임 에러를 맞는다.</li>
</ul>
<p>이런 drift가 쌓이면 계약은 신뢰를 잃습니다. 개발자는 문서를 보지 않고 실제 응답을 찍어보게 되고, 클라이언트는 방어 코드를 늘립니다. 결국 contract-first가 아니라 <strong>traffic-first reverse engineering</strong>으로 돌아갑니다.</p>
<p>시작 기준은 단순합니다. 핵심 API Top 20에 대해 매일 또는 PR마다 <code>actual_response_sample</code>과 <code>declared_schema</code>를 비교하고, drift를 24시간 안에 잡아야 합니다. drift 감지 시간이 일주일을 넘으면 스펙은 운영 도구가 아니라 장식에 가깝습니다.</p>
<h3 id="2-contract-first는-먼저-쓰기보다-파생-산출물-일치가-중요하다">2) Contract-first는 &ldquo;먼저 쓰기&quot;보다 &ldquo;파생 산출물 일치&quot;가 중요하다</h3>
<p>contract-first라는 말을 너무 문자 그대로 받아들이면, 구현 전에 긴 YAML을 쓰는 프로세스만 생깁니다. 하지만 실무 효과는 작성 순서보다 <strong>하나의 계약에서 여러 산출물이 일관되게 나온다</strong>는 데 있습니다.</p>
<p>좋은 계약은 최소 아래를 만들어야 합니다.</p>
<ul>
<li>mock server 또는 fixture</li>
<li>server-side validation 또는 handler stub</li>
<li>client SDK와 type definition</li>
<li>compatibility test</li>
<li>documentation</li>
<li>gateway policy 일부(rate limit, auth scope, request size limit)</li>
<li>changelog와 migration note</li>
</ul>
<p>즉 스펙은 사람이 읽는 문서이면서 동시에 CI와 런타임이 읽는 입력이어야 합니다. 이 관점은 <a href="/posts/2026-04-30-tool-contract-test-agent-runtime-trend/">Tool Contract Test</a>와도 닮아 있습니다. 도구든 API든, 계약이 실행 경로에 연결되지 않으면 변경을 막지 못합니다.</p>
<h3 id="3-breaking-change-판정은-감이-아니라-규칙이어야-한다">3) breaking change 판정은 감이 아니라 규칙이어야 한다</h3>
<p>API 변경 리뷰에서 가장 자주 흐려지는 질문은 &ldquo;이게 breaking인가?&ldquo;입니다. 실무에서는 아래 규칙부터 자동화하는 편이 좋습니다.</p>
<p>breaking으로 보는 변경:</p>
<ul>
<li>필수 응답 필드 삭제 또는 타입 변경</li>
<li>nullable → non-nullable 변경</li>
<li>enum 값 삭제 또는 의미 변경</li>
<li>request required field 추가</li>
<li>에러 응답 포맷 변경</li>
<li>pagination cursor 의미 변경</li>
<li>인증 scope 강화</li>
</ul>
<p>대부분 안전한 변경:</p>
<ul>
<li>optional 응답 필드 추가</li>
<li>enum 값 추가(단, 클라이언트가 unknown enum을 처리할 때)</li>
<li>새 endpoint 추가</li>
<li>문서 설명 보강</li>
</ul>
<p>숫자 기준도 필요합니다. 예를 들어 <code>breaking_change_block_rate</code>를 95% 이상으로 두고, breaking change가 필요하면 <code>consumer_impact_report</code>와 <code>migration_window</code>가 없을 때 merge를 막습니다. 외부 공개 API라면 최소 30~90일 deprecation window를 두는 편이 현실적입니다. 내부 API라도 핵심 consumer가 3개 이상이면 &ldquo;그냥 같이 고치면 되지&quot;가 아니라 버전 전략을 세워야 합니다.</p>
<h3 id="4-api-계약은-gateway와-observability까지-내려와야-한다">4) API 계약은 gateway와 observability까지 내려와야 한다</h3>
<p>문서와 SDK까지만 연결하면 절반입니다. 실제 운영에서는 게이트웨이와 관측성까지 계약을 읽어야 합니다.</p>
<p>예를 들어 계약에 아래 속성이 있어야 합니다.</p>
<ul>
<li>endpoint별 auth scope</li>
<li>request body size limit</li>
<li>rate limit tier</li>
<li>timeout class</li>
<li>idempotency requirement</li>
<li>PII field marker</li>
<li>deprecation status</li>
</ul>
<p>이 정보가 있으면 gateway policy, 로그 마스킹, 알람 라벨, 비용 분류를 같은 기준으로 만들 수 있습니다. 반대로 이 정보를 각 시스템에 따로 적으면 시간이 지나며 어긋납니다. 보안과 운영 정책은 <a href="/learning/deep-dive/deep-dive-owasp-top10-checklist/">OWASP 체크리스트</a>와 <a href="/learning/deep-dive/deep-dive-structured-logging/">구조적 로깅</a> 기준과 연결해야 합니다.</p>
<h3 id="5-ai-코딩-시대에는-api-계약의-가치가-더-커진다">5) AI 코딩 시대에는 API 계약의 가치가 더 커진다</h3>
<p>AI 도구가 endpoint나 SDK 코드를 빠르게 생성할수록, 명확한 계약의 가치가 커집니다. 모델은 주변 코드 패턴을 보고 그럴듯한 요청/응답을 만들 수 있지만, 실제 제품에서 허용되는 auth scope, 에러 포맷, pagination 규칙, deprecation 정책을 자동으로 알지는 못합니다.</p>
<p>계약이 잘 되어 있으면 AI 도구도 더 안전하게 쓸 수 있습니다.</p>
<ul>
<li>새 endpoint 생성 시 기본 policy와 에러 포맷을 강제할 수 있다.</li>
<li>SDK 재생성으로 수동 타입 불일치를 줄일 수 있다.</li>
<li>contract test가 AI 생성 변경의 회귀를 잡는다.</li>
<li>리뷰어는 전체 코드를 다 읽기보다 계약 diff와 영향 범위를 먼저 본다.</li>
</ul>
<p>이 흐름은 <a href="/posts/2026-04-10-test-evidence-pipeline-ai-change-review-trend/">Test Evidence Pipeline</a>과도 이어집니다. AI가 코드를 많이 만들수록, 사람은 산출물 자체보다 <strong>계약과 증거를 기준으로 검토</strong>해야 합니다.</p>
<h2 id="실무-적용">실무 적용</h2>
<h3 id="1-api-top-20부터-시작한다">1) API Top 20부터 시작한다</h3>
<p>처음부터 모든 endpoint를 contract-first로 바꾸면 보통 실패합니다. 우선순위는 아래가 좋습니다.</p>
<ol>
<li>외부 파트너나 모바일 앱이 쓰는 API</li>
<li>결제, 주문, 인증처럼 변경 비용이 큰 API</li>
<li>consumer가 3개 이상인 내부 API</li>
<li>장애 시 고객 영향이 큰 조회 API</li>
<li>신규 개발이 잦은 도메인 API</li>
</ol>
<p>이 Top 20에 대해 먼저 계약, 실제 응답 샘플, SDK 생성, compatibility test를 붙입니다. 전체 커버리지보다 중요한 건 <strong>중요 API의 drift를 줄이는 것</strong>입니다.</p>
<h3 id="2-최소-ci-gate를-만든다">2) 최소 CI gate를 만든다</h3>
<p>초기 gate는 복잡할 필요가 없습니다.</p>
<ul>
<li>스펙 문법 검사</li>
<li>스펙 diff에서 breaking change 탐지</li>
<li>handler 또는 fixture와 schema 검증</li>
<li>SDK 생성 결과가 clean인지 확인</li>
<li>주요 consumer contract test 실행</li>
</ul>
<p>추천 기준:</p>
<ul>
<li><code>spec_lint_pass_rate</code>: 100%</li>
<li><code>schema_drift_detection_time</code>: 24시간 이하</li>
<li><code>sdk_generation_lead_time</code>: 10분 이하</li>
<li><code>breaking_change_without_approval</code>: 0건</li>
<li><code>undocumented_error_response_rate</code>: 5% 이하</li>
</ul>
<p>여기서 핵심은 gate가 너무 느려지지 않는 것입니다. API 스펙 변경 때마다 40분 CI가 돌면 개발자는 우회로를 찾습니다. 초기에는 Top 20 API의 핵심 검증을 10분 안에 끝내는 쪽이 낫습니다.</p>
<h3 id="3-계약-diff를-리뷰의-첫-화면으로-둔다">3) 계약 diff를 리뷰의 첫 화면으로 둔다</h3>
<p>API 변경 PR에서 가장 먼저 봐야 하는 것은 코드 diff가 아니라 계약 diff입니다.</p>
<p>리뷰어 질문은 이렇게 바뀌어야 합니다.</p>
<ul>
<li>request/response shape가 바뀌었는가?</li>
<li>nullable, enum, error code가 바뀌었는가?</li>
<li>consumer 영향 범위가 계산됐는가?</li>
<li>SDK와 문서가 같은 커밋에서 갱신됐는가?</li>
<li>gateway policy나 auth scope 변화가 있는가?</li>
<li>rollback 또는 deprecation 계획이 있는가?</li>
</ul>
<p>이 순서가 잡히면 코드 리뷰가 훨씬 가벼워집니다. 구현 세부는 테스트와 코드에서 보고, 호환성 리스크는 계약 diff에서 먼저 거르는 구조가 됩니다.</p>
<h2 id="트레이드오프주의점">트레이드오프/주의점</h2>
<p>Contract-first는 만능이 아닙니다. 잘못 도입하면 개발 속도만 늦추는 형식주의가 됩니다.</p>
<p>주의할 점은 네 가지입니다.</p>
<ol>
<li><strong>스펙이 너무 추상적이면 구현과 분리된다</strong>
<ul>
<li>실제 fixture와 validation이 없으면 문서만 예뻐집니다.</li>
</ul>
</li>
<li><strong>모든 endpoint에 같은 엄격도를 적용하면 피로도가 커진다</strong>
<ul>
<li>내부 실험 API와 외부 결제 API의 gate는 달라야 합니다.</li>
</ul>
</li>
<li><strong>생성 코드에 과신하면 디버깅 능력이 떨어진다</strong>
<ul>
<li>SDK 생성은 반복을 줄이는 도구이지, API 설계 판단을 대신하지 않습니다.</li>
</ul>
</li>
<li><strong>버전 전략 없이 breaking 차단만 하면 변화가 막힌다</strong>
<ul>
<li>deprecation window, dual-write/dual-read, migration guide가 같이 필요합니다.</li>
</ul>
</li>
</ol>
<p>의사결정 기준은 간단합니다. consumer가 적고 빠르게 바뀌는 내부 실험 API는 lightweight spec만 둬도 됩니다. 반대로 외부 앱, 파트너, 결제/정산/인증처럼 변경 비용이 큰 API는 엄격한 contract gate를 두는 편이 맞습니다. 속도보다 호환성이 비싼 영역을 먼저 고르는 것이 핵심입니다.</p>
<h2 id="체크리스트-또는-연습">체크리스트 또는 연습</h2>
<h3 id="도입-체크리스트">도입 체크리스트</h3>
<ul>
<li><input disabled="" type="checkbox"> 핵심 API Top 20이 정의되어 있다.</li>
<li><input disabled="" type="checkbox"> 각 API의 contract owner가 있다.</li>
<li><input disabled="" type="checkbox"> 실제 응답 샘플과 선언 스키마를 비교한다.</li>
<li><input disabled="" type="checkbox"> breaking change 규칙이 자동화되어 있다.</li>
<li><input disabled="" type="checkbox"> SDK, mock, 문서가 같은 계약에서 생성된다.</li>
<li><input disabled="" type="checkbox"> gateway policy와 auth scope가 계약과 연결되어 있다.</li>
<li><input disabled="" type="checkbox"> consumer impact report 없이 breaking change가 merge되지 않는다.</li>
<li><input disabled="" type="checkbox"> deprecation window와 migration note 템플릿이 있다.</li>
</ul>
<h3 id="연습">연습</h3>
<p>운영 중인 API 하나를 골라 아래를 확인해 보세요.</p>
<ol>
<li>문서의 response schema와 실제 production response가 같은가?</li>
<li>enum 값이 추가되면 기존 클라이언트가 unknown 값을 처리할 수 있는가?</li>
<li>request required field를 하나 추가하면 어떤 consumer가 깨지는지 10분 안에 알 수 있는가?</li>
<li>SDK는 언제, 어떤 스펙에서 생성되었는가?</li>
<li>gateway의 auth/rate limit 정책은 스펙과 같은 저장소에서 추적되는가?</li>
</ol>
<p>이 질문에 세 개 이상 답하기 어렵다면, 지금 필요한 것은 더 예쁜 문서 사이트가 아니라 계약을 운영 경로에 연결하는 작업입니다.</p>
<h2 id="결론">결론</h2>
<p>Contract-first API의 핵심은 &ldquo;스펙을 먼저 쓰자&quot;가 아닙니다. 핵심은 <strong>하나의 계약이 여러 운영 산출물의 기준점이 되게 만드는 것</strong>입니다. 문서, mock, SDK, 테스트, gateway policy, 변경 승인 기준이 서로 다른 곳에서 관리되면 API는 시간이 지날수록 불신의 대상이 됩니다.</p>
<p>반대로 계약이 실제 CI와 런타임에 연결되면 API 변경은 훨씬 다루기 쉬워집니다. 리뷰어는 계약 diff를 먼저 보고, consumer 영향이 자동으로 계산되고, SDK와 문서는 같은 변경에서 갱신됩니다. 이 정도가 되어야 API 스펙은 문서가 아니라 제품 운영의 Source of Truth라고 부를 수 있습니다.</p>
]]></content:encoded></item></channel></rss>