이미지가 작아지는 마지막 비밀, '엔트로피 코딩'
사진 한 장이 어떻게 그렇게 작은 용량으로 줄어드는지 궁금했던 적 있으세요? 한 개발자가 libwce라는 라이브러리를 공개했는데요, 이름이 'wavelet codec entropy layer'에서 왔어요. 쉽게 말하면 영상·이미지 압축기(코덱)의 여러 부품 중에서, 가장 핵심이자 복잡한 '엔트로피 계층'만 똑 떼어내서 독립적으로 쓸 수 있게 만든 거예요. 왜 이게 흥미로운지 알려면 먼저 압축이 어떻게 돌아가는지 한 번 짚고 가야 해요.
압축은 보통 세 단계로 움직여요
이미지 코덱은 대개 변환 → 양자화 → 엔트로피 코딩 순서로 동작하거든요.
첫 단계인 변환에서 자주 쓰이는 게 웨이블릿 변환(wavelet transform)이에요. 이게 뭐냐면, 그림을 '큰 윤곽'과 '세밀한 디테일'로, 그것도 여러 크기 단계로 쪼개는 방법이에요. 멀리서 보면 큰 덩어리만 보이고 가까이서 보면 잔디 한 올까지 보이는 것처럼요. 이렇게 나누면 중요한 정보가 몇 군데로 모여서 압축하기 좋아져요. 우리가 아는 JPEG2000이 바로 이 방식을 써요.
두 번째 양자화는 사람 눈에 잘 안 보이는 미세한 디테일을 과감히 버려서 데이터를 줄이는 단계예요. 여기서 화질 손실이 생기는 대신 용량이 확 줄죠.
진짜 주인공, 엔트로피 코딩
마지막 엔트로피 코딩이 오늘의 주인공이에요. 이건 손실 없이(lossless) 데이터를 더 짧게 다시 적는 단계인데요, 핵심 아이디어는 '자주 나오는 건 짧게, 드물게 나오는 건 길게' 적는 거예요. 한국어로 치면 자주 쓰는 '의', '를' 같은 글자에 짧은 암호를 주고, 어쩌다 나오는 글자에 긴 암호를 주는 식이죠. 모스 부호에서 자주 쓰는 E를 점 하나로 표현하는 것과 똑같은 원리예요.
방법으로는 허프만 코딩(Huffman), 산술 코딩(arithmetic coding), 레인지 코딩, 그리고 요즘 뜨는 ANS(비대칭 수 체계)가 있어요. libwce는 바로 이 엔트로피 계층만 독립 라이브러리로 떼어냈어요. 보통 코덱 안에 꽁꽁 묶여 있어서 따로 뜯어 보기 어려운 부분인데, 이렇게 분리하면 성능을 따로 측정하고, 다른 프로젝트에 재사용하고, 공부용으로 뜯어보기가 훨씬 쉬워지거든요. 가장 까다로운 부품을 모듈로 빼낸 거라 의미가 커요.
업계 흐름에서 보면
압축 기술의 역사가 곧 엔트로피 코딩의 발전사라고 해도 과언이 아니에요. 옛날 JPEG은 DCT 변환에 허프만 코딩을 썼고, JPEG2000은 웨이블릿에 산술 코딩을 얹었죠. 요즘은 ANS가 대세인데, 압축 도구인 Zstandard(zstd)나 차세대 이미지 포맷 JPEG XL, 그리고 여러 영상 코덱이 이 방식을 채택하고 있어요. 속도와 압축률을 동시에 잡았거든요. libwce처럼 한 계층을 떼어내 공개하는 시도는, 거대한 코덱 표준을 처음부터 다 이해하기 버거운 사람들에게 좋은 학습 통로가 돼요.
한국 개발자에게는
압축은 생각보다 우리 일상 코드 곳곳에 숨어 있어요. 이미지 서빙 비용을 줄이거나, 웹 페이지 로딩 속도를 높이거나, 요즘은 머신러닝 모델 용량을 줄일 때도 압축 원리가 그대로 쓰이거든요. 엔트로피 코딩의 '자주 나오는 건 짧게'라는 직관 하나만 제대로 잡아둬도, 데이터를 다루는 감각이 달라져요. 당장 libwce를 프로덕션에 넣진 않더라도, 이렇게 잘 분리된 작은 라이브러리는 원리를 손으로 만져보며 배우기에 딱 좋아요.
한 줄 정리
압축의 마지막 단계 '엔트로피 코딩'은 자주 나오는 데이터를 짧게 적는 기술이고, libwce는 그 핵심 부품만 따로 떼어내 들여다볼 수 있게 해줬어요. 여러분은 프로젝트에서 압축 때문에 고민해본 적 있으세요? 어떤 상황이었는지 댓글로 풀어주세요.
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공