UI 디자인을 위한 SVG 아이콘: 2026 완벽 가이드
UI 디자인 SVG 아이콘 완벽 가이드: 24×24 그리드, 스트로크 일관성, 접근성, 다크 모드, SVG 스프라이트, Figma 내보내기 워크플로우.
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
Key Takeaways
- 모든 SVG 아이콘을 24×24 픽셀 그리드에서 일관된 2 px 스트로크로 디자인하여 컴포넌트 라이브러리의 광학적 조화 보장
- SVG 스프라이트 시트와 React 래퍼 컴포넌트가 아이콘 폰트를 확장성, 접근성, 테마 지원에서 능가
-
aria-label,role="img",<title>의 올바른 사용으로 아이콘을 보조 기술을 위한 의미 있는 인터페이스 어휘로 변환 -
CSS 커스텀 속성(
--icon-color,--icon-size)으로 다크 모드와 멀티 브랜드 테마를 단일 토큰 변경으로 처리 - SVGO 최적화와 결합된 Figma-SVG 내보내기 파이프라인으로 각 아이콘을 500바이트 이하로 유지
SVG 아이콘이 프로덕션 UI의 유일한 진지한 선택인 이유
아이콘 폰트는 시대가 지났습니다. PNG 스프라이트도 마찬가지입니다. 둘 다 브레이크포인트, 색상 테마, 접근성 요구사항에 걸쳐 확장해야 하는 디자인 시스템의 약점입니다. SVG 아이콘은 프로덕션 인터페이스를 출시하는 팀을 위한 유일하게 아키텍처적으로 건전한 선택입니다.
SVG 아이콘은 일급 DOM 노드입니다. CSS 커스텀 속성에 응답하고, 접근성 트리에 참여하며, 품질 손실 없이 확장되고, 표준 CSS 트랜지션으로 애니메이션됩니다.
"아이콘은 사용자 인터페이스의 어휘입니다. 어휘가 틀리면 제품이 말하는 모든 문장이 혼란스러워집니다.
아이콘 디자인 원칙: 그리드, 스트로크, 광학적 일관성
24×24 그리드 표준
일관된 시스템의 모든 아이콘은 같은 캔버스에서 시작합니다. 24×24 픽셀 그리드는 일반적인 크기(12, 16, 20, 48)로 균등 분할됩니다.
Pro Tip: 모든 아이콘을 24×24 그리드, 2 px 스트로크 너비, 2 px 패딩(안전 영역), 둥근 라인 캡/조인으로 디자인하세요. 이 단일 제약이 다른 소스의 아이콘을 혼합할 때 발생하는 광학적 불일치 문제의 90%를 제거합니다.
스트로크 일관성과 시각적 무게
24×24에서 2 px 스트로크는 예측 가능하게 확장: 16 px에서 ~1.33 px, 48 px에서 4 px.
- 세트당 하나의 스트로크 너비. 1.5 px 또는 2 px를 선택하여 전역 적용.
- 일관된 캡과 조인 스타일. 둥근 캡은 둥근 조인과. 절대 혼합 금지.
- 곡선의 광학 보정. 20 px 원은 20 px 정사각형보다 작아 보임 — 20.5 px로 조정.
Warning: 일관성 없는 아이콘 스타일은 UI 품질을 조용히 파괴합니다. 아웃라인과 필드 아이콘 혼합, 스트로크 너비 변동, 둥근 모서리와 날카로운 모서리 조합은 제품이 세심하게 디자인되지 않았음을 사용자에게 신호합니다.
SVG 아이콘 시스템 아키텍처
| 기준 | 아이콘 폰트 | SVG 스프라이트 | 인라인 SVG | React 컴포넌트 |
|---|---|---|---|---|
| 확장성 | 좋음 | 완벽 | 완벽 | 완벽 |
| 멀티컬러 | 불가 | 가능 | 가능 | 가능 |
| CSS 테마 | 제한적 | 완전 | 완전 | 완전 |
| 접근성 | 나쁨 | 좋음 | 우수 | 우수 |
| Tree-shaking | 불가 | 불가 | N/A | 가능 |
| 애니메이션 | 없음 | 제한적 | 완전 | 완전 |
| 번들 영향 | ~50-200 KB | ~10-80 KB | ~0.3-1 KB 각 | ~0.5-1.5 KB 각 |
| 다크 모드 | 취약 | 견고 | 견고 | 견고 |
SVG 스프라이트 패턴
<svg xmlns="http://www.w3.org/2000/svg" style="display:none">
<symbol id="icon-check" viewBox="0 0 24 24">
<polyline points="20,6 9,17 4,12" fill="none"
stroke="currentColor" stroke-width="2"/>
</symbol>
</svg>
<svg width="24" height="24" aria-hidden="true">
<use href="#icon-check"/>
</svg>
React 컴포넌트 패턴
interface IconProps extends React.SVGProps<SVGSVGElement> {
size?: number;
label?: string;
}
export function CheckIcon({ size = 24, label, ...props }: IconProps) {
return (
<svg width={size} height={size} viewBox="0 0 24 24"
fill="none" stroke="currentColor" strokeWidth={2}
role={label ? 'img' : undefined}
aria-label={label} aria-hidden={label ? undefined : true}
{...props}>
<polyline points="20,6 9,17 4,12" />
</svg>
);
}
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 아이콘은 장식용 또는 의미용입니다.
장식용 (보이는 텍스트 옆 — 스크린 리더에서 숨김):
<button>
<svg aria-hidden="true" focusable="false"><!-- 아이콘 --></svg>
문서 저장
</button>
의미용 (유일한 인터랙티브 요소 — 자신을 알려야 함):
<button aria-label="대화상자 닫기">
<svg role="img" aria-labelledby="close-title" focusable="false">
<title id="close-title">닫기</title>
<path d="M18 6L6 18M6 6l12 12" stroke="currentColor" stroke-width="2"/>
</svg>
</button>
role="img" 속성은 보조 기술에 SVG를 자식 노드를 탐색하지 않고 단일 이미지로 처리하도록 지시합니다. <title> 요소를 가리키는 aria-labelledby와 결합하여 최대 호환성을 달성하세요. 레거시 브라우저에서 팬텀 탭 스톱을 방지하기 위해 항상 focusable="false"를 추가하세요.
다크 모드와 CSS 커스텀 속성 테마
:root {
--icon-color-primary: #1a1a2e;
--icon-color-success: #059669;
--icon-size-md: 24px;
--icon-stroke: 2px;
}
@media (prefers-color-scheme: dark) {
:root {
--icon-color-primary: #e5e7eb;
--icon-color-success: #34d399;
}
}
.icon {
width: var(--icon-size-md);
height: var(--icon-size-md);
stroke: var(--icon-color-primary);
stroke-width: var(--icon-stroke);
transition: stroke 0.2s ease;
}
다크 모드로 전환은 아이콘 코드 변경 제로입니다. 토큰이 업데이트되면 모든 아이콘이 따라갑니다.
성능 최적화
커밋 전 모든 아이콘을 VectoSolve SVG 옵티마이저 또는 SVGO로 처리하세요. 일반적인 24×24 아이콘은 최적화 후 200~500바이트 사이여야 합니다.
- 인라인 SVG: ATF 핵심 아이콘용. 네트워크 오버헤드 제로.
- 외부 스프라이트 시트: BTF 아이콘용. 단일 요청, 장기 캐시.
- 동적
import(): 드물게 보이는 아이콘용.
CLS를 방지하기 위해 SVG 요소에 항상 명시적 width와 height를 설정하세요.
Free SVG Tools for Crafters
Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG
Check Your SVG FreeFigma-SVG 내보내기 워크플로우
- Figma에서 정리.
icon/check,icon/alert-triangle등의 24×24 프레임. - 평탄화 및 아웃라인. 불리언 그룹 평탄화, 스트로크 아웃라인화.
- SVG로 내보내기. "Outline text" 켜짐, "Include id" 꺼짐.
- 최적화. VectoSolve 옵티마이저로 메타데이터 제거 및 정밀도 축소.
- 검증. 16, 24, 48 px에서 정확히 렌더링되는지 확인.
- 컴포넌트 생성. SVGR 또는 커스텀 스크립트로 프레임워크 컴포넌트 변환.
아이콘 애니메이션과 마이크로인터랙션
스트로크 드로잉 애니메이션
.icon-check polyline {
stroke-dasharray: 24;
stroke-dashoffset: 24;
transition: stroke-dashoffset 0.25s cubic-bezier(0.65, 0, 0.35, 1);
}
.checkbox:checked + .icon-check polyline {
stroke-dashoffset: 0;
}
회전과 모핑
.icon-loading { animation: spin 0.8s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
Pro Tip: 아이콘 애니메이션을 300 ms 이하로 유지하고 상태 변화 순간에만 사용하세요. 전정 장애가 있는 사용자를 위해 항상 prefers-reduced-motion 미디어 쿼리로 감싸세요.
오늘 아이콘 시스템을 구축하세요
VectoSolve는 래스터-벡터 변환부터 SVG 최적화, 라이브 SVG 편집까지 모든 단계에서 SVG 아이콘을 변환, 최적화, 편집하는 도구를 제공합니다.
| 통합 방법 | 장점 | 단점 |
|---|---|---|
| 인라인 SVG | 완전한 CSS/JS 제어, 추가 요청 없음 | 과다 사용 시 HTML 비대화 |
| SVG 스프라이트 시트 | 단일 HTTP 요청, 캐시 가능 | 일부 경우 외부 CSS 스타일링 불가 |
| React 컴포넌트 (SVGR) | Tree-shakeable, 타입된 props | 빌드 단계 필요 |
| 아이콘 폰트 | 사용 간편, 광범위한 지원 | 접근성 나쁨, 멀티컬러 불가 |
| <img> 태그 | 간단, 캐시 가능 | CSS/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참고 자료
- MDN Web Docs: SVG Icons — SVG 요소, ARIA 역할, 접근 가능한 아이콘 마크업 기술 참조
- CSS-Tricks: SVG Icon Systems — SVG 스프라이트 시트와 아이콘 컴포넌트 라이브러리 구축 완벽 가이드
- web.dev: Web Performance — Google의 아이콘 에셋 효율적 로딩 및 렌더링 모범 사례
- Smashing Magazine: Icon Design — 일관되고 pixel-perfect한 아이콘 시스템을 위한 UI 디자인 원칙