Go로 이미지 호스팅 서버를 개발하던 중, 이미지 리사이즈 기능을 구현하는 과정에서 고민했던 점들을 정리해보았다.
go 주요 이미지 리사이즈 라이브러리 비교
라이브러리
장점
단점
bimg
- libvips 기반으로 매우 빠른 처리 속도 - 메모리 사용량이 적음 - 다양한 이미지 포맷 지원
- C 바인딩으로 인한 설치 복잡도 증가 - libvips 의존성 필요 - Windows 환경에서 설정이 까다로움
imaging
- 순수 Go로 작성되어 설치가 간단 - 크로스 플랫폼 지원이 용이 - API가 직관적이고 사용하기 쉬움
- 처리 속도가 상대적으로 느림 - 메모리 사용량이 많음 - 일부 고급 이미지 처리 기능 부재
nfnt/resize
- 가볍고 단순한 구현 - 순수 Go로 작성되어 의존성이 없음 - 기본적인 리사이즈 기능 제공
- 성능이 상대적으로 낮음 - 고급 이미지 처리 기능 부재 - 메모리 사용량이 많음 - 지원이 종료됨
imgproxy
- 다양한 이미지 처리 옵션 제공 - 캐싱 기능 내장 - 고성능 처리
- 별도의 서비스로 실행 필요 - 설정이 복잡함 - 리소스 사용량이 많음
라이브러리 선택 과정
1. 초기 고려사항
- 순수 Go로 작성된 라이브러리 선호 (설치 간편성)
- 기본적인 리사이즈 기능만 필요
2. 시도한 라이브러리들
- `github.com/nfnt/resize`: 순수 Go로 작성되어 설치가 간단했으나, WebP 미지원
- `github.com/disintegration/imaging`: 순수 Go로 작성되어 설치가 간단했으나, WebP 지원이 제한적
3. bimg 선택 이유
- libvips 기반으로 매우 빠른 처리 속도
- WebP를 포함한 다양한 이미지 포맷 지원
- 메모리 효율적인 처리
- Docker 환경에서 쉽게 설정 가능
- 활발한 커뮤니티와 안정적인 업데이트
4. 선택 후 고려사항
- libvips 설치 필요성
- Docker 환경에서의 설정
webp 확장자를 지원하는 라이브러리 중 비교적 간단하게 관리할 수 있는 bimg를 선택하게 되었다.