--- kind: CONCEPT slug: messaging-schema-avro-c05 title: 크기 실패가 인코딩 실패로 접히지 않게 하는 재던지기 topic: schema-and-wire-models project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: concept:messaging-schema-avro-c05 evidenceCapturedOn: 2026-09-01 assets: - key: messaging-schema-avro-c05 file: ../../../final/evidence/rendered/messaging-schema-avro-c05.svg evidence: - ../../../final/evidence/raw/messaging-schema-avro-c05.txt source: - 원본 분석 절은 analysis/messaging/messaging-schema-avro.md#L266 이다. module: messaging-schema-avro --- # 크기 실패가 인코딩 실패로 접히지 않게 하는 재던지기 예외 재던지기 패턴이 세 곳에 반복된다. BoundedByteSink가 던지는 MessageTooLargeException은 RuntimeException이므로 catch에 걸린다. ## 관계 - **모드 enum을 분기 조건으로 쓰면 각 분기에 테스트를 둔다** 같은 분석 리프에서 끌어낸 규칙이다. - **컬렉션 순서가 계약이면 양쪽에서 같은 방향으로 적는다** 같은 분석 리프에서 끌어낸 규칙이다. - **안정 코드는 판단 단위로 정하고 구현 단위로 정하지 않는다** 같은 분석 리프에서 끌어낸 규칙이다. ## 본문 **예외 재던지기 패턴이 세 곳에 반복된다.** `BoundedByteSink`가 던지는 `MessageTooLargeException`은 `RuntimeException`이므로 catch에 걸린다. 그것을 그대로 통과시키지 않으면 크기 실패가 인코딩 실패로 접힌다 — JSON codec의 `unwrapTooLarge`와 같은 문제를 다른 방식(원인 사슬 탐색이 아니라 즉시 `instanceof`)으로 푼다. §12.3. ## BoundedByteSink 참조 위치 :::evidence key="messaging-schema-avro-c05" alt="코드베이스에서 BoundedByteSink 를 검색한 출력 15줄. 이 기록이 세는 참조가 그 출력에 그대로 보인다." caption="BoundedByteSink 코드베이스 검색 — 15줄 · exit 0" zoom="true" ::: ## 방어를 우회하는 값이 존재하지만 읽기 실패로 끝난다 `AvroHostileInputTest.aCountBeyondIntRangeFailsWhileReadingRatherThanWhileReserving`가 흥미로운 경계를 잡는다 — 2³²을 주장하면 int로 잘려 무해한 값이 되고, 그 다음 읽기가 입력 부족으로 실패해 `MessageSerializationException`이 된다. 즉 `newArray` 방어를 우회하는 값이 존재하지만 그 우회는 할당이 아니라 읽기 실패로 끝난다.