
솔직히 말해봅시다.
SI 프로젝트, 특히 의료 쪽 하시는 분들.
기가바이트(GB) 단위의 고해상도 이미지(WSI, Whole Slide Images) 처리하라는 요구사항 나오면 식은땀부터 흐르죠?
"그거 다운로드해서 처리하면 서버 터져요."
제가 10년 전 금융권 차세대 할 때도 그랬고, 지금도 똑같습니다.
그런데 며칠 전, 꽤 흥미로운 물건을 하나 발견했습니다.
WSI Streamer라는 녀석입니다.
이거 보자마자 "아, 예전에 이거 알았으면 주말 반납 안 했을 텐데" 싶더군요.
오늘은 '다운로드 없는 이미지 스트리밍'에 대해 이야기하려 합니다.

1. 무식한 방법: 일단 다운로드
주니어 시절, 저도 그랬습니다.
S3에 있는 5GB짜리 병리 슬라이드 이미지를 보여달라고 하면요.
일단 EC2 서버 로컬 디스크로 wget이나 s3 cp로 긁어옵니다.
그리고 라이브러리로 열어서 타일링(Tiling)하고 클라이언트에 쏘죠.
결과는 뻔합니다.
동시 접속자 10명만 들어와도 디스크 I/O 병목 걸리고, 네트워크 대역폭 바닥납니다.
서버는 바로 뻗죠. 이건 부채(Liability)를 만드는 짓입니다.
2. 똑똑한 방법: 필요한 것만 가져오기
WSI Streamer의 핵심은 단순합니다.
파일을 통째로 받지 않습니다.
HTTP Range 요청을 씁니다. 이게 진짜 기술입니다.
S3 같은 오브젝트 스토리지에 있는 거대 파일에서, 지금 당장 화면에 보여줘야 할 '특정 바이트 구간'만 콕 집어서 요청하는 겁니다.
마치 넷플릭스 볼 때 영화 전체를 다운로드하지 않고 스트리밍하는 것과 원리가 같습니다.
이걸 Rust로 짰으니, 속도는 말할 것도 없겠죠.
3. 설치? 그냥 한 줄 치세요
복잡한 설정 파일? 환경 변수 떡칠?
그런 거 딱 질색인데, 이건 심플합니다.
cargo install wsi-streamer이게 끝입니다.
실행도 허무할 정도로 간단해요.
wsi-streamer s3://my-slides-bucket --s3-region ap-northeast-2이렇게 엔터 치면, 그 즉시 내 로컬호스트 3000번 포트가 무한대의 용량을 가진 이미지 서버로 변신합니다.
로컬 디스크 용량? 0바이트 씁니다.

4. 왜 이게 '생존' 도구인가
제가 이 도구를 주목하는 이유는 단순히 '기능' 때문이 아닙니다.
Stateless(상태 없음)를 완벽하게 지향하기 때문입니다.
서버가 로컬에 파일을 저장하는 순간, 그 서버는 '상태'를 가지게 됩니다.
상태가 생기면 오토스케일링이 어려워지고, 장애 대응이 복잡해집니다.
WSI Streamer는 중간 다리 역할만 합니다.
S3에서 바이트를 긁어와서, 즉시 JPEG 타일로 변환해 브라우저에 던져줍니다.
Aperio SVS나 Pyramidal TIFF 같은 병원 전용 포맷도 네이티브로 지원합니다.
심지어 OpenSeadragon 기반의 뷰어도 내장되어 있어서, 프론트엔드 작업 없이 바로 결과물을 검증할 수 있습니다.
5. 주의사항 (제발 이것 좀 챙기세요)
물론 만능은 아닙니다.
실무에 적용할 때 주니어들이 꼭 놓치는 게 있죠.
보안입니다.
의료 데이터는 민감합니다. 그냥 URL 열어두면 큰일 납니다.
다행히 이 툴은 HMAC-SHA256 서명된 URL 인증을 지원합니다.
--auth-enabled 옵션, 반드시 켜세요.
그리고 캐싱 전략도 신경 써야 합니다.
아무리 Range 요청이라도 S3 API 호출 비용 무시 못 합니다.
내장된 메모리 캐시(--cache-tiles) 옵션을 서버 스펙에 맞춰 적절히 조절하는 게 '운영의 묘'입니다.
마치며
개발자는 코드를 짜는 사람이 아니라, 문제를 해결하는 사람입니다.
10GB 파일을 어떻게 빨리 다운로드할까 고민하지 마세요.
'다운로드 자체를 안 하는 방법'을 찾는 게 시니어의 시각입니다.
이 도구가 완벽한 정답은 아닐 수 있습니다.
하지만 적어도 무식하게 디스크를 태워먹는 레거시 방식보다는 백 배 낫습니다.
혹시 지금 병원이나 바이오 스타트업에서 이미지 처리 파이프라인 짜고 계신 분들.
이거 한 번 테스트해보세요.
그리고 PM한테는 너무 쉽게 해결했다고 말하지 마세요.
일정 줄어드니까요.


