웹폰트는 왜 화면 표시를 늦출까? (FOUT, 렌더링 차단, 최적화)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
웹사이트를 열었는데 글자가 보이지 않다가 갑자기 나타나거나, 기본 글꼴로 보이던 텍스트가 순식간에 다른 폰트로 바뀌는 경험, 누구나 한 번쯤 해봤을 겁니다. 뉴스 기사를 읽으려고 페이지를 열었는데 몇 초간 흰 화면만 보다가 글자가 뒤늦게 뜨는 상황을 겪으면서 이 문제를 실감했습니다. 페이지는 이미 다 불러왔는데 정작 읽을 내용이 안 보인다는 건 꽤 답답한 경험이었습니다. 이런 현상은 대부분 웹폰트 로딩 과정에서 발생하며, 생각보다 화면 표시 속도에 큰 영향을 미칩니다.
웹폰트가 화면 표시를 늦추는 이유
웹폰트는 사용자의 컴퓨터나 스마트폰에 기본으로 설치된 글꼴이 아니라, 웹페이지가 서버에서 추가로 내려받아야 하는 파일입니다. 브라우저는 HTML과 CSS를 해석하다가 특정 웹폰트가 지정되어 있으면 해당 폰트 파일을 서버에 요청하는데, 이 파일이 완전히 내려받아지고 해석되기 전까지는 텍스트 표시를 미루거나 임시 글꼴로 대체합니다. 이 과정이 바로 화면 표시 지연의 주범입니다.
여기서 중요한 개념이 FOUT(Flash of Unstyled Text)입니다. FOUT란 웹폰트가 로딩되기 전까지 시스템 기본 글꼴로 텍스트가 먼저 표시되다가, 웹폰트가 준비되면 갑자기 글꼴이 바뀌는 현상을 뜻합니다. 반대로 FOIT(Flash of Invisible Text)라는 개념도 있는데, 이는 웹폰트가 로딩될 때까지 아예 텍스트를 보여주지 않는 방식입니다. 브라우저마다 기본 동작 방식이 다르지만, 둘 다 사용자 경험 측면에서는 불편함을 줍니다.
저도 직접 블로그를 운영하면서 처음에는 예쁜 폰트를 쓰고 싶어서 웹폰트를 여러 개 적용했었습니다. 그런데 모바일에서 확인해보니 글자가 늦게 뜨면서 화면이 덜컹거리는 느낌이 들더군요. 특히 네트워크가 느린 환경에서는 텍스트가 몇 초씩 지연되면서 독자가 글을 읽기도 전에 이탈할 수 있겠다는 생각이 들었습니다. 웹폰트는 보통 수백 KB에서 수 MB까지 용량이 꽤 크기 때문에, 네트워크 상태에 따라 로딩 시간이 크게 차이 납니다.
웹폰트 로딩 과정의 단계별 흐름
웹폰트가 화면에 표시되기까지의 과정을 단계별로 살펴보면 왜 지연이 발생하는지 명확히 이해할 수 있습니다. 브라우저의 렌더링 엔진(Rendering Engine)은 다음과 같은 순서로 작동합니다.
- 브라우저가 HTML 문서를 파싱하여 DOM 트리를 구성합니다.
- CSS 파일을 읽어 스타일 정보를 파악하고, 웹폰트 사용 여부를 확인합니다.
- 웹폰트가 지정되어 있으면 해당 폰트 파일을 서버에 요청합니다.
- 폰트 파일을 내려받아 브라우저가 해석 가능한 형태로 변환합니다.
- 최종적으로 지정된 웹폰트로 텍스트를 다시 렌더링합니다.
여기서 3번과 4번 단계가 핵심입니다. 웹폰트 파일 요청과 다운로드는 네트워크 속도에 따라 시간이 달라지고, 파일 용량이 클수록 지연이 길어집니다. 또한 폰트 파일 형식에 따라서도 로딩 속도가 차이 납니다. 예를 들어 WOFF2(Web Open Font Format 2) 형식은 압축률이 높아 용량이 작지만, 구형 브라우저에서는 지원하지 않을 수 있습니다. 반면 TTF(TrueType Font) 형식은 호환성이 좋지만 용량이 큽니다.
개인적으로 여러 폰트 형식을 테스트해봤는데, WOFF2로 변환했을 때 로딩 속도가 체감상 확실히 빨라지더군요. 특히 한글 웹폰트는 글자 수가 많아서 용량이 큰 편인데, 서브셋 폰트(Subset Font)를 사용하면 실제로 페이지에 쓰이는 글자만 포함시켜 용량을 대폭 줄일 수 있습니다. 쉽게 말해 서브셋 폰트란 전체 글자 중 필요한 부분만 추출한 폰트 파일을 뜻합니다. 제가 운영하는 블로그에서는 자주 쓰는 2,350자 정도만 포함한 서브셋 폰트를 적용했더니 파일 크기가 절반 이하로 줄었습니다.
또 하나 주목할 점은 브라우저가 웹폰트를 처리하는 방식입니다. 크롬이나 사파리 같은 최신 브라우저는 font-display라는 CSS 속성을 지원하는데, 이를 통해 폰트 로딩 전략을 개발자가 직접 제어할 수 있습니다. font-display: swap을 설정하면 웹폰트가 로딩되기 전까지 시스템 폰트로 먼저 텍스트를 보여주고, 웹폰트가 준비되면 교체합니다. font-display: block으로 설정하면 웹폰트가 로딩될 때까지 텍스트를 숨기는 방식입니다. 개인적으로 swap 방식이 사용자 입장에서 훨씬 낫다고 생각합니다. 글자가 안 보이는 것보다는 일단 읽을 수 있는 상태로 보여주는 게 낫기 때문입니다.
실전 환경에서의 웹폰트 최적화 방법
웹폰트 지연 문제를 해결하려면 단순히 빠른 서버를 쓰는 것만으로는 부족합니다. 폰트 파일 자체를 최적화하고, 로딩 전략을 세밀하게 조정해야 합니다. 실무에서 자주 사용되는 방법 몇 가지를 소개하겠습니다.
첫째, CDN(Content Delivery Network)을 활용하는 방법입니다. CDN이란 전 세계에 분산된 서버 네트워크를 통해 사용자와 가까운 위치에서 파일을 전송하는 시스템을 뜻합니다. 구글 폰트나 어도비 폰트 같은 서비스는 이미 CDN을 기본으로 제공하기 때문에, 직접 서버에 폰트를 올리는 것보다 로딩 속도가 빠릅니다. 다만 외부 서비스에 의존하면 해당 서비스에 장애가 생겼을 때 폰트가 아예 안 뜰 수도 있다는 점은 감안해야 합니다.
둘째, preload 속성을 사용하는 방법입니다. HTML의 link 태그에 rel="preload"를 추가하면 브라우저가 페이지를 로딩하는 초기 단계에서 폰트 파일을 미리 내려받도록 우선순위를 높일 수 있습니다. 이 방법을 적용했더니 초기 렌더링 속도가 눈에 띄게 개선되었습니다. 다만 너무 많은 리소스를 preload로 설정하면 오히려 역효과가 날 수 있으니 정말 중요한 폰트 파일 한두 개에만 적용하는 게 좋습니다.
셋째, 폰트를 필요한 곳에만 선택적으로 적용하는 전략입니다. 모든 페이지, 모든 요소에 웹폰트를 쓸 필요는 없습니다. 제목이나 강조 문구처럼 시각적으로 중요한 부분에만 웹폰트를 쓰고, 본문은 시스템 기본 폰트를 쓰는 것도 하나의 방법입니다. 실제로 블로그 본문에는 기본 고딕 계열 폰트를 쓰고, 제목과 인용구에만 웹폰트를 적용하는 방식으로 바꿨습니다. 독자 입장에서는 본문을 읽는 데 지장이 없고, 디자인적으로도 포인트를 줄 수 있어서 만족스러웠습니다.
한국인터넷진흥원(KISA)에서 발표한 웹 접근성 및 성능 가이드라인(출처: 한국인터넷진흥원)에 따르면, 웹페이지 초기 로딩 시간이 3초를 넘으면 사용자 이탈률이 급격히 증가한다고 합니다. 웹폰트 하나가 몇 초를 좌우할 수 있다는 점을 고려하면, 최적화는 선택이 아닌 필수입니다.
마지막으로, 가변 폰트(Variable Font)를 고려해볼 수 있습니다. 가변 폰트란 하나의 파일 안에 여러 굵기와 너비 정보를 담아 다양한 스타일을 구현할 수 있는 폰트 기술을 뜻합니다. 기존에는 Regular, Bold, Light 등 스타일마다 별도 파일을 로딩해야 했지만, 가변 폰트는 하나의 파일로 모든 스타일을 표현할 수 있어 HTTP 요청 횟수와 전체 용량을 줄일 수 있습니다. 아직 한글 가변 폰트는 선택지가 많지 않지만, 영문 폰트의 경우 이미 실무에서 활발히 사용되고 있습니다.
웹폰트는 디자인 완성도를 높이는 중요한 요소지만, 그 대가로 초기 로딩 속도와 가독성을 희생할 수 있습니다. 여러 번의 시행착오 끝에 웹폰트는 꼭 필요한 곳에만 쓰고, 나머지는 시스템 폰트로 충분하다는 결론을 내렸습니다. 독자가 글을 읽는 흐름이 끊기지 않는 것이 무엇보다 중요하다고 생각하기 때문입니다. 웹사이트를 방문했을 때 글자가 늦게 뜨거나 갑자기 바뀌는 경험을 한다면, 잠시 기다리면 화면이 안정됩니다. 하지만 운영자 입장에서는 그 몇 초가 사용자를 잃을 수 있는 결정적 순간이라는 점을 명심해야 합니다. 웹폰트 최적화는 단순한 기술적 개선이 아니라, 사용자 경험을 존중하는 태도에서 시작된다고 생각합니다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기