Post

폰트 최적화

폰트 최적화 방법에 대해 정리한 페이지입니다.

폰트 최적화

Tags
React, Font

개요

폰트 최적화 방법에 대해 정리한 페이지입니다.

폰트 최적화 (Font Optimization)

중요성

웹 성능에서 폰트는 이미지 다음으로 큰 리소스로, 웹 페이지 로딩 속도에 큰 영향을 미칩니다. 또한 폰트를 다운로드하면서 기본 폰트가 웹 폰트로 바뀌면서 CLS(Cumulative Layout Shift)가 증가하는 등의 문제가 발생합니다. 따라서 폰트 최적화는 로딩 속도, 레이아웃 이동, 사용자 경험 등 여러 측면에서 중요합니다.

FOUT vs FOIT

FOUT (Flash of Unstyled Text)

FOUT(Flash of Unstyled Text)는 폰트 로딩 중 발생하는 시각적 현상으로, 폰트의 다운로드 여부와 상관없이 먼저 텍스트를 보여준 후 폰트가 다운로드되면 그때 폰트를 적용하는 방식입니다. 이 방식의 특징은 다음과 같습니다.

  • 장점

    사용자가 즉시 내용을 읽을 수 있습니다.

  • 단점

    폰트 교체 시 레이아웃 이동(CLS)이 발생할 수 있습니다.

FOIT (Flash of Invisible Text)

FOIT(Flash of Invisible Text)는 폰트 로딩 중 발생하는 시각적 현상으로, 폰트가 완전히 다운로드되기 전까지 텍스트 자체를 숨기는 방식입니다. 이 방식의 특징은 다음과 같습니다.

  • 장점

    웹 폰트 적용 시 처음부터 정확한 디자인을 유지하기 때문에 레이아웃 이동이 없습니다.

  • 단점

    텍스트가 보이지 않아 사용자에게 페이지가 느리게 느껴집니다.

font-display

CSS에서 @font-facefont-display 속성을 활용하면 폰트가 적용되는 시점을 제어할 수 있습니다. 현대 웹 개발에서는 FOUT 방식인 font-display: swap이 권장됩니다. font-display 속성에서 설정할 수 있는 값들을 정리하면 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@font-face {
  /* auto: 브라우저 기본 동작 */
  font-display: auto;

  /* block: FOIT (timeout = 3s) */
  font-display: block;

  /* swap: FOUT */
  font-display: swap;

  /* fallback: FOIT (timeout = 0.1s)  */
  font-display: fallback;

  /* optional: FOIT (timeout = 0.1s) */
  font-display: optional;
}
font-display설명
auto브라우저 기본 동작 / 초깃값으로 브라우저의 정책에 따라 로딩 전략을 결정합니다.
blockFOIT (timeout = 3s) / 폰트가 다운로드되기를 기다리다가 3초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 텍스트를 보여줍니다. 이후 폰트가 다운로드되면 해당 폰트로 교체합니다.
swapFOUT / 폰트가 다운로드되기 전까지 기본 폰트로 텍스트를 보여주다가 폰트가 다운로드되면 해당 폰트로 교체합니다.
fallbackFOIT (timeout = 0.1s) / 폰트가 다운로드되기를 기다리다가 0.1초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 텍스트를 보여줍니다. 이후 3초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 유지합니다. 3초가 지난 후 다운로드를 완료한 경우 폰트를 적용하지 않고 캐시해 둡니다.
optionalFOIT (timeout = 0.1s) / 폰트가 다운로드되기를 기다리다가 0.1초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 텍스트를 보여줍니다. 이후 사용자의 네트워크 상태에 따라 기본 폰트로 유지할지, 아니면 다운로드한 폰트를 적용할지 브라우저가 결정합니다.

TTF/OTF vs WOFF vs WOFF2

웹 브라우저에서 사용하는 폰트 포맷들의 특징을 표로 정리하면 다음과 같습니다.

 TTF/OTFWOFFWOFF2
의미TrueType Font / OpenType FontWeb Open Font FormatWeb Open Font Format 2
특징대부분의 운영체제와 브라우저에서 지원합니다.OTF/TTF보다 더 높은 압축률을 제공합니다.WOFF보다 더 높은 압축률을 제공합니다.
IE 지원지원지원미지원
현대 브라우저지원지원지원
파일 확장자.ttf / .otf.woff.woff2

TTF/OTF

WOFF

WOFF2

폰트 포맷들의 용량 비교

위의 사진을 보면 알 수 있듯이, WOFF2 포맷은 다른 폰트 포맷과 대비에 용량이 훨씬 작습니다. 따라서 WOFF2를 우선으로 적용하고 만약 브라우저가 WOFF2를 지원하지 않는 경우 WOFF를, WOFF도 지원하지 않으면 TTF 또는 OTF를 적용하도록 구현하는 것이 최선입니다.

1
2
3
4
5
6
7
@font-face {
  font-family: "Pretendard";
  src: url("@/shared/assets/fonts/Pretendard-Regular.woff2") format("woff2"), url("@/shared/assets/fonts/Pretendard-Regular.woff")
      format("woff"),
    url("@/shared/assets/fonts/Pretendard-Regular.ttf") format("truetype");
  font-display: swap;
}

Info.
다음 링크에서 폰트 포맷을 변환할 수 있습니다.
Online @font-face generator — Transfonter

서브셋 폰트 (Subset Font)

서브셋 폰트(Subset Font)원본 폰트 파일에서 실제로 사용하는 글자만 남기고 나머지를 제거한 폰트를 의미합니다. 서브셋 폰트를 사용하면 원본 폰트 파일을 사용하는 것보다 파일 크기가 감소하기 때문에 웹 페이지 로딩 속도를 개선할 수 있으며 대역폭을 절감할 수 있습니다.

예를 들어 다음과 같이 파일 용량이 766 KB인 Pretendard-Regular.woff2 파일이 있는 경우,

원본 폰트 파일 크기: 766 KB

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

Online @font-face generator — Transfonter

Transfonter

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

Transfonter

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

서브셋 폰트 파일 크기: 2.1 KB

참고 자료

This post is licensed under CC BY 4.0 by the author.