내가 파일을 업로드하지 않는 파일 변환기를 만든 이유

발행: (2026년 2월 18일 오후 04:18 GMT+9)
9 분 소요
원문: Dev.to

I’m ready to translate the article for you, but I’ll need the full text you’d like translated (the portion after the source line). Could you please paste the content you want me to translate into Korean?

Source:

The Problem with Cloud Converters

우리는 모두 이런 경험을 해봤습니다. PNG 파일을 JPG로 바꿔야 할 때, WAV 파일을 MP3로 바꿔야 할 때, 혹은 JSON 파일을 YAML로 변환해야 할 때 말이죠.

구글에 검색합니다. 첫 번째 결과인 “Free Online Converter!”를 클릭합니다. 파일을 업로드하라는 창이 뜹니다.

잠시 머뭇깁니다.

  • 그 파일이 신분증 스캔본일 수도 있습니다.
  • 재무 스프레드시트일 수도 있습니다.
  • 기밀 업무 문서일 수도 있습니다.
  • 혹은 단순히 개인 사진일 수도 있는데, 발음하기 어려운 관할 구역에 있는 무작위 서버에 공유하고 싶지 않을 수도 있습니다.

하지만 급합니다. 파일을 업로드하고, 진행 바가 끝나기를 기다린 뒤 결과를 다운로드합니다. 그리고 “24시간 후 삭제”가 실제로 적용되길 기대합니다.

이 워크플로우는 깨졌습니다. 2026년 현재, 웹 브라우저에서 사용할 수 있는 컴퓨팅 파워를 고려하면, 파일 형식만 바꾸기 위해 전 세계 반대편 서버에 5 MB 이미지를 전송할 이유가 전혀 없습니다.

그래서 저는 Sagasu Tools 를 만들었습니다.

패러다임 전환: 로컬‑우선 웹 앱

웹은 진화했습니다. 예전에는 텍스트를 표시하는 단순한 단말기에 불과했습니다. 그 다음에는 폼을 서버로 전송하는 수단이 되었습니다.

오늘날 브라우저는 완전한 운영 체제와 같습니다.

WebAssembly (Wasm), Service Workers, 그리고 File System Access API와 같은 기술을 통해 우리는 데스크톱 수준의 성능과 프라이버시를 웹에 가져올 수 있습니다.

tools.sagasu.art에서의 목표는 간단했습니다: 서버‑사이드 처리 제로.

How It Works

When you visit a traditional converter site:

  • Client: Select file → Upload (bandwidth cost + privacy risk)
  • Server: Receive file → Spin up process → Convert (CPU cost) → Save temp file
  • Client: Download result (bandwidth cost)

When you use Sagasu Tools:

  • Client: Select file → Browser processes it locally → Save result.

There is no step 2. The server serves the static HTML/JS/Wasm assets once, then gets out of the way. You could literally turn off your Wi‑Fi after the page loads, and the tool would still work.

내부 동작: FFmpeg.wasm와 친구들

많은 미디어 변환기의 비밀 소스는 FFmpeg이며, 이는 오디오/비디오 처리의 스위스 군용 나이프와 같습니다.

전통적으로 FFmpeg는 Linux 서버에서 실행됩니다. Emscripten 컴파일러 툴체인을 이용하면 FFmpeg의 C 코드를 WebAssembly로 컴파일할 수 있습니다.

// Example: loading ffmpeg.wasm in a Web Worker
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg';
const ffmpeg = createFFmpeg({ log: true });
await ffmpeg.load();
await ffmpeg.write('input.mp4', await fetchFile(file));
await ffmpeg.run('-i', 'input.mp4', 'output.webm');
const data = ffmpeg.read('output.webm');

ffmpeg.wasm은 브라우저가 Web Worker 내에서 직접 FFmpeg를 실행하도록 합니다. 즉, 내 사이트에서 동영상을 변환할 때 CPU 팬은 돌아갈 수 있지만 네트워크 카드는 조용히 유지됩니다. 데이터는 절대 RAM을 떠나지 않습니다.

