--- kind: CONCEPT slug: messaging-schema-protobuf-c01 title: 소비자가 계약을 등록하려면 vendor 타입을 이름 불러야 한다 topic: schema-and-wire-models project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-schema-protobuf-c01 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-schema-protobuf-c01 file: ../../../final/evidence/rendered/messaging-schema-protobuf-c01.svg evidence: - ../../../final/evidence/raw/messaging-schema-protobuf-c01.txt source: - 원본 분석 절은 final/document.md#a19-messaging-schema-protobuf#L49 이다. module: messaging-schema-protobuf --- # 소비자가 계약을 등록하려면 vendor 타입을 이름 불러야 한다 선택적 Protobuf codec. runtime_memberships: []이고 starter의 codec registry에도 등록되지 않는다 — build-only / incubating. ## 관계 - **검증되지 않는 스키마 파일은 문서임을 파일 안에 적는다** 같은 분석 리프에서 끌어낸 규칙이다. - **신뢰할 수 없는 입력 쪽 경계를 먼저 테스트한다** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 선택적 Protobuf codec. `runtime_memberships: []`이고 starter의 codec registry에도 등록되지 않는다 — build-only / incubating. ## 이 기록이 다루는 범위 :::evidence key="messaging-schema-protobuf-c01" alt="코드베이스에서 파일 목록을 만든 출력 2줄. 이 기록이 다루는 범위가 그 목록이다." caption="코드베이스 파일 목록 — 2줄 · exit 0" zoom="true" ::: ## protobuf를 api로 선언한 근거 build.gradle 주석에 있다. `src/messaging/CLAUDE.md:40-43`의 vendor `api` 게이트를 통과한다 — `ProtobufMessageContract(Class, Parser)`가 public record이므로 소비자가 그 타입을 이름 부르지 않고는 계약을 등록할 수 없다. ## 이 leaf의 핵심 문제 인식 클래스 javadoc이 한 문장으로 적는다. `messaging-schema-avro`의 "does not fail — it produces plausible garbage"와 같은 성질이다. **JSON은 틀린 스키마로 디코딩하면 대개 실패하고, Avro와 Protobuf는 실패하지 않는다.** 그래서 두 leaf 모두 registry를 계약의 중심에 둔다.