본문 바로가기
C.W.K.
Stream
Lesson 04 of 04 · published

media type 는 바이트랑 함께 다닌다

~10 min · media-type, mime, interpretation, pairing

Level 0신호 없음
0 XP0/32 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"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 에 닿는 것. 짝을 맞춰 두면 비전이 처음부터 끝까지 정직해져. 라벨을 흘리면 완벽한 바이트를 보내고도 여전히 안 보일 수 있고.

Code

출처에서 media type 을 붙잡고, 짝으로 데려가기·typescript
// 타입은 파일이 진짜인 데서 알려져. 거기서 캡처해.
type ResolvedImage = { bytes: ArrayBuffer; mediaType: string }; // 절대 분리 안 됨

async function resolveStagedImage(localId: string): Promise<ResolvedImage> {
  const blob = await readStagedBlob(localId);
  return { bytes: await blob.arrayBuffer(), mediaType: blob.type }; // 여기서 짝지음
}

// 틀림: 짝을 쪼개고 하류에서 타입을 다시 추측.
//   send(bytes);                         // media type 남겨둠
//   const mediaType = "image/jpeg";      // PNG/HEIC 를 망가뜨리는 기본값

// 맞음: media type 이 바이트랑 함께 모든 봉투로, 안 바뀐 채 다녀.

External links

Exercise

이미지의 media type 이 파이프라인을 어떻게 지나가는지 따라가 봐. 파일 선택, staging, 풀어내기, 봉투, adapter 로 전송. 홉마다 물어. 'media type 이 아직 이 바이트에 붙어 있나?' 처음으로 흘려버리거나 기본값이 박힐 수 있는 데를 찾아. 그다음 media type 이 출처에서 붙잡혀 짝으로 끝까지 가게 설계를 고쳐. 안 고치면 HEIC 사진에서 뭐가 깨지는지도 적어 보고.
Hint
media type 은 바이트만 넘기는 홉에서 제일 자주 사라져. 그러면 아래쪽에서 image/jpeg 같은 기본값을 박을 수밖에 없고. HEIC 사진이면 adapter 가 HEIC 바이트를 JPEG 로 읽으려다 디코딩에 실패해. 바이트는 완벽한데 라벨이 틀려서 비전이 아예 안 되는 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.