Skip to content
Technical

개발자를 위한 SVG 최적화: SVGO, 빌드 파이프라인 및 CI/CD 통합

개발자 중심 SVG 최적화: SVGO 구성, webpack/Vite 빌드 파이프라인 통합, CI/CD 자동화, Core Web Vitals에 미치는 영향을 설명합니다.

Robin Monteiro2026년 1월 28일2026년 10월 10일4 min
Use this article with an AI assistant:
.md
개발자를 위한 SVG 최적화: SVGO, 빌드 파이프라인 및 CI/CD 통합
R
Robin Monteiro

Founder of VectoSolve

Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.

How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author

Image vectorizationCutting machine filesEmbroidery filesSVG
Free previewNo signupFull-quality output

Key Takeaways

  • 조정된 svgo.config.js를 사용한 SVGO는 시각적 손실 없이 SVG 파일 크기를 60-85% 줄입니다
  • 경로 단순화(소수점 정밀도 + 불필요한 노드)가 가장 효과가 큰 최적화입니다
  • 과도한 최적화는 CSS 애니메이션과 currentColor를 깨뜨립니다 -- SVGO 후 반드시 테스트하세요
  • Gzip은 추가로 70-80% 절감합니다; Brotli는 그 위에 5-8% 더 압축합니다
  • Intersection Observer를 사용한 지연 로딩으로 화면 밖 렌더링 비용을 제거합니다
  • 빌드 파이프라인 통합(Vite, webpack, Next.js)으로 최적화를 팀에 투명하게 만듭니다

SVG 파일은 모던 웹 그래픽의 근간입니다 -- 확장 가능하고, 스타일링 가능하며, 애니메이션 가능하고, 일반적으로 래스터 대안보다 작습니다. 하지만 Figma나 Illustrator에서 내보낸 최적화되지 않은 SVG는 PNG보다 더 클 수 있으며 Core Web Vitals를 망칠 수 있습니다.

저는 8년간 프로덕션 환경에서 SVG를 배포해왔습니다. 이것은 첫날에 갖고 싶었던 플레이북입니다.

SVG 최적화 워크플로우: 내보내기부터 프로덕션까지
전체 SVG 최적화 파이프라인: 내보내기, 정리, 최적화, 압축, 배포

SVG 최적화가 성능 예산 항목인 이유

최적화되지 않은 SVG에는 에디터 메타데이터, 12자리 소수점 정밀도의 불필요한 경로, 반복되는 인라인 스타일, 사용하지 않는 그라디언트/필터 정의, xml:space 같은 XML 잔여물이 포함될 수 있습니다. 실제 감사 결과: 52KB 히어로 일러스트가 최적화 후 7.8KB로 -- 85% 감소.

Core Web Vitals 영향: SVG 최적화는 스크롤 없이 보이는 영역의 SVG에 대한 LCP(Largest Contentful Paint)를 직접 개선하고 DOM 노드를 줄여 TBT를 낮춥니다. Google의 페이지 경험 업데이트는 LCP에 높은 가중치를 둡니다 -- 히어로 SVG에서 40KB를 줄이면 3G에서 LCP를 200-400ms 개선할 수 있습니다. 최적화되지 않은 SVG를 제공하고 있다면, 랭킹 시그널을 놓치고 있는 것입니다.

SVGO 구성 가이드

SVGO는 업계 표준 옵티마이저입니다. 기본 설정으로 실행하면 성능 개선의 여지를 남깁니다. 조정된 구성이 필요합니다.

CLI vs Node API

bash
# CLI -- 단일 파일과 CI 스크립트
npx svgo input.svg -o output.svg --config svgo.config.js

# 디렉토리 일괄 최적화
npx svgo -f ./src/icons -o ./dist/icons --config svgo.config.js
javascript
// Node API -- 빌드 파이프라인 통합
import { optimize } from 'svgo';
import { readFileSync, writeFileSync } from 'fs';

const result = optimize(readFileSync('icon.svg', 'utf8'), {
  multipass: true,
  plugins: [
    'preset-default',
    'removeDimensions',
    { name: 'removeAttrs', params: { attrs: '(data-.*|class)' } },
  ],
});
writeFileSync('icon.opt.svg', result.data);

프로덕션 svgo.config.js

javascript
module.exports = {
  multipass: true,
  plugins: [
    {
      name: 'preset-default',
      params: {
        overrides: {
          removeViewBox: false,
          convertPathData: { floatPrecision: 2, transformPrecision: 3 },
          mergePaths: { force: true },
        },
      },
    },
    'removeDimensions',
    'sortAttrs',
    { name: 'removeAttrs', params: { attrs: ['xml:space', 'data-name'] } },
  ],
};