장점

  • 프라이버시: 데이터가 기기를 떠나지 않으므로 가로채이거나 저장되거나 판매될 수 없습니다. 내 쪽에서 데이터 처리가 전혀 없기 때문에 설계상 GDPR을 준수합니다.
  • 속도: 많은 경우 파일을 업로드하고 다운로드하는 시간이 실제 변환 시간보다 깁니다. 작은 파일은 로컬 변환이 즉시 이루어집니다.
  • 비용: 정적 파일만 호스팅(Cloudflare Pages 덕분)하므로 호스팅 비용이 사실상 제로이며, 무료이면서 광고 없는 도구를 제공할 수 있습니다.
  • 신뢰성: “서버 과부하” 오류가 없습니다. 컴퓨터가 작동하면 도구도 작동합니다.

클라이언트‑사이드 처리의 도전 과제

모든 것이 순탄하지만은 않습니다. 로컬‑퍼스트 변환기를 구축하는 데는 트레이드‑오프가 따릅니다.

1. 브라우저 제약

브라우저는 모든 것을 샌드박스화합니다. WebAssembly에서 메모리를 관리하는 것은 까다로울 수 있습니다. Chrome에서 4 GB 영상을 변환하면 탭이 충돌할 수 있는데, 이는 브라우저가 단일 탭이 사용할 수 있는 RAM을 제한하기 때문입니다. 클라우드 서버는 128 GB RAM을 문제에 투입할 수 있지만, 브라우저 탭은 아마 4 GB 정도만 사용할 수 있습니다.

2. 초기 로드 시간

ffmpeg.wasm 코어는 크기가 큽니다(약 25 MB). 처음 방문할 때 이 파일을 다운로드하는 데 시간이 걸립니다.

해결책: 적극적인 캐싱. 한 번 사이트를 방문하면 Wasm 바이너리가 캐시에 저장됩니다. 이후 방문은 즉시 로드됩니다.

3. 포맷 지원

FFmpeg는 폭넓은 포맷을 지원하지만, 모든 코덱을 Wasm으로 컴파일하면 파일 크기가 크게 증가합니다. 앱을 가볍게 유지하기 위해 지원할 포맷을 선택적으로 제한해야 합니다.

미디어를 넘어: 단위 변환, JSON 및 그 외

  • JSON Formatter: 설정 파일을 서버에 보내서 예쁘게 출력할 필요가 있나요? JavaScript로 직접 처리하세요.
  • Base64 Encoder: 백엔드와 절대 연결되지 않아야 하는 간단한 문자열 조작입니다.
  • Unit Converter: 순수한 수학 연산. 지연 시간 0.

왜 이것이 중요한가

우리는 “두꺼운 클라이언트(thick client)”로 다시 돌아가는 흐름을 보고 있습니다.

  • 1990년대에는 .exe 파일을 설치했습니다.
  • 2010년대에는 모든 것을 클라우드(SaaS)로 옮겼습니다.
  • 2020년대에는 엣지와 클라이언트로 다시 이동하고 있지만, 웹을 통해 제공됩니다.

이 하이브리드 모델—Web distribution, Local execution—은 유틸리티 소프트웨어의 미래입니다. 웹사이트의 마찰 없는 접근성(설치 불필요)과 데스크톱 앱의 프라이버시 및 성능을 결합합니다.

제가 이 변환기를 만든 이유는 직접 사용하고 싶었기 때문입니다. 클릭하고, 파일을 끌어다 놓고, 결과를 얻을 수 있는 북마크가 필요했으며, 내 데이터를 누가 보는지 걱정하고 싶지 않았습니다.

필요하다고 생각되면 tools.sagasu.art에서 사용해 보세요. 회원가입도, 업로드도, 번거로운 절차도 없습니다. 그냥 도구만 있습니다.

0 조회
Back to Blog

관련 글

더 보기 »