--- kind: CONCEPT slug: messaging-schema-avro-c04 title: 쓰기 스키마와 읽기 스키마를 둘 다 넘기는 경로 topic: schema-and-wire-models project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-schema-avro-c04 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-schema-avro-c04 file: ../../../final/evidence/rendered/messaging-schema-avro-c04.svg evidence: - ../../../final/evidence/raw/messaging-schema-avro-c04.txt source: - 원본 분석 절은 final/document.md#a19-messaging-schema-avro#L254 이다. module: messaging-schema-avro --- # 쓰기 스키마와 읽기 스키마를 둘 다 넘기는 경로 encode: schemaFor → GenericRecord 확인 → 스키마 동일성 확인 → BoundedByteSink + direct encoder → writer.write + flush → EncodedMessage(bytes, AVRO, SchemaReference) decode(동일 버전): requireWithinLimit → schemaFor → 대상 타입이 GenericRecord 계열인지 → boundedReader(writer, writer) → reader.read decodeEvolved: requireWithinLimit → schemaFor(writer) + schemaFor(reader) → boundedReader(writer, reader) → reader.read CI 게이트: check(candidate, history, mode) → 모드에 따라 비교 대상 선정 → 방향별 checkReaderWriterCompatibility ## 관계 - **모드 enum을 분기 조건으로 쓰면 각 분기에 테스트를 둔다** 같은 분석 리프에서 끌어낸 규칙이다. - **컬렉션 순서가 계약이면 양쪽에서 같은 방향으로 적는다** 같은 분석 리프에서 끌어낸 규칙이다. - **안정 코드는 판단 단위로 정하고 구현 단위로 정하지 않는다** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 네 경로가 있다. **encode:** `schemaFor` → `GenericRecord` 확인 → 스키마 동일성 확인 → `BoundedByteSink` + direct encoder → `writer.write` + `flush` → `EncodedMessage(bytes, AVRO, SchemaReference)` **decode(동일 버전):** `requireWithinLimit` → `schemaFor` → 대상 타입이 `GenericRecord` 계열인지 → `boundedReader(writer, writer)` → `reader.read` **decodeEvolved:** `requireWithinLimit` → `schemaFor(writer)` + `schemaFor(reader)` → `boundedReader(writer, reader)` → `reader.read` **CI 게이트:** `check(candidate, history, mode)` → 모드에 따라 비교 대상 선정 → 방향별 `checkReaderWriterCompatibility` ## GenericRecord 참조 위치 :::evidence key="messaging-schema-avro-c04" alt="코드베이스에서 GenericRecord 를 검색한 출력 29줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="GenericRecord 코드베이스 검색 — 29줄 · exit 0" zoom="true" :::