JavaScript에서 바이너리 데이터 처리: ArrayBuffer, Blob, File, ReadableStream 및 Response 변환 기법

핵심 객체 개요

ArrayBuffer

ArrayBuffer는 고정 길이의 원시 바이너리 데이터 버퍼를 나타내는 JavaScript 객체입니다. 메모리에 저장된 바이너리 데이터를 직접 조작할 수 없으며, TypedArray나 DataView를 통해 접근해야 합니다.

// 8바이트 버퍼 생성
const dataBuffer = new ArrayBuffer(8);

// Int32Array로 데이터 조작
const intView = new Int32Array(dataBuffer);
intView[0] = 456;
console.log(intView); // Int32Array(2) [ 456, 0 ]

Blob

Blob(Binary Large Object)은 파일이나 데이터 조각을 표현하는 객체로, 텍스트, 이미지 등 다양한 형식의 데이터를 포함할 수 있습니다.

File

File은 Blob의 확장으로 사용자가 선택한 실제 파일 정보를 담고 있으며, 파일명, 크기, MIME 타입 등의 메타데이터를 제공합니다.

FileReader

FileReader는 Blob이나 File 객체의 내용을 비동기적으로 읽어들이며, 문자열이나 ArrayBuffer 형태로 변환해줍니다.

// Blob 생성 및 FileReader로 읽기
const contentBlob = new Blob(['안녕하세요!'], { type: 'text/plain' });

const fileReader = new FileReader();
fileReader.onload = function(e) {
  console.log(e.target.result); // 안녕하세요!
};
fileReader.readAsText(contentBlob);

ReadableStream

ReadableStream은 네트워크 요청이나 파일과 같은 소스로부터 데이터를 순차적으로 읽을 수 있는 스트림 인터페이스입니다.

async function fetchDataStream() {
  const response = await fetch('https://example.com/data');
  const streamReader = response.body.getReader();
  
  const chunks = [];
  
  while(true) {
    const { done, value } = await streamReader.read();
    if(done) break;
    chunks.push(value);
  }
  
  // 청크들을 하나의 문자열로 병합
  const mergedBlob = new Blob(chunks, { type: 'text/plain' });
  return await mergedBlob.text();
}

Response

Fetch API의 Response 객체는 HTTP 응답을 표현하며 상태 코드, 헤더, 본문 등을 포함합니다.

변환 예제

파일 입력 처리

<input type="file" id="fileSelector">
<script>
document.getElementById('fileSelector').addEventListener('change', async (e) => {
  const selectedFile = e.target.files[0];
  console.log(`선택된 파일: ${selectedFile.name}`);
  
  const reader = new FileReader();
  reader.onload = (event) => {
    console.log('파일 내용:', event.target.result);
  };
  reader.readAsText(selectedFile);
});
</script>

스트림 데이터 처리

async function processStream() {
  const httpResponse = await fetch('/api/data');
  const inputStream = httpResponse.body;
  
  const processedStream = new ReadableStream({
    async start(controller) {
      const reader = inputStream.getReader();
      
      try {
        while(true) {
          const { done, value } = await reader.read();
          if(done) break;
          
          // 데이터 처리 로직
          controller.enqueue(value);
        }
        controller.close();
      } finally {
        reader.releaseLock();
      }
    }
  });
  
  return new Response(processedStream, {
    headers: { 'Content-Type': 'application/octet-stream' }
  });
}

Response 객체 활용

const imageElement = document.querySelector('#targetImage');

// Request 생성 및 처리
const imageRequest = new Request('sample.png');

fetch(imageRequest)
  .then(response => response.blob())
  .then(imageBlob => {
    const imageUrl = URL.createObjectURL(imageBlob);
    imageElement.src = imageUrl;
  });

Response 생성자 사용

// 다양한 방식으로 Response 생성
const emptyResponse = new Response();
const textResponse = new Response('응답 데이터');
const jsonResponse = new Response(
  JSON.stringify({ message: '성공' }),
  {
    status: 200,
    statusText: 'OK',
    headers: {
      'Content-Type': 'application/json'
    }
  }
);

태그: JavaScript ArrayBuffer BLOB FileReader ReadableStream

9월 3일 15:21에 게시됨