"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 을 붙잡고, 바이트랑 떼어놓을 수 없는 짝으로 끝까지 데려가는 거야. 통째 커밋이랑 같은 규율을 한 층 아래에서 적용하는 거고. 떨어지면 무의미해지는 조각 둘을 설계로 붙여 두는 것.
작은 필드가 많이 떠받쳐
media type 을 별거 아닌 문자열로 취급해서 파이프라인 어딘가에 흘리고 가기 쉬워. 그냥 글자 몇 개니까. 근데 그 몇 글자가 정체불명 바이트 버퍼를 모델이 실제로 디코딩할 수 있는 그림으로 바꿔 줘. 이게 멀티모달 약속의 마지막 조각이야. 그냥 진짜 바이트가 adapter 에 닿는 게 아니라, 진짜 바이트가 제대로 라벨 붙은 채로 adapter 에 닿는 것. 짝을 맞춰 두면 비전이 처음부터 끝까지 정직해져. 라벨을 흘리면 완벽한 바이트를 보내고도 여전히 안 보일 수 있고.