Transcript
00:00:00이것은 Bun 1.3.14에 탑재된 내장 이미지 처리 API인 Bun Image로, 이미지 크기 조정,
00:00:06자르기, 형식 변환 등을 네이티브 종속성 없이 수행할 수 있으며,
00:00:10모든 작업이 메인 스레드 외부에서 실행되므로 처리 중에도 서버가 차단되지 않습니다.
00:00:14그런데 Bun은 이미 런타임, 패키지 매니저, 번들러, 테스트 러너인데,
00:00:19이제 이미지 프로세서까지 된다고요? 너무 과한 걸까요, 아니면 Bun이 나아갈
00:00:24방향에 대해 더 큰 의미를 시사하는 걸까요? 구독하고 확인해 보시죠.
00:00:30자바스크립트로 서버에서 이미지를 처리해 본 적이 있다면 아마 Sharp라는 라이브러리를
00:00:35자신도 모르게 사용했을지도 모릅니다. 매주 npm 다운로드 수가 5천 5백만 건이 넘고,
00:00:41Next.js에서도 이미지 최적화를 위해 내부적으로 사용하죠. 하지만 Sharp는 libvips라는 네이티브 바이너리에 의존합니다.
00:00:47즉, 설치할 때마다 플랫폼에 맞는 빌드를 가져와야 합니다. Docker 빌드나
00:00:51CI 파이프라인이 이 문제로 실패해 본 적이 있다면 얼마나 짜증 나는지 아실 겁니다. 그래서 Bun은
00:00:57런타임 자체에 이미지 처리를 내장하기로 했고, 실제 대부분의 벤치마크에서 Sharp보다 빠릅니다.
00:01:02메타데이터 읽기는 70배 더 빠르고, 크기 조정은 약 30% 더 빠릅니다. 많은
00:01:08개발자들이 왜 Bun이 이걸 추가했는지 의아해하지만, 저는 이 모든 것이 어디로 향하는지 어느 정도 보입니다.
00:01:13나중에 그 이야기를 좀 들려드릴게요. 우선 Bun 이미지 API를 사용하는 몇 가지 데모를 살펴보겠습니다.
00:01:17제 블로그에서 시도해 볼 텐데, 정적 Waku 사이트로 꽤 큰 이미지들이 있습니다.
00:01:22우선 이미지 하나를 최적화하는 간단한 스크립트부터 살펴보죠.
00:01:27제 얼굴이 나온 프로필 사진인데, 크기를 99%나 줄일 수 있었습니다. 정말 놀랍죠.
00:01:33방법을 보죠. 먼저 이미지를 가져옵니다. 여기서는 Bun.image를 사용하고 있지만,
00:01:37image 함수와 함께 Bun file을 사용할 수도 있습니다. 그다음 크기를 줄이기 위해 이미지를 조정하고, 너비를 800픽셀로
00:01:43설정하면 높이는 가로세로 비율에 맞춰 자동으로 계산됩니다. 원한다면
00:01:47여기서 직접 지정할 수도 있고요. 출력 형식을 품질이 낮아진 WebP로 설정합니다. 물론,
00:01:52다른 출력 형식도 지원합니다. 그런 다음 새 이미지를 파일로 출력하는데,
00:01:56이는 Promise이므로 await 키워드가 필요합니다. 얼마나 간단한지 보이시죠?
00:02:01사실 여기 있는 모든 코드는 불필요하므로 제거해서 더 간단하게 만들 수도 있습니다.
00:02:06크기 조정 필터를 설정해 리샘플링 커널을 변경함으로써 이미지 크기를 더 줄일 수도 있습니다.
00:02:10이미지를 회전하거나 뒤집을 수도 있는데, 이건 정말 멋집니다. 심지어 밝기나
00:02:15채도를 변경할 수도 있죠. 이상하게 보일 수도 있겠지만요. 하지만 연결 속도가
00:02:19느릴 때 정말 유용한 영리한 방법이 있습니다. 바로 플레이스홀더 기능을 사용하는 것입니다.
00:02:23메인 이미지가 로딩되는 동안 흐릿한 이미지를 자동으로 보여주는 것이죠. 이를 위해 for 문을 사용하여
00:02:29블로그 이미지가 포함된 디렉토리 내의 해당 확장자를 가진 모든 파일을 순회합니다.
00:02:34각 이미지는 자르지 않고 크기가 조정되고 축소되며, 확대되지는 않습니다.
00:02:39그다음 각 이미지에 대한 플레이스홀더를 만드는데, 이는 썸 해시(thumb hash)를 생성합니다.
00:02:45즉, 이미지를 28바이트 해시로 인코딩하여 흐릿한 이미지 플레이스홀더로 쓰기에 완벽합니다.
00:02:49이 해시는 플레이스홀더 객체에 추가된 다음 파일로 작성되는데,
00:02:53그 결과물은 이렇습니다. 플레이스홀더가 별도의 작은 WebP 이미지가 아닌
00:02:58base64 이미지인 이유는 네트워크에서 이를 가져오기 위한 별도의 요청을 만들지 않기 위해서입니다.
00:03:02그래서 저는 모든 플레이스홀더를 임포트해서 CSS의 배경 이미지로 추가할 수 있는데,
00:03:07이렇게 하면 제 블로그의 모든 이미지에 적용됩니다.
00:03:11만약 MDX 파일의 단일 이미지에 그렇게 하고 싶다면, base64 코드를
00:03:16수동으로 추가하면 똑같이 잘 작동합니다. 참고로, JPEG 이미지의 경우
00:03:20progressive 옵션을 true로 설정하면 비슷한 동작을 구현할 수 있습니다. 물론 Bun 이미지에는
00:03:24제가 아직 다루지 않은 다른 많은 기능도 있습니다. 예를 들어 S3 호환 버킷에서
00:03:28이미지를 가져오거나, 버킷에 이미지를 작성하거나, 이미지 파이프라인을 유효한 응답 본문으로 사용하거나,
00:03:33특정 OS에서 지원하지 않는 형식을 위한 대체 형식을 구성하는 것 등이 가능합니다.
00:03:37그래서 사용할 가치가 있을까요? 이미 Bun을 사용 중이라면 고민할 필요도 없죠.
00:03:41하지만 Node를 사용하고 있다면 Sharp가 매우 잘 작동하고 검증된 도구이므로,
00:03:45단지 이미지 처리 때문에 완전히 다른 런타임으로 바꿀 필요는 없습니다.
00:03:49아까 Bun이 이걸 추가한 더 큰 이유가 있다고 했던 거 기억하시나요? 작년부터
00:03:54Bun이 해온 일들을 보면 SQLite, S3, Postgres 내장에 이어 이미지까지 추가했으니,
00:03:59인증과 이메일을 제외하면 풀스택 앱에 필요한 모든 것을 갖춘 셈입니다. 문득 궁금해집니다.
00:04:04Bun이 런타임 수준에서 자바스크립트를 위한 Laravel이나 Rails를 만들려는 걸까요? 만약 그렇다면,
00:04:11다음 작업은 인증일 것입니다. 만약 정말 그렇다면 여기서 처음 들으신 겁니다.
00:04:15하지만 아쉽게도 요즘은 Zig에서 Rust로의 거대한 재작성 언급 없이는
00:04:20Bun에 대해 말하기 어렵죠. 다음 버전에서는 부디 잘 해결되기를 바랍니다.
00:04:25Zig 이야기가 나와서 말인데, Zig처럼 보이지만 Zig은 아니며 AI 에이전트를 위해
00:04:29만들어진 Vercel의 Language Zero에 대해 더 알고 싶다면 James의 영상을 확인해 보세요.
Community Posts
No posts yet. Be the first to write about this video!
Write about this video