Minification — 정의, minification 원리 및 코드 도구

저자: IT Sectr 게시일: 2026-05-18 읽는 시간: 8 분

Minification은 소스 코드에서 공백, 탭, 줄바꿈, 주석 등 모든 필수적이지 않은 문자를 제거하는 프로세스입니다. Minification은 프로그램 실행 로직을 변경하지 않고 JavaScript, CSS 및 HTML 파일의 크기를 줄입니다. MDN Web Docs에 따르면, minification은 파일 크기를 50~70%까지 줄일 수 있으며, 이는 애플리케이션 로딩 속도와 First Contentful Paint(FCP)에 직접적인 영향을 미칩니다.

주요 내용

  • Minification — 코드 크기를 줄이기 위해 공백, 줄바꿈, 주석을 제거하고 변수 이름을 단축
  • Terser — ES6+ 구문을 지원하는 UglifyJS의 후속 제품인 주요 JavaScript minification 도구
  • esbuild — Go로 작성된 초고속 번들러 및 minifier, Webpack 및 Terser보다 10~100배 빠름
  • Source maps — 브라우저에서 minify된 코드를 원래 형태로 디버깅할 수 있는 코드 맵
  • CSS minification — 공백 제거, 16진수 색상 단축 및 CSS에서 동일한 선택자 병합

Minification이란?

Minification은 프로그램 실행에 영향을 주지 않는 모든 문자를 제거하는 소스 코드의 자동 변환입니다. 공백, 탭, 줄바꿈 문자, 주석 및 중복 괄호가 제거되거나 단축됩니다. Minification은 프로덕션에 배포하기 전에 JavaScript, CSS, HTML 및 드물게 JSON 구성에 적용됩니다.

Minification의 주요 목표는 네트워크를 통해 전송되는 파일 크기를 줄이는 것입니다. Minification 후 300KB JavaScript 파일은 120~150KB를 차지할 수 있으며, 느린 3G 연결에서 로딩 시간을 200~400ms 단축합니다. Google PageSpeed Insights와 Lighthouse는 코드 minification을 직접 권장합니다. 이는 성능 평가 및 Core Web Vitals의 기준 중 하나입니다.

Minification은 빌드 파이프라인의 필수적인 부분입니다. TypeScript 또는 Babel로 트랜스파일한 후, 코드는 Tree Shaking(사용하지 않는 함수 제거)을 거친 다음 minifier를 거친 후 최종 번들로 조립됩니다. 최신 번들러(Webpack, Rollup, esbuild)에서 minification은 빌드의 최종 단계에서 플러그인에 의해 수행됩니다.

Minification이 제거하는 것

요소예시(전)예시(후)절감
공백 및 탭let x = 5;let x=5;~10–20%
줄바꿈\n 줄 사이모두 한 줄로~2–5%
주석// comment제거됨~5–30%
중복 괄호if ((x > 0))if(x>0)~1–3%

Minification 작동 방식: 주요 기술

공백 및 줄바꿈 제거는 가장 간단하고 명백한 기술입니다. minifier 파서는 AST(추상 구문 트리)를 통과하며 문자열 리터럴의 일부가 아닌 모든 공백 문자를 제거합니다. 대부분의 minifier는 추가로 연산자를 한 줄로 결합하여 GZip 또는 Brotli로 압축할 때 추가 절감 효과를 제공합니다.

변수 이름 바꾸기(mangling)는 더 적극적인 기술입니다. 지역 변수와 함수 매개변수가 한 글자 식별자(a, b, c)로 이름이 변경됩니다. 이렇게 하면 크기가 추가로 15~30% 줄어듭니다. Terser와 esbuild는 특정 이름(예: mangle.props.reserved를 통한 공개 API)을 유지하는 옵션과 함께 mangling을 지원합니다.

데드 코드 제거

데드 코드 제거(DCE)는 절대 실행되지 않는 코드 분기를 제거합니다. minifier는 항상 false인 조건(if (false))을 분석하고 해당 블록을 제거합니다. 더 고급 분석은 minification 전 Tree Shaking 단계에서 수행되지만, minifier 수준의 DCE는 모듈 수준에서 감지되지 않은 로컬 데드 코드 사례를 잡아냅니다.

변수 이름 맹글링

Mangling은 지역 변수와 함수 매개변수를 짧은 식별자(1~2글자)로 이름을 변경합니다. Terser는 범위에 기반하여 mangling을 수행합니다. 하나의 함수 내 변수는 외부 범위와 충돌하지 않는 고유한 짧은 이름을 얻습니다. mangle.reserved 옵션을 사용하면 특정 이름(예: 공개 라이브러리 API)을 유지할 수 있습니다.

Mangling은 전역 변수, 객체 속성(mangle.props가 활성화되지 않은 경우) 또는 new와 함께 사용되는 클래스 이름에는 영향을 미치지 않습니다. 맹글링으로부터 라이브러리의 공개 API를 보호하려면 정규식과 함께 mangle.props.reserved를 사용하세요: reserved: ["_prop", /^private_/]. 이 설정이 없으면 외부 코드가 이름으로 객체 속성에 접근할 경우 mangling이 라이브러리를 손상시킬 수 있습니다.