Pro Tip: 프로덕션 svgo.config.js 모범 사례: 항상 removeViewBox: false를 설정하세요 -- 제거하면 반응형 스케일링이 깨집니다. 아이콘에는 floatPrecision: 2, 상세한 일러스트에는 3을 사용하세요. 각 패스가 추가 최적화를 가능하게 하도록 multipass: true를 활성화하세요. 모든 개발자와 CI 실행이 동일한 설정을 사용하도록 구성을 리포지토리에 커밋하세요.

Before/After: 메타데이터와 에디터 비대화 제거

모든 디자인 도구는 자체 흔적을 남깁니다:

xml
<!-- 최적화 전: 680바이트 낭비 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
     version="1.1" id="Layer_1" x="0px" y="0px" width="200px" height="200px"
     viewBox="0 0 200 200" style="enable-background:new 0 0 200 200;"
     xml:space="preserve">
  <!-- Generator: Adobe Illustrator 28.0 -->
  <metadata><rdf:RDF><rdf:Description/></rdf:RDF></metadata>
  <defs><linearGradient id="unused_grad">...</linearGradient></defs>
xml
<!-- 최적화 후: 깔끔하고 프로덕션 준비 완료 -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">

제거된 것: version, 고정 치수, xml:space, enable-background, 생성기 주석, 빈 메타데이터, 사용하지 않는 defs. 작은 아이콘에서 680바이트 절약 -- 40개 심볼 스프라이트에서 이를 곱해보세요.

경로 노드 감소: 최적화 전후
48개 제어점이 19개로 감소 -- 화면 해상도에서 시각적으로 동일

A Full Year of Conversions for $49

Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime

Get the Annual Deal

경로 단순화: 시각적 손실 없는 노드 감소

경로는 SVG 바이트의 대부분이 존재하는 곳입니다. 디자이너는 수십 개면 충분한 곳에 수백 개의 노드로 경로를 만듭니다.

xml
<!-- 최적화 전: 12자리 소수점 정밀도 -->
<path d="M10.123456789012 20.987654321098 C15.111111111111 25.222222222222
  30.333333333333 40.444444444444 45.555555555555 50.666666666666"/>

<!-- 최적화 후: 2자리 소수점 정밀도, 시각적으로 동일 -->
<path d="M10.12 20.99C15.11 25.22 30.33 40.44 45.56 50.67"/>

화면 해상도에서 시각적 차이? 제로. 바이트 절약? 58%. 노드 감소를 시각적으로 확인하려면 VectoSolve의 SVG 에디터를 사용하세요.

최적화 기법 비교

기법크기 감소위험 수준사용 시기
메타데이터와 주석 제거5-15%없음항상 -- 시각적 영향 제로
소수점 정밀도 감소 (2-3)15-30%낮음아이콘, UI 요소, 로고
경로 병합 및 단순화10-25%중간시각적 QA 체크 후
사용하지 않는 defs와 심볼 제거5-20%낮음항상 -- 데드 코드 제거
그룹과 컨테이너 축소3-8%낮음CSS가 그룹을 대상으로 하지 않을 때
인라인 스타일을 attribute로 변환2-10%낮음HTML 내 인라인 SVG용
Gzip 압축 (서버)70-80%없음항상
Brotli 압축 (서버)75-85%없음CDN이 지원할 때

SVG 내 CSS: 인라인 vs 외부 스타일시트

xml
<!-- 인라인 스타일: 비대하지만 자체 포함 -->
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>
<path style="fill:#ff0000;stroke:#000;stroke-width:2" d="..."/>

<!-- 통합된 <style>: 더 작고 자체 포함 -->
<style>.a{fill:#f00;stroke:#000;stroke-width:2}</style>
<path class="a" d="..."/>
<path class="a" d="..."/>

<!-- 프레젠테이션 attribute: 가장 작고 인라인 SVG에 최적 -->
<path fill="#f00" stroke="#000" stroke-width="2" d="..."/>

인라인 SVG에는 프레젠테이션 attribute를 사용하세요 -- 외부 CSS로 오버라이드 가능하고 스코프 문제 없음. 독립 파일에는 <style> 블록이 잘 작동합니다.

Warning: 과도한 최적화는 애니메이션을 깨뜨립니다. SVG가 CSS 애니메이션, currentColor, JS 리스너 또는 SMIL을 사용하는 경우: removeHiddenElems는 애니메이션 대상을 제거하고, collapseGroups는 그룹 변환을 파괴하며, cleanupIds는 CSS/JS가 참조하는 ID를 이름 변경하고, removeUselessStrokeAndFill은 호버 상태 스트로크를 제거합니다. 최적화된 SVG는 반드시 컨텍스트에서 테스트하세요.

Free SVG Tools for Crafters

Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG

Check Your SVG Free

Gzip과 Brotli 압축 통계

SVG는 XML입니다 -- 놀라울 정도로 잘 압축됩니다:

에셋원본SVGOGzipBrotli
히어로 일러스트52KB7.8KB2.4KB2.1KB
아이콘 스프라이트 (40개)38KB11KB3.2KB2.8KB
애니메이션 로고18KB9.2KB3.1KB2.7KB
복잡한 인포그래픽124KB34KB9.8KB8.6KB

Brotli는 SVG에서 Gzip보다 5-15% 더 나은 성능을 보입니다. Cloudflare, Vercel, Netlify는 기본적으로 지원합니다.

"

전송하는 모든 킬로바이트는 사용자의 브라우저가 다운로드, 파싱, 렌더링해야 하는 킬로바이트입니다. 최적화된 SVG는 있으면 좋은 것이 아닙니다 -- 성능 예산 항목입니다.

— Addy Osmani

SVG 많은 페이지의 지연 로딩

페이지에 스크롤 아래에 20개 이상의 SVG가 있다면, 모두를 페인트 시점에 로드하지 마세요:

javascript
const observer = new IntersectionObserver((entries) => {
  entries.forEach((entry) => {
    if (entry.isIntersecting) {
      const img = entry.target;
      img.src = img.dataset.src;
      observer.unobserve(img);
    }
  });
}, { rootMargin: '200px' });

document.querySelectorAll('img[data-src$=".svg"]').forEach(img => observer.observe(img));

200px rootMargin으로 브라우저에 선행 로딩 여유를 줍니다. 레이아웃 시프트 제로, 낭비되는 대역폭 제로.

개발자가 SVG를 빌드 파이프라인에 통합
SVGO가 빌드 파이프라인을 통해 매 커밋마다 자동 실행

빌드 파이프라인 통합: Webpack, Vite, Next.js

수동 최적화는 확장되지 않습니다. SVGO를 빌드 도구에 연결하세요.

Vite

javascript
import svgLoader from 'vite-svg-loader';
export default defineConfig({
  plugins: [svgLoader({
    svgoConfig: { multipass: true, plugins: ['preset-default', 'removeDimensions'] },
  })],
});

Webpack

javascript
{ test: /\.svg$/, use: [
  { loader: 'svg-url-loader', options: { limit: 8192 } },
  { loader: 'svgo-loader', options: { configFile: './svgo.config.js' } },
]}

Next.js

javascript
config.module.rules.push({
  test: /\.svg$/,
  use: ['@svgr/webpack', {
    loader: 'svgo-loader',
    options: { configFile: './svgo.config.js' },
  }],
});

파이프라인 통합으로 최적화가 빌드 시간에 실행됩니다. 수동 단계 없음, 잊혀진 파일 없음.


A Full Year of Conversions for $49

Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime

Get the Annual Deal

전체 최적화 체크리스트

  1. 디자인 도구에서 깔끔하게 내보내기
  2. 커밋된 구성으로 SVGO 실행 -- 또는 시각적 워크플로우를 위해 VectoSolve로 최적화
  3. 시각적으로 검증 -- 최적화 전후 차이를 확인, 특히 애니메이션
  4. 압축 활성화 -- 최소한 Gzip, CDN이 지원하면 Brotli
  5. 스크롤 아래 SVG 지연 로딩 -- Intersection Observer 사용
  6. CI에서 자동화 -- 파이프라인에 SVGO를 넣어 최적화되지 않은 것이 배포되지 않도록

래스터 이미지를 최적화된 SVG로 변환해야 하나요? VectoSolve가 벡터화와 최적화를 한 단계에서 처리합니다. 또는 경로와 출력 품질의 세밀한 제어를 위해 SVG 에디터를 사용하세요.


질문이나 최적화 경험담이 있으신가요? contact@vectosolve.com으로 연락주세요.


최적화 기법일반적인 크기 감소위험 수준
조정된 구성의 SVGO60–85%낮음 (테스트 필요)
소수점 정밀도 감소 (8 → 2)20–40%단순 그래픽에서 낮음
에디터 메타데이터 제거10–30%없음
경로 단순화15–50%중간 (곡선 변경 가능)
Brotli 압축 (서버)전송 크기 75–90%없음 (무손실)

참고 자료 및 추가 읽을거리

Tags:
svg
최적화
웹 성능
프론트엔드
튜토리얼
Share:

Try VectoSolve Now

Convert your images to high-quality SVG vectors with AI

AI-Powered Vectorization

Ready to vectorize your images?

Convert your PNG, JPG, and other images to high-quality, scalable SVG vectors in seconds.