--- kind: CONCEPT slug: messaging-schema-protobuf-c06 title: 평탄한 registry라 얕은 복사 문제가 없다 topic: state-machines-and-ownership project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-schema-protobuf-c06 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-schema-protobuf-c06 file: ../../../final/evidence/rendered/messaging-schema-protobuf-c06.svg evidence: - ../../../final/evidence/raw/messaging-schema-protobuf-c06.txt source: - 원본 분석 절은 analysis/messaging/messaging-schema-protobuf.md#L258 이다. module: messaging-schema-protobuf --- # 평탄한 registry라 얕은 복사 문제가 없다 `ProtobufMessageCodec`은 불변이고, `Map.copyOf`가 여기서는 얕은 복사 문제를 만들지 않는다. ## 관계 - **검증되지 않는 스키마 파일은 문서임을 파일 안에 적는다** 같은 분석 리프에서 끌어낸 규칙이다. - **신뢰할 수 없는 입력 쪽 경계를 먼저 테스트한다** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 `ProtobufMessageCodec`은 불변이다 — `contracts`는 `Map.copyOf`, `maxBytes`는 int. `ProtobufMessageContract`는 record이고 `Class`/`Parser` 둘 다 protobuf-java에서 스레드 안전하다. `BoundedByteSink`는 매 encode마다 새로 만들어진다. ## ProtobufMessageCodec 참조 위치 :::evidence key="messaging-schema-protobuf-c06" alt="코드베이스에서 ProtobufMessageCodec 를 검색한 출력 14줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="ProtobufMessageCodec 코드베이스 검색 — 14줄 · exit 0" zoom="true" ::: ## 평탄한 쪽이 결함을 만들지 않았다 `Map.copyOf`가 여기서는 **얕은 복사 문제가 없다** — `Map`가 이미 평탄한 한 레벨이다. `AvroMessageCodec`이 중첩 맵을 받아 `flatten`이 필요했던 것과 대비된다. 두 codec이 같은 registry 개념을 다른 형태로 받았고, 평탄한 쪽이 결함을 만들지 않았다.