--- kind: CONCEPT slug: messaging-schema-avro-c06 title: 재사용 자리에 항상 null을 넘겨 공유 상태를 없앤다 topic: state-machines-and-ownership project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-schema-avro-c06 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-schema-avro-c06 file: ../../../final/evidence/rendered/messaging-schema-avro-c06.svg evidence: - ../../../final/evidence/raw/messaging-schema-avro-c06.txt source: - 원본 분석 절은 analysis/messaging/messaging-schema-avro.md#L298 이다. module: messaging-schema-avro --- # 재사용 자리에 항상 null을 넘겨 공유 상태를 없앤다 `AvroMessageCodec`은 불변이고, 인코더·디코더·sink가 전부 호출마다 새로 만들어진다. ## 관계 - **모드 enum을 분기 조건으로 쓰면 각 분기에 테스트를 둔다** 같은 분석 리프에서 끌어낸 규칙이다. - **컬렉션 순서가 계약이면 양쪽에서 같은 방향으로 적는다** 같은 분석 리프에서 끌어낸 규칙이다. - **안정 코드는 판단 단위로 정하고 구현 단위로 정하지 않는다** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 `AvroMessageCodec`은 불변이다 — `schemas`가 `Map.copyOf`된 평탄 맵, `maxBytes`는 int. `BoundedByteSink`·`BinaryEncoder`·`DatumReader`·`BinaryDecoder`는 전부 호출마다 새로 만들어진다. ## AvroMessageCodec 참조 위치 :::evidence key="messaging-schema-avro-c06" alt="코드베이스에서 AvroMessageCodec 를 검색한 출력 21줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="AvroMessageCodec 코드베이스 검색 — 21줄 · exit 0" zoom="true" ::: ## 재사용 자리에 항상 null을 넘긴다 `EncoderFactory.get()`/`DecoderFactory.get()`은 Avro의 싱글턴 팩토리이고 스레드 안전하다. 다만 `binaryDecoder(encoded, null)`의 두 번째 인자가 재사용 decoder 자리인데 항상 `null`을 넘긴다 — 재사용하지 않으므로 공유 상태가 없다. 성능을 버리고 안전을 택한 형태다. `AvroCompatibilityGate`는 상태가 없다.