Look Scanned와 같은 모던 웹 애플리케이션 개발에서 성능 최적화는 가장 중요한 과제 중 하나입니다. 특히 이미지 처리 영역에서는 그 중요성이 더욱 두드러집니다. ImageBitmap 인터페이스는 아직 널리 활용되지는 않았지만, 획기적인 성능 향상을 실현할 수 있는 강력한 도구입니다. 이 글에서는 ImageBitmap의 핵심 기능, 장점, 그리고 Look Scanned에서의 구현 사례를 상세히 설명하겠습니다.

ImageBitmap 소개

ImageBitmap은 효율적인 이미지 처리를 위해 설계된 HTML5 인터페이스입니다. 가장 큰 특징은 메인 스레드 외부에서 이미지 디코딩과 처리가 가능하다는 점입니다. 이를 통해 렌더링 부하를 크게 줄이고 애플리케이션의 전반적인 반응성을 개선할 수 있습니다. 생성된 ImageBitmap 객체는 Canvas 2D나 WebGL 같은 렌더링 컨텍스트에서 바로 사용할 수 있어, 이미지를 많이 다루는 애플리케이션에 이상적인 선택입니다.

ImageBitmap 도입 배경

기존 Look Scanned는 처리 함수 간 이미지 데이터 전달에 Blob을 사용했습니다. 그러나 Blob은 사용할 때마다 인코딩과 디코딩이 필요해 성능상 제약이 있었습니다. 반면 ImageBitmap은 이미지 데이터에 직접 접근할 수 있어, 이러한 불필요한 작업을 제거함으로써 렌더링 성능을 획기적으로 개선할 수 있습니다.

구현 방식

레거시 브라우저와의 호환성 유지가 필요하여, 완전한 ImageBitmap 전환은 현실적이지 않았습니다. 따라서 폭넓은 브라우저 호환성을 보장하는 하이브리드 접근 방식을 선택했습니다. 호환성 상세 정보는 caniuse.com에서 확인하실 수 있습니다. 또한, Safari의 Canvas 지원 제약으로 인해 이미지 처리에 WebAssembly (WASM)를 활용하며, 이는 입력 형식으로 Blob이 필요합니다.

이러한 환경을 고려하여 BlobImageBitmap을 모두 지원하는 점진적인 하이브리드 솔루션을 개발했습니다. 주요 구현 내용은 다음과 같습니다:

이미지 로딩 및 디코딩 처리

async function loadImage(url): Promise<ImageBitmap | Blob> {
  const response = await fetch(url);
  const blob = await response.blob();
  if (window.createImageBitmap) {
    return createImageBitmap(blob);
  }
  // Blob 방식으로 대체
  return blob;
}

WebAssembly 연동

고도화된 처리를 위해 ImageBitmap 미지원 브라우저에서도 동작하도록 Blob을 WASM 모듈로 전달합니다. 이 과정에서 먼저 이미지를 Canvas에 렌더링한 후 canvas.toBlob을 통해 필요한 Blob 객체를 생성합니다.

대체 렌더링 구현

async function renderImage(canvas, imageUrl) {
  const ctx = canvas.getContext("2d");
  const image = await loadImage(imageUrl);
  if (image instanceof ImageBitmap) {
    ctx.drawImage(image, 0, 0);
  } else {
    const img = new Image();
    img.src = URL.createObjectURL(image);
    img.onload = () => ctx.drawImage(img, 0, 0);
  }
}

성능 개선 효과

ImageBitmap 도입으로 Look Scanned의 이미지 처리 시간이 이미지당 50ms에서 20ms로 대폭 단축되었습니다. 이러한 개선으로 특히 스캔 문서 처리 시 훨씬 더 빠르고 쾌적한 사용자 경험을 제공할 수 있게 되었습니다.

주목할 만한 발견 사항

구현 과정에서 흥미로운 점을 발견했습니다. Web Worker로 전송하기 전에 새로운 ImageBitmap 복사본을 생성하는 것이 원본 객체를 직접 전송하는 것보다 더 우수한 성능을 보였습니다. 이는 브라우저의 전송 가능 객체에 대한 내부 최적화 메커니즘 때문인 것으로 분석됩니다.

브라우저 지원 상태

현재 ImageBitmap은 Chrome, Firefox, Edge, Safari 등 주요 모던 브라우저에서 광범위하게 지원됩니다. 자세한 지원 현황은 caniuse.com의 createImageBitmap 문서에서 확인하실 수 있습니다.

결론 및 향후 계획

Look Scanned에 ImageBitmap을 도입함으로써 성능이 획기적으로 개선되었을 뿐만 아니라, 비동기 디코딩, 효율적인 렌더링, Web Workers와의 원활한 연동도 실현했습니다. 레거시 브라우저를 위한 Blob 지원은 당분간 유지해야 하지만, ImageBitmap으로의 점진적인 전환은 장기적으로 큰 가치를 창출할 것으로 확신합니다.

Look Scanned에서 직접 개선된 성능을 경험해보세요!