예: Minification 전후

js
// 소스 코드
function calculateTotal(price, tax) {
    var result = price + (price * tax);
    // 총 합계 반환
    return result;
}

var total = calculateTotal(100, 0.2);
console.log(total);
js
// Terser minification 후
function calculateTotal(a, b){return a + a * b}
var c = calculateTotal(100, .2);
console.log(c);

두 번째 예에서 Terser는 주석, 공백 및 줄바꿈을 제거하고 price를 a로, tax를 b로, result를 c로 이름을 변경했습니다. 크기가 197자에서 79자로 60% 절감되었습니다. 동시에 코드 기능은 완전히 유지됩니다: calculateTotal(100, 0.2)는 120을 반환합니다.

Minification 도구: Terser, esbuild, UglifyJS

Terser는 Webpack 생태계 및 대부분의 최신 번들러에서 표준 JavaScript minifier입니다. Terser는 ES6+ 구문(화살표 함수, async/await, spread), 공개 API 보호 기능이 있는 mangling, source map 및 CPU 수에 따른 병렬 실행을 지원합니다. 버전 5.16부터 Terser에는 TypeScript 최적화(타입 전용 가져오기 및 인터페이스 제거)가 포함됩니다.

esbuild는 Go로 작성된 minifier로, 동일한 이름의 번들러에 내장되어 있습니다. esbuild는 네이티브 코드와 병렬 처리 덕분에 Terser보다 10~100배 빠르게 minification을 수행합니다. 그러나 esbuild는 더 적은 최적화를 지원합니다: 속성 유지와 함께 mangling을 수행하지 않고, 타입 전용 가져오기를 제거하지 않으며, 표현식을 덜 적극적으로 최적화합니다.

Webpack에서 Terser 구성

js
// webpack.config.js — TerserPlugin 구성
const TerserPlugin = require("terser-webpack-plugin");

module.exports = {
  optimization: {
    minimize: true,
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          compress: {
            drop_console: true,
            drop_debugger: true,
            dead_code: true,
          },
          mangle: {
            reserved: ["React", "Component"],
          },
          output: {
            comments: false,
          },
        },
        parallel: true,
      }),
    ],
  },
};

TerserPlugin 구성에는 세 가지 주요 블록이 포함됩니다. compress는 표현식 최적화를 처리합니다: drop_console은 console.log를 제거하고, drop_debugger는 debugger를 제거하고, dead_code는 도달할 수 없는 분기를 제거합니다. mangle은 공개 이름을 보호하기 위해 reserved와 함께 변수 이름 바꾸기를 제어합니다. parallel은 CPU 수에 따른 멀티스레딩을 활성화합니다.

esbuild로 CSS Minification

js
// esbuild: JS 및 CSS minification을 위한 CLI 명령
// esbuild app.js --bundle --minify --outfile=dist/app.min.js
// esbuild app.css --bundle --minify --outfile=dist/app.min.css

const esbuild = require("esbuild");

esbuild.build({
  entryPoints: ["src/app.js", "src/styles.css"],
  bundle: true,
  minify: true,
  sourcemap: true,
  target: ["es2015"],
  outdir: "dist",
}).catch(() => process.exit(1));

esbuild API는 한 줄 구성을 허용합니다. minify: true는 JS와 CSS 모두의 minification을 활성화합니다. sourcemap: true는 디버깅을 위한 코드 맵을 생성합니다. target은 최소 ES 수준을 정의합니다 — esbuild는 선택한 버전에 맞게 최신 코드를 자동으로 트랜스파일합니다. esbuild는 빌드 시간이 중요한 프로젝트(CI/CD 파이프라인, Hot Module Replacement, 빠른 프로토타입)에 특히 효과적입니다.

React Native 및 WebView에서의 Minification

React Native는 Metro Bundler를 사용합니다 — Terser 기반 minification을 포함하는 자체 번들러입니다. 프로덕션 모드에서 Metro는 애플리케이션의 JavaScript 번들에 자동으로 minification을 적용합니다. Metro의 minification 구성은 transformer.minifierConfig 섹션의 metro.config.js를 통해 설정됩니다. 또한 iOS에서 번들 크기를 줄이기 위해 inline-require를 비활성화할 수 있습니다.

모바일 애플리케이션의 WebView도 minification의 이점을 누립니다. WebView에서 로드되는 HTML, CSS 및 JS는 애플리케이션에 포함되거나 서버에서 로드되기 전에 minify되어야 합니다. 로컬 리소스(Assets)의 경우 minification이 특히 중요합니다 — APK/IPA 크기는 앱 스토어에서 설치 전환율에 직접적인 영향을 미칩니다.

Hermes와 Minification

Hermes는 Facebook이 개발한 React Native용 JavaScript 엔진입니다. Hermes는 AOT(Ahead-of-Time) 바이트코드 컴파일을 수행하여 애플리케이션 시작 시간을 30~50% 단축합니다. Hermes의 경우 JavaScript 번들 minification은 Terser를 사용하여 바이트코드 컴파일 전에 수행됩니다. Hermes는 자체 HBC(Hermes Bytecode) 형식을 지원하지만 JS minification 단계는 여전히 필요합니다.

React Native용 Metro 구성

js
// metro.config.js — minification 구성
const defaultConfig = require("metro-config/src/defaults");

module.exports = require("metro-config").mergeConfig(
  defaultConfig,
  {
    transformer: {
      minifierConfig: {
        compress: {
          drop_console: true,
        },
        mangle: {
          safari10: true,
        },
      },
    },
  }
);

Metro는 minifierConfig.drop_console을 사용하여 React Native 프로덕션 번들에서 모든 console.log를 제거합니다. mangle.safari10 매개변수는 Safari 10(iOS 10)을 손상시키는 식별자의 이름 변경을 방지합니다. 이는 iOS 10/11이 설치된 구형 iPad 및 iPhone 5s 기기를 지원하는 애플리케이션에 특히 중요합니다.

Minification과 압축의 차이점

Minification과 압축(gzip, brotli)은 다른 최적화 단계입니다. Minification은 소스 코드 수준에서 작동하며 서버로 보내기 전에 문자 수를 줄입니다. 압축은 전송 프로토콜 수준에서 작동하며 클라이언트에게 파일을 전송할 때 서버(nginx, Apache, CDN)에 의해 적용됩니다. Minification은 압축 전에 크기를 줄여 이중 효과를 제공합니다: gzip은 이미 줄어든 데이터를 압축합니다.

Minification 후 300KB JavaScript 파일 — 120KB, gzip 후 — 35~40KB. minify되지 않은 파일에만 gzip을 적용하면 크기가 55~70KB가 됩니다. Minification + gzip은 gzip 단독보다 30~40% 더 나은 결과를 제공합니다. Brotli(레벨 6)는 minification 후 gzip보다 추가로 15~20% 더 효율적으로 압축합니다.

방법레벨파일 크기감소
원본 파일300 KB0%
Minification 후코드120 KB60%
gzip 후(minification 없음)전송65 KB78%
Minification + gzip코드 + 전송38 KB87%
Minification + Brotli코드 + 전송30 KB90%

자주 묻는 질문

Minification과 uglify의 차이점은 무엇인가요?

UglifyJS는 ES6+ 구문을 지원하지 않는 구식 minification 도구입니다. Terser는 최신 JavaScript를 지원하는 UglifyJS의 포크입니다. 모든 최신 번들러(Webpack 5, Rollup, esbuild)는 Terser 또는 자체 minifier를 사용하는 반면 UglifyJS는 레거시 프로젝트에서만 사용됩니다.

Source maps 때문에 minification이 크기를 증가시키나요?

Source maps은 프로덕션 번들에 포함되지 않는 별도의 .map 파일입니다. 서버는 승인된 개발자에게만(Authorization 헤더를 통해) source map을 제공해야 합니다. 프로덕션에서 source map은 사용자의 브라우저에 의해 로드되지 않으므로 번들 크기에 영향을 미치지 않습니다.

Minification이 코드를 손상시킬 수 있나요?

손상 위험은 객체 속성 이름을 변환하는 적극적인 mangling과 함께 존재합니다. 코드가 data-attributes를 통해 DOM 요소에 접근하거나 필드 이름 지정에 JSON 문자열을 사용하는 경우 mangling이 공개 속성의 이름을 바꿀 수 있습니다. 해결책은 mangle.reserved를 통해 제외하거나 특정 네임스페이스에 대해 mangling을 비활성화하는 것입니다.

CSS minification은 필수인가요?

CSS minification은 JS minification보다 이득이 적지만(15~25%), Core Web Vitals 준수를 위해 필수적입니다. CSS minifier는 공백을 제거하고, 동일한 선택자를 병합하고, 16진수 색상을 단축하고(#ff0000 → #f00), 사용하지 않는 @keyframes를 제거합니다. CleanCSS와 esbuild는 CSS minification의 인기 있는 도구입니다.

Minify된 코드를 디버깅하는 방법은?

Source maps(.map 파일)은 minify된 코드를 원본 소스에 연결합니다. Chrome DevTools 및 Safari Web Inspector에서 source map이 활성화되면 원본 파일이 표시됩니다. 올바른 작동을 위해 source map을 서버에 업로드하고(프로덕션에서도) 개발자 도구를 통해 활성화해야 합니다.

요약

  • Minification — 로직 변경 없이 코드에서 공백, 주석 및 줄바꿈을 제거하여 파일 크기 감소
  • Terser — ES6+ 지원, mangling 및 source map을 갖춘 현대 웹의 주요 JavaScript minifier
  • esbuild — Go로 작성된 초고속 minifier, JS 및 CSS 지원, Terser보다 10~100배 빠름
  • React Native는 프로덕션 빌드를 위해 Metro Bundler와 내장 Terser minification 사용
  • Source maps은 minify된 코드 디버깅에 필요하며 개발자만 로드해야 함
  • Minification + gzip/Brotli는 이중 압축 효과 제공: 코드가 원본보다 5~10배 작아짐

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기