폰트 최적화
폰트 최적화 방법에 대해 정리한 페이지입니다.
Tags
React, Font
1. 개요
폰트 최적화 방법에 대해 정리한 페이지입니다.
2. 폰트 최적화 (Font Optimization)
2.1. 중요성
웹 성능에서 폰트는 이미지 다음으로 큰 리소스로, 웹 페이지 로딩 속도에 큰 영향을 미칩니다.
또한 폰트를 다운로드하면서 기본 폰트가 웹 폰트로 바뀌면서 CLS(Cumulative Layout Shift)가 증가하는 등의 문제가 발생합니다.
따라서 폰트 최적화는 로딩 속도, 레이아웃 이동, 사용자 경험 등 여러 측면에서 중요합니다.
2.2. FOUT vs FOIT
2.2.1. FOUT (Flash of Unstyled Text)
FOUT(Flash of Unstyled Text)는 폰트 로딩 중 발생하는 시각적 현상으로,
폰트의 다운로드 여부와 상관없이 먼저 텍스트를 보여준 후 폰트가 다운로드되면 그때 폰트를 적용하는 방식입니다. 이 방식의 특징은 다음과 같습니다.
- 장점
사용자가 즉시 내용을 읽을 수 있습니다. - 단점
폰트 교체 시레이아웃 이동(CLS)이 발생할 수 있습니다.
2.2.2. FOIT (Flash of Invisible Text)
FOIT(Flash of Invisible Text)는 폰트 로딩 중 발생하는 시각적 현상으로,
폰트가 완전히 다운로드되기 전까지 텍스트 자체를 숨기는 방식입니다. 이 방식의 특징은 다음과 같습니다.
- 장점
웹 폰트 적용 시 처음부터 정확한 디자인을 유지하기 때문에 레이아웃 이동이 없습니다. - 단점
텍스트가 보이지 않아 사용자에게 페이지가 느리게 느껴집니다.
2.2.3. font-display
CSS에서 @font-face의 font-display 속성을 활용하면 폰트가 적용되는 시점을 제어할 수 있습니다.
현대 웹 개발에서는 FOUT 방식인 font-display: swap이 권장됩니다. font-display 속성에서 설정할 수 있는 값들을 정리하면 다음과 같습니다.
1@font-face {
2 /* auto: 브라우저 기본 동작 */
3 font-display: auto;
4
5 /* block: FOIT (timeout = 3s) */
6 font-display: block;
7
8 /* swap: FOUT */
9 font-display: swap;
10
11 /* fallback: FOIT (timeout = 0.1s) */
12 font-display: fallback;
13
14 /* optional: FOIT (timeout = 0.1s) */
15 font-display: optional;
16}| font-display | 설명 |
|---|---|
| auto | 브라우저 기본 동작 / 초깃값으로 브라우저의 정책에 따라 로딩 전략을 결정합니다. |
| block | FOIT (timeout = 3s) / 폰트가 다운로드되기를 기다리다가 3초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 텍스트를 보여줍니다. 이후 폰트가 다운로드되면 해당 폰트로 교체합니다. |
| swap | FOUT / 폰트가 다운로드되기 전까지 기본 폰트로 텍스트를 보여주다가 폰트가 다운로드되면 해당 폰트로 교체합니다. |
| fallback | FOIT (timeout = 0.1s) / 폰트가 다운로드되기를 기다리다가 0.1초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 텍스트를 보여줍니다. 이후 3초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 유지합니다. 3초가 지난 후 다운로드를 완료한 경우 폰트를 적용하지 않고 캐시해 둡니다. |
| optional | FOIT (timeout = 0.1s) / 폰트가 다운로드되기를 기다리다가 0.1초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 텍스트를 보여줍니다. 이후 사용자의 네트워크 상태에 따라 기본 폰트로 유지할지, 아니면 다운로드한 폰트를 적용할지 브라우저가 결정합니다. |
2.3. TTF/OTF vs WOFF vs WOFF2
웹 브라우저에서 사용하는 폰트 포맷들의 특징을 표로 정리하면 다음과 같습니다.
| TTF/OTF | WOFF | WOFF2 | |
|---|---|---|---|
| 의미 | TrueType Font / OpenType Font | Web Open Font Format | Web Open Font Format 2 |
| 특징 | 대부분의 운영체제와 브라우저에서 지원합니다. | OTF/TTF보다 더 높은 압축률을 제공합니다. | WOFF보다 더 높은 압축률을 제공합니다. |
| IE 지원 | 지원 | 지원 | 미지원 |
| 현대 브라우저 | 지원 | 지원 | 지원 |
| 파일 확장자 | .ttf / .otf | .woff | .woff2 |




위의 사진을 보면 알 수 있듯이, WOFF2 포맷은 다른 폰트 포맷과 대비에 용량이 훨씬 작습니다. 따라서 WOFF2를 우선으로 적용하고 만약 브라우저가 WOFF2를 지원하지 않는 경우 WOFF를, WOFF도 지원하지 않으면 TTF 또는 OTF를 적용하도록 구현하는 것이 최선입니다.
1@font-face {
2 font-family: "Pretendard";
3 src:
4 url("@/shared/assets/fonts/Pretendard-Regular.woff2") format("woff2"),
5 url("@/shared/assets/fonts/Pretendard-Regular.woff") format("woff"),
6 url("@/shared/assets/fonts/Pretendard-Regular.ttf") format("truetype");
7 font-display: swap;
8}Info.
다음 링크에서 폰트 포맷을 변환할 수 있습니다.
2.4. 서브셋 폰트 (Subset Font)
서브셋 폰트(Subset Font)는 원본 폰트 파일에서 실제로 사용하는 글자만 남기고 나머지를 제거한 폰트를 의미합니다.
서브셋 폰트를 사용하면 원본 폰트 파일을 사용하는 것보다 파일 크기가 감소하기 때문에 웹 페이지 로딩 속도를 개선할 수 있으며 대역폭을 절감할 수 있습니다.
예를 들어 다음과 같이 파일 용량이 766 KB인 Pretendard-Regular.woff2 파일이 있는 경우,

이 폰트 파일을 서브셋팅(Subsetting)하여 서브셋 폰트를 생성하면 파일 크기를 크게 줄일 수 있습니다. 서브셋 폰트를 만드는 방법은 여러 가지가 있지만, 이 글에서는 Transfonter 서비스를 이용하여 생성하겠습니다.
Online @font-face generator — Transfonter

변환하고자 하는 원본 폰트 파일을 선택한 후, Characters에 폰트를 적용할 문자(Ex. "서브셋 폰트")를 넣은 후 Convert 버튼을 누르면 서브셋 폰트를 생성할 수 있습니다.

실제로 서브셋 폰트를 사용하였을 때 파일 용량이 크게 줄어든 것을 확인할 수 있습니다.

3. 참고 자료
- 프론트엔드 성능 최적화 가이드 | 유동균 | 인사이트(insight) - 예스24
- font-display - CSS: Cascading Style Sheets | MDN
- [CSS] font-display, 글꼴 렌더링 방식을 변경하는 방법 :: Mong dev blog
- CSS font-display 속성 - 올바른 이해와 사용 방법 - 코딩에브리바디
- 폰트 파일 확장자 정보에 대하여 — 이프로그의 IT이야기
- [성능최적화] 웹폰트 최적화 가이드
