"media type 없는 바이트는 라벨 없이 밀봉된 상자야. adapter 는 그게 JPEG 인지 알아야지, 추측하면 안 돼."
바이트만으로는 모호하다
이미지 바이트 덩어리는 자기가 뭔지 알려주지 않아. 같은 raw 버퍼가 JPEG 일 수도, PNG 일 수도, WebP 일 수도, HEIC 일 수도 있어 — 그리고 각각 다르게 디코딩돼. media type(MIME 타입: image/jpeg, image/png, image/webp, …)이 adapter 한테 상자를 어떻게 해석할지 알려주는 라벨이야. 그거 없이, 또는 틀린 걸로 바이트를 보내면, 배송 라벨 없는 밀봉 소포를 넘기는 거야: 올바로 열릴 수도, 거부될 수도, 잘못 읽힐 수도 있어. '바이트가 도착했다'는 필요하지만 충분하진 않아 — 올바로 라벨 붙어서 도착해야 해.
나눌 수 없는 짝
{ bytes, mediaType } 를 항상 함께 다니는 하나의 나눌 수 없는 값으로 다뤄, staging 부터 adapter 까지. 둘이 분리되는 순간 — 바이트는 여기 나르고, media type 은 저기서 추론하거나, 추측으로 기본값 매기면 — 미묘한 실패 부류를 도입한 거야:
- 틀린 기본값: 전부
image/jpeg라 가정하면 사용자가 실제로 보낸 모든 PNG 랑 HEIC 를 조용히 망가뜨려. - 한 홉에서 잃음: staging 에선 알던 media type 이 adapter 전에 버려지면 하류 추측을 강제해.
- 비일관 재감지: 두 코드 경로가 타입을 따로 sniff 하면 어긋날 수 있어, 공유-resolver 레슨의 drift 버그를 되살려.
해법은 media type 을 파일의 진짜 타입이 알려진 출처에서 캡처하고, 바이트의 나눌 수 없는 짝으로 끝까지 나르는 거야. 원자적 aggregate 랑 같은 규율, 한 층 아래: 떨어지면 무의미한 두 조각을, 설계로 함께 둠.
작은 필드, 하중 견딤
media type 을 하찮은 문자열로 다루고 파이프라인 어딘가서 떨어지게 두기 쉬워 — 그냥 몇 글자니까. 근데 그 몇 글자가 익명 바이트 버퍼를 모델이 실제로 디코딩할 수 있는 그림으로 바꿔. 이게 멀티모달 약속의 마지막 조각이야: 그냥 '진짜 바이트가 adapter 에 닿음'이 아니라, '진짜 바이트가, 올바로 라벨 붙어서, adapter 에 닿음'. 짝을 맞추면 비전이 끝에서 끝까지 정직해; 라벨을 떨구면, 완벽한 바이트를 보내고도 여전히 안 보일 수 있어.