์ด ๊ธ์ ์ฐ๊ฒ๋ ๊ณ๊ธฐ๋ ๊ตฌ๊ธ ์นํฐํธ๋ฅผ ์ ์ฉํ ํ ํ์ด์ง ๋ ๋๋ง์ ๊น๋นก์ ํ์์ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ๊ตฌ๊ธ ์นํฐํธ์ ๋์์๋ฆฌ ๊ทธ๋ฆฌ๊ณ ์นํฐํธ ์ฑ๋ฅ ์ต์ ํ์ ๋ํด ์๊ฒ๋๋ฉด์ ์ ์ฉํ ๊ณผ์ ์ด๋ค.
- ์๋ชป๋ ๋ถ๋ถ์ด๋ ๋ ๊ด์ฐฎ์ ๋ฐฉ๋ฒ ๋๋ ์๊ฒฌ์ ๋๋๊ณ ์ถ๋ค๋ฉด ๋ฐ๋ก ์๋ ค์ฃผ์ธ์!
1.๋ฌธ์ ์ ๊ณผ ์ธก์
ํ์ด์ง ์ ํ์ font๊ฐ ๊น๋นก์ด๋ ํ์์ด ์์๋ค. ๋ฌธ์ ์ ์ ์ธก์ ํ๊ธฐ ์ํด chrome performance, google light-house, ๊ทธ๋ฆฌ๊ณ webpagetest.org ์ด์ฉํ์๋ค. ์ธก์ ํ๊ฒฝ์ slow 3g, disable cache, aws s3, cloudfront๋ก ๋ฐฐํฌ ํ ๋ฒ์ ์ ๋์์ผ๋ก ์คํํ์๋ค.
์ธก์ ํ๊ธฐ
๋งจ์์ ๋ ์ฌ์ง์ ๊ฐ ๋ฆฌ์์ค๋ค์ waterfall ์ ๋ํ๋ด๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง์์ 17๋ฒ ์ธ font.googleapis.com ์์ฒญ์ด ๊ตฌ๊ธ api๋ก ๋ถํฐ ํฐํธ๋ฅผ ๋ค์ด๋ก๋ ํ๋ ๊ณผ์ ์ค์ ํ๋์ธ css๋ฅผ ๋ค์ด๋ก๋ ํ๋ ๊ณผ์ ์ธ๋ฐ, ์ด cssํ์ผ์ด ๋ค์ด๋ก๋๊ฐ ๋๋๊ณ ์์ผ ๋ ๋๋ง์ด ๋๋ค. ์ฌ์ค ๊ทธ ์ ์ ์ด๋ฏธ ์์ ์ ๋ง์น html๊ณผ jsํ์ผ์ ์ด css ํ์ผ์ด ๋ค์ด๋ก๋ ๋๊ธฐ ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ๋ ๋๋ง ์ฐจ๋จํ์(3.5s ์ ๋)์ ๊ฒช๊ณ ์๋ค.
๋๋ฒ์งธ ์ด๋ฏธ์ง ๋ํ ๋ ๋๋ง ์ฐจ๋จ์ผ๋ก 22๋ฒ์ ๋ก์ปฌ ํฐํธ ๋ฆฌ์์ค๊ฐ 4~5s ์ง์ฐ,์ ํ๋๋ ํ์์ ๋ํ๋ธ๋ค.
๋ฌธ์ ์ ์ ์ ๋ฆฌํ์๋ฉด,
- ๋ ๋๋ง ์ฐจ๋จ
- โAvoid chaining critical requestโ error - Lighthouse
- ํ์ด์ง ์ ํ์ font๊ฐ ๊น๋นก ์ด๋ ํ์
2. ๋ ๋๋ง ์ฐจ๋จ๊ณผ Google web fonts ๋์์๋ฆฌ์ ๊ด๊ณ
Google ์นํฐํธ ์ฌ์ฉ์ ์ฌ์ฉ๋๋ ์ผ๋ฐ์ ์ธ ํ๊ทธ์ด๋ค.
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin />
<link
href="https://fonts.googleapis.com/css?family=Lato&display=swap"
rel="stylesheet"
/>
href ์์ฑ์ ํตํด fonts.googleapi.com ์ผ๋ก Lato ํฐํธ๋ฅผ ์์ฒญํ๋ค.rel=stylesheet
์ ๊ฐ์ด fonts.googleapi.com๋ stylesheet ๋ด์ @font-face๋ก Lato ํฐํธ๋ฅผ ์ ์ํ์ฌ stylesheet ํ์ผ๋ก ๋ณด๋ด์ค๋ค.
๊ทธ๋ฐ ๋ค์, ๋ค์ @font-face์ ์ ์๋ local version ๊ธ๊ผด์ ํ์ธํ๋ค. ๋ง์ฝ ์๋ค๋ฉด fonts.gstatic.com์ ์ฐ๊ฒฐํ์ฌ Lato ๊ธ๊ผด์ ๋ค์ด๋ก๋ํ๋ค.
์ด๋ฐ ๋ฐฉ์์ ์ข์ ํผํฌ๋จผ์ค๋ฅผ ๋ด๊ธฐ๊ฐ ํ๋ค๋ค. ๊ตฌ๊ธ ํฐํธ๋ฅผ ๋ฐ๊ธฐ ์ํด์ DNS ์์ฒญ ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๋ถํฐ css ํ์ผ์ ๋ฐ์ ๋ค์ ํ์ฑํ๊ธฐ๊น์ง ๋ ๋๋ง์ ์ฐจ๋จํ๊ณ ์๋ค. ์ด ํ์ฑ์ด ๋๋์์ผ ๋น๋ก์ ์ํ๋ ๊ธ๊ผด์ด ๋ ๋๋ง์ด ๋๋ค.
โAvoid chaining critical requestโ ์๋ฌ๋ ์นํฐํธ ๋ก๋ ์ ๋ ๋๋ง ์ฐจ๋จ์ ์ง์ด์ค๋ค. ๋ธ๋ผ์ฐ์ ๋ ํ์ด์ง ๋ก๋ ํ๋ก์ธ์ค๊ฐ ์์๋ ๋ HTML์ ํ์ฑํ ๋ ํ ๋น๋ ์ฐ์ ์์์ ๋ฐ๋ผ ์ค์ํ ์์ฒญ์ ํ๋ค. ์ง์ ํ์ง ์๋ ํ HTML์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ฉฐ CSS, ์ด๋ฏธ์ง ๋ฐ JavaScript์ ์์์ธ๋ฐ ์ด๋ฐ ์์ฒญ๋ค์ด ๊ธด ์ฒด์ธ์ ํ์ฑํ๊ฒ ๋๋ฉด ์ง์ฐ์๊ฐ์ด ๋์ด๋๊ณ ์ด๋ ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ง์ฐ ์ํจ๋ค.
Maximum critical path latency ๋ ์ค์ํ ์์ฒญ์ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋ ๋๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ด ์๊ฐ์ด๋ค.
๊ณต์ web.dev-Avoid chaining critical requests ์ ๋ฐ๋ฅธ ๋์ ๋ฐฉ๋ฒ์ ๋์ ๋ฌธ์ ์ ๊ณผ ๊ฒฐํฉํ์๋ฉด,
<head>
๋ด๋ถ์ ์ ์๋ <link>
์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ์์ธ๋ฐ ๋ฐฉ๋ฒ์ผ๋ก๋ Resource Hint๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๊ณ ๊ทธ์ค์์ preload ์ preconnect ์์ฑ์ ์ด์ฉํ๋ค.
preload
preload๊ฐ ์ ์ฉ๋ ์ง์์ ๊ฐ๋ฅํ ๊ฐ์ฅ ๋์ ์ฐ์ ์์๋ก ๊ฐ์ฃผ๋์ด ๋ค์ด๋ก๋ํด์ผ ํ๋ค๊ณ ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ ค์ค๋ค. ์ฃผ์ํ ์ ์ด ์๋๋ฐ, ์ฌ์ฉํ๋ ์์์ด๋ ์๋๋ , ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ค๋ณต๋์ด์๋ ๋ฆฌ์์ค ํฌํจ. ๊ทธ๋์ ํ์ฌ ํ์ด์ง์ ํ์ํ ๋ฆฌ์์ค๋ง ์ค์ ํด์ผ ํ๋ค.
preconnect
preconnect๋ ์ธ๋ถ ๋๋ฉ์ธ๊ณผ์ ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ์ฐ๊ฒฐ์ ์ค์ ํ๋ค. ๊ทธ๋์ ์ฐ๊ฒฐ๋ ์ค์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฏ๋ก DNS, TCP, TLS ์๋ณต์ ํ์ํ ์๊ฐ์ ์ ์ฝํ ์ ์๋ค.
์ฆ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ฐ๋๋ฐ ์ฐ์ ์์๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ์ธ๋ถ ๋๋ฉ์ธ๊ณผ์ ์ฐ๊ฒฐ์์ ์ค์ ์ ๋ฏธ๋ฆฌ ํ์ฌ ๋ฆฌ์์ค๋ฅผ ๋ฐ์ ์ค๋น์ํ๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋์ ํจ์จ์ ์ผ๋ก ๋ค์ด๋ก๋ ํ ์ ์๋๋ก ์ต์ ํํ๋ ๊ฒ์ด๋ค.
2.1 Gatsby์์ ๊ตฌ๊ธ ํฐํธ preloading ์ ์ฉ ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ
์ฌ์ฉํ๋ gatsby-plugin-google-fonts ์์์ Eliminate render-blocking resources #15 ์ด์๋ ์์ง ํด๊ฒฐ๋์ง ์์์ผ๋ฏ๋ก, gatsby-plugin-webfonts ๋ผ๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์๋ค.
gatsby์์ ๋น๋์ ์ด plugin์ @font-face css ํ์ผ์ ์์ฑ ํ ๋ฐฐํฌ ์์๋ ํฐํธ ํ์ผ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค.
๋ ๋๋ง ์ฐจ๋จ์ด ์์ด์ง ๋์ ์ด๊ธฐ ๋ ๋๋ง์ด ์ด์ 7s -> 2.5s~3s ๋ก ๋จ์ถ๋์๋ค.
๋ธ๋ผ์ฐ์ ๋ณ ํธํ์ฑ์ ๋ณด์๋ฉด,
2.2 ๋ธ๋ผ์ฐ์ ํธํ์ฑ
ํฐํธ ํ์์ woff, woff2, EOT, TTF ์ข ๋ฅ๊ฐ ์๋ค. woff2 ๊ฐ ๊ฐ์ฅ ๊ฒฝ๋ํ๋์ด์์ผ๋ฉฐ 30% ์ ๋ ํ์ผ ํฌ๊ธฐ๊ฐ ์์ผ๋ฉฐ IE๋ฅผ ์ ์ธํ ์ต์ ๋ธ๋ผ์ฐ์ ๋ค์ woff2๋ฅผ ์ง์ํ๋ค, html ํ์ผ์์ preload ์ ํ์ผ ํ์์ผ๋ก๋ ์ ํฉํ๋ค.
๊ตฌ๊ธ ์น ํฐํธ๋ woff์ woff2๋ฅผ ์ง์ํ๋ค. IE11 ๊น์ง๋ woff๋ก ๋์ํ ์ ์์ง๋ง IE11 ์ด์ ๋ฒ์ ์ ์ง์ํ๋ ค๋ฉด, EOT ๋๋ TTF ํฐํธ ํ์๋ง์ด ๊ฐ๋ฅํ๋ฐ ๊ตฌ๊ธ ์นํฐํธ๋ ์ด ํ์๋ค์ ์ง์ํ์ง ์๋๋ค.
woff2
woff
EOT
TTF
Resource Hints ์ธ preload
์ preconnect
๋ IE์์ ์ง์ํ์ง ์๋๋ค.
์ฆ preload๊ฐ ์ง์๋๋ ๋ธ๋ผ์ฐ์ ๋ผ๋ฉด woff2๋ ๊ฐ์ด ์ง์์ด ๊ฐ๋ฅํ๋ฉฐ IE ๋ธ๋ผ์ฐ์ ๋ ์์ธ์ด๋ค. IE๋ฅผ ๋์ํ๊ณ ์ ํ๋ค๋ฉด ์
ํ ํธ์คํ
์ ๊ณ ๋ คํด์ผ ํ๋ค.
preload
preconnect
3. ์นํฐํธ ์ต์ ํ์ self hosting ํฐํธ ์ฌ์ฉ?
IE 8 ์ดํ์ ๋ฒ์ ์ ์ง์ํ๊ณ ์ ํ๋ค๋ฉด self hosting์ ๊ณ ๋ คํด์ผ ํ๋ค๋ ์ธ๊ธ ํ์๋ค. ์ด ์ธ์๋ ๋ ์ด์ google font๋ฅผ ์ฌ์ฉํ ์ด์ ๊ฐ ์๋ค๋ ๋ช ๊ฐ์ง ํฉํธ๋ค์ด ์์๋ค.
3.1. ๊ตฌ๊ธ ํฐํธ์ ์บ์ ๊ธฐ๊ฐ
์ผ๋ฐ์ ์ผ๋ก "fonts.gstatic.com"์์ ๋ค์ด๋ก๋ํ ๊ธ๊ผด ํ์ผ๋ง ์บ์ ๊ธฐ๊ฐ์ด 1๋ ์ด๋ผ๊ณ ์๋ ค์ ธ ์๋ค. ์ฌ๋ฐฉ๋ฌธํ๋ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ์๋๋ก ํฐํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค๊ณ ํ์ง๋ง ์ฌ์ค ์บ์ ๋ ๊ธ๊ผด์ ์ ๊ณตํ๋ ค๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ 24์๊ฐ๋ง๋ค CSS ํ์ผ์ ๋ค์ด๋ก๋ํด์ผ ํ๋ค. ๊ทธ ์ด์ ๋ ๊ธฐ๋ณธ CSS ํ์ผ์ ์บ์ ์๋ช ์ด 24์๊ฐ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ CSSํ์ผ์ ๋ค์ด๋ก๋ํ๋ ๊ฒ์ ๋ ๋๋ง์ ์ฐจ๋จํ๋ ์ผ์ ๋ค๋ค๋ฅธ๋ค.
3.2 ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ฅผ ์ํ ๋ธ๋ผ์ฐ์ ์ ์๋ก์ด "์บ์ ํํฐ์ ๋"
ํฌ๋กฌ( Chrome: v86 ์ดํ(2020๋ 10์), ํ์ด์ดํญ์ค(2021๋ 1์ v85 ์ดํ), ์ฌํ๋ฆฌ(2013๋ ๋ถํฐ)๋ ์๋ก์ด ์บ์ ํํฐ์ ๋์ ์ฆ "์บ์ ๋ถํ " ๋๋ "์ด์ค ํค ์บ์ฑ"์ด๋ผ๋ ๊ฒ์ ๊ตฌํํ๋ค.
๊ธฐ์กด์ ์บ์ ์์คํ
A ์ฌ์ฉ์: https://b.example ๋ฐฉ๋ฌธ, https://x.example/doge.png ๋ฆฌ์์ค ์์ฒญ
A ์ฌ์ฉ์: https://c.example ๋ฐฉ๋ฌธ, https://x.example/doge.png ๋ฆฌ์์ค ์์ฒญ
๋ธ๋ผ์ฐ์ ๋ c.example ์น ํ์ด์ง์์ ์บ์ ๋ ๋ฆฌ์์ค ๋ฒ์ ์ ์ฌ์ฉํ๋ค. Cache key๊ฐ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ ์บ์์์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ ์ ์๋ค. ์ด๋ฐ ์บ์ ์์คํ ์ ๋น ๋ฅธ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋ ์ฅ์ ์ ๊ฐ์ ธ๋ค ์ฃผ์ง๋ง ์น ์ฌ์ดํธ๊ฐ HTTP ์์ฒญ์ ์๋ตํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ณผ๊ฑฐ์ ๋์ผํ ๋ฆฌ์์ค์ ์ก์ธ์ค ํ์์ ์ ์ ์๊ธฐ ๋๋ฌธ์ (์ฌ์ฉ์์ ๊ฒ์ ๊ธฐ๋ก์ด ๋ ธ์ถ๋๋ ์ํ์ฑ) ๋ณด์ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๊ณต๊ฒฉ์ ๋ ธ์ถ ๋ฆฌ์คํฌ๊ฐ ์์ผ๋ฏ๋ก, Chrome 86๋ถํฐ HTTP ์บ์๋ฅผ ๋ถํ ํ์๋ค.
์บ์ ํํฐ์ ๋
๊ธฐ์กด์ ์์คํ ์์ cacheํค๋ ํ๋ ์์ผ๋, ์๋ก์ด ์์คํ ์์๋ 3๊ฐ์ ํค๋ก ๊ตฌ์ฑ๋์ด์ง ํํ์ด๋ค.
- https://a.example (the top-level site) - ๋ฐฉ๋ฌธํ ์น์ฌ์ดํธ
- https://a.example (the current-frame site)
- https://x.example/doge.png (the resource URL)
https://a.example์ ๋ฐฉ๋ฌธํ์ฌ https://x.example/doge.png ์ด๋ฏธ์ง๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ ์ฒ์ ๋ฐฉ๋ฌธ์ด๋ ์บ์์ ์ ์ฅํ๋ค.
- Cache Key: { https://a.example, https://a.example, https://x.example/doge.png }
๊ฐ์ ์ ์ ๊ฐ https://b.example ์ ๋ฐฉ๋ฌธํ๊ณ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํ๋ค. ๊ธฐ์กด ์บ์ ์์คํ ๊ณผ๋ ๋ฌ๋ฆฌ the top-level site ์บ์ ํค๊ฐ ๋ค๋ฅด๋ฏ๋ก, ์๋ก ์บ์๋ก ์ ์ฅํ๋ค.
- Cache Key: { https://b.example, https://b.example, https://x.example/doge.png }
๊ฐ์ ์ ์ ๊ฐ ์ด๋ฒ์ https://a.example๋ฅผ ๋ฐฉ๋ฌธํ์ฌ (https://x.example/doge.png)๋ฅผ ์์ฒญํ๋ค. ๊ฐ์ top-level site ํค์ the iframe ํค๊ฐ ์์ ์ ๊ฐ์ ๋ฆฌ์์ค๋ก ๊ฐ์ฃผํ๊ณ ์บ์ ๋ ๋ฆฌ์์ค๋ฅผ ๋ฐํํ๋ค.
๋ ์์ธํ ๋ด์ฉ ์ฌ๊ธฐ ์ฐธ์กฐ - developers.google/http-cache-partitioning
์ด๋ฐ ๋ฐฉ์ ์๋์์, Google ์นํฐํธ๋ ์์ ์ฒ๋ผ ํญ์ ์บ์ ๋ ํฐํธ๋ฅผ ์ ๊ณตํ ์๊ฐ ์๋ค.
3.3 GDPR
์๋ฅผ ๋ค์ด fonts.com์ ๋ฐฉ๋ฌธ์๊ฐ ํ์ด์ง๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ๋ ๋ฐ ํ์ํ ๊ธ๊ผด์ ์์ง ์บ์ ํ์ง ์์ ๊ฒฝ์ฐ, Google API๋ก ๊ธ๊ผด์ ์์ฒญํ๋ ๊ณผ์ ์์ Google์ ์ฌ์ฉ์์ IP์ฃผ์๋ฅผ ์ป๊ฒ ๋๋๋ฐ GDPR์ ๋ฐ๋ฅธ ๊ณ ์ ํ ๊ฐ์ธ ์๋ณ์์ ํด๋น๋๋ค. ๊ทธ๋์ ์ ๋ฝ์ ๋์์ผ๋ก ํ ์ฌ์ ์ฒด๊ฐ ์๋ค๊ฑฐ๋, ์ ๋ฝ์ ๊ฑฐ์ฃผํ๋ ์ฌ๋๋ค์ด ์ด์ฉํ๋ ์น์ฌ์ดํธ๋ผ๋ฉด ๊ตฌ๊ธ ํฐํธ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์ Google Fonts์์ Google Fonts API๋ก์ URL ํธ์ถ์ด ๋ฐ์ํ๊ธฐ ์ ์ ์ฌ์ฉ์์๊ฒ ๋์๋ฅผ ์์ฒญํ๋ ๋ฉ์์ง๋ฅผ ํ์ํด์ผ ํ๋ค.
์ด๋ ์ ๋ ์ ๋ฆฌ๊ฐ ๋๋ค๋ฉด ๊ตณ์ด google font๋ฅผ ์ด์ฉํ ์ฅ์ ์ ๋๋ผ์ง ๋ชปํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ง๋ก ๋๋ฌผ๊ฒ ์ง๋ง CDN์ด ๋ค์ด๋๋ ์ผ์ด ์๊ธฐ๋ฉด ํฐํธ ์์ฒด๋ฅผ ์ด์ฉํ์ง ๋ชปํ๋ ์ผ์ด ์๊ธด๋ค.
์ฌ์ค ์ ์ผ ๋น ๋ฅธ ๋ก๋ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ด ๋ชจ๋ ๊ณ ๋ฏผ์ ํด๊ฒฐ์ ์ด๋ ์ ๋ ํ ๋ฒ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ system fonts๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ํ์ง๋ง, ํ์ ๋ system fonts๋ง์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๋ค์๊ฒ ์ฆ๊ฑฐ์ด ๊ฒฝํ์ ์ฃผ๊ธฐ์๋ ๊ฐ์ธ์ ์ผ๋ก ์ํ๊น์ด ์ ๊ทผ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ์ ์ ํ ํธ์คํ ํฐํธ๋ฅผ ์ ์ฉํด ๋ณด์๋ค.
4. ์ ํํธ์คํ ํฐํธ ์ต์ ํ ์ ์ฉ
์ ํ ํธ์คํ ์ ์ต์ ํ๋ Google ์น ํฐํธ์์ ์์์ ์์ ํด์คฌ๋ ์ผ๋ จ์ ๊ณผ์ ๋ค์ ์๋์ผ๋ก ์ค์ ํด์ฃผ๋ ๊ฒ์ด๋ค.
- ์ต์ ํ๋ font format ๋ก์ปฌ ํ์ผ
- @font-face์ง์
- preload ์ค์
- FOUT, FOIT ๋์
4.1. ์ต์ ํ๋ font format ๋ก์ปฌํ์ผ
์ ํ ํธ์คํ ์ ๊ฒฝ์ฐ google-webfonts-helper๋ฅผ ์ด์ฉํ๋ฉด ๊ตฌ๊ธ ํฐํธ์์ ์ง์ํ๋ ํฐํธ๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๊ฒ ์ง์ํ๋ฉฐ ๋ฌด์๋ณด๋ค๋ ๊ตฌ๊ธ ํฐํธ์์ ๋ค์ด๋ก๋ํ ๋ ๋ฐ์ ์ ์์๋ woff, woff2๊น์ง ๋ชจ๋ ์ง์ํ๋ค. ์ฆ, IE11 ์ดํ ๋ฒ์ ๊น์ง๋ ์ง์ํ ์ ์๋ ํฐํธ ํ์์ด๋ค. ํ์ง๋ง ํ๊ธ๋ก ๋ ํฐํธ๋ค์ ๋ผํด๋ฌธ์์ ๋นํด ์กฐํฉ์ด ๋ง์ผ๋ฏ๋ก ํ์ผ์ด 10๋ฐฐ๊น์ง๋ ํฌ๋ค. ์ด ํ์ผ๋ค์ ์ต์ ํํ๊ธฐ ์ํด์ ๋ถํ์ํ ๊ธ์๋ฅผ ์ ๊ฑฐํ๊ณ ํ์ํ ๋ฌธ์๋ค๋ง ๋ด์ ์๋ธ์ ํฐํธ๋ก ๋ง๋๋ ๊ฒ์ด๋ค. ๊ฒฝ๋ํ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ ๊ฒ ์ข๋ค. ํ๊ธ ์น ํฐํธ ๊ฒฝ๋ํํด ์ฌ์ฉํ๊ธฐ
์๋ธ์ ํฐํธ๋ ์ผ๋ถ ๊ธ๋ฆฌํ๋ ์์ฝ๋ง์ ์ถ์ถํ์ฌ ์๋ก์ด ํฐํธ๋ฅผ ์ถ์ถํ๋ ๊ฒ์ ๋งํ๋ค. ์ผ์์ํ์์๋ ์ ์ฌ์ฉํ์ง ์๋ ๋ฌธ์๋ฅผ ์ ์ธํ ๋ฌถ์์ด๋ค.
์คํฌ์นด์์ EOF, TTF ํ์ผ์ ์ ๊ณตํ์ฌ spoqa๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. ๋๋จธ์ง WOFF, WOFF2๋ converter๋ฅผ ์ด์ฉํด ๋ฐ๊พธ์๋ค.
4.2. @font-face ์ง์
@font-face {
font-family: 'Spoqa Han Sans Neo', 'sans-serif';
font-style: normal;
font-weight: 600;
font-display: swap; /*swap, */
src: local('Spoqa Han Sans Neo') /* IE6-IE8 */ url(${Fonts.SpoqaSans600OTF}?#iefix)
format('embedded-opentype'), /* Super Modern Browsers */ url(${Fonts.SpoqaSans600WOFF2})
format('woff2'),
/* Modern Browsers */ url(${Fonts.SpoqaSans600WOFF}) format('woff'), /* IE6-IE11*/
url(${Fonts.SpoqaSans700TTF}) format('truetype');
/* ์์ด ๋ฌธ์๋ฅผ ์ ์ธํ ํ๊ธ,์ซ์,ํน์ ๋ฌธ์ ์ ์ฉ*/
unicode-range: U+AC00-D7A3, U+0030-0039, U+0020-002F, U+003A-0040,
U+005B-0060, U+007B-007E;
}
local() ์์ฑ
๋ก์ปฌ์ ์ด๋ฏธ ์ค์น ๋ ํฐํธ์ ๊ฒฝ๋ก๋ฅผ ์ ๋ ์์ฑ์ด๋ค. ๋ง์ฝ google font api๋ฅผ ์ด์ฉํ๋ค๋ฉด, google api๊ฐ ๋ก์ปฌ์ ์ง์ ๋ ํฐํธ๊ฐ ์์ผ๋ฉด ์๋ก์ด ํฐํธ๋ฅผ ํธ์ถํ์ฌ ๋ค์ด๋ก๋ ํ๋ค.
url() ์์ฑ
๋ค์ด๋ก๋ ํ ์นํฐํธ์ ์ฃผ์๋ฅผ ์ ๋ ์์ฑ์ด๋ค.
format()
์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด ํฌ๋กฌ๋ธ๋ผ์ฐ์ ์์ ,
local-> url(${Fonts.SpoqaSans600OTF}?#iefix) -> url(${Fonts.SpoqaSans600WOFF2}) ์์๋ก ๋ถํ์ํ SpoqaSans600OTF ํฐํธ๋ฅผ ๋ค์ด๋ก๋ ํ๋ค.
format์ ์ฌ์ฉํ ๊ฒฝ์ฐ, local -> url(${Fonts.SpoqaSans600WOFF2}).
๊ฐ์ฅ ์ฉ๋์ด ์์ woff2ํ์์ ๊ธฐ๋ณธ์ผ๋ก ๋จผ์ ๋ค์ด์ ๋ฐ๊ณ ๋ง์ฝ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์ผ ๊ฒฝ์ฐ๋ ๋๋ฒ์งธ์ธ woffํ์์ ๋ค์ด ๋ฐ๋๋ค.
UNICODE-RANGE
unicode-range๋ฅผ ์ด์ฉํด์ ์ ๋์ฝ๋๋ง๋ค ๋ค๋ฅธ ํฐํธ๋ฅผ ์ง์ ํ ์ ์๋ค.
- ํ๊ธ ๋ฒ์: U+AC00-D7A3
- ์์ด ๋๋ฌธ์ ๋ฒ์ : U+0041-005A
- ์์ด ์๋ฌธ์ ๋ฒ์ : U+0061-007A
- ์ซ์ ๋ฒ์ : U+0030-0039
- ํน์ ๋ฌธ์: U+0020-002F, U+003A-0040, U+005B-0060, U+007B-007E
4.3. preload ์ค์
๋๋ react-helemt์ ์ด์ฉํ์๋ค. gatsby ์์ ๊ฒ์ ์์ง ์ต์ ํ๋ฅผ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ react-helmet์ ํ์ฅํ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ ์ ์๋ค.
npm i react-helmet gatsby-plugin-react-helmet
//gatsby-config.js
module.exports = {
.
.
plugins: [
`gatsby-plugin-react-helmet`,
]
.
.
}
//SEO.jsx
import { Helmet } from 'react-helmet'
const SEO = () => (
<>
<Helmet>
<link
rel="preload"
as="font"
href={SpoqaSans700WOFF2} //font path
type="font/woff2"
crossOrigin="anonymous"
/>
</Helmet>
</>
)
'gatsby -How to preload self-hosted fonts? #13074' ์ฐธ๊ณ
4.4. FOUT(Flash of Unstyled Text), FIOT(Flash of Invisible Text)
preload๋ก ์ธํด์ ๋ ๋๋ง์ด ๋ ํ์๋ ํฐํธ๋ฅผ ๋ค์ด๋ก๋๋๋ ๊ณผ์ ์ด ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ๊ทธ๋๊น์ง๋ ์๋ฌด๊ฒ๋ ๋ณด์ด์ง ์๋ FIOT ํ์์ด ์ผ์ด๋ ์ ์๋ค.
์ฒ์ Lighthouse์์ ๋ฐ์ ์๋ฌ๋ก โensure text remains visible during web font loadโ
๊ฐ FIOT ํ์์ ์ด์ผ๊ธฐํ๋ค.
๋ธ๋ผ์ฐ์ ๋ง๋ค ์นํ์ด์ง์ ํฐ ํฐํธ ํ์ผ์ ๋ก๋ํ๋ ๊ณผ์ ์์ ์๊ธฐ๋ ์ง์ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด ์กฐ๊ธ ๋ค๋ฅธ๋ฐ, FOIT, FOUT๊ฐ ์๋ค.
FOIT๋ ๊ธ๊ผด์ ๋ก๋ํ ์ค๋น๊ฐ ๋์ง ์์ ๊ฒฝ์ฐ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ๋ ํ ์คํธ๋ฅผ ์์ ํ ์จ๊ธด๋ค. Chrome์ด๋ Firefox๋ 3์ด ๋์ ํ ์คํธ๋ฅผ ์จ๊ธฐ๊ณ ๊ทธ๋๊น์ง ํฐํธ๊ฐ ๋ก๋๋์ง ์์ผ๋ฉด ์์คํ ํฐํธ๊ฐ ๋ก๋๋๋ค. Safari์ ๊ฒฝ์ฐ๋ ๋ชจ๋ ๊ธ๊ผด์ ๋ก๋ํ ๋๊น์ง ํ ์คํธ๋ฅผ ์์ ํ ์จ๊ธด๋ค.
FOUT๋ Internet Explorer์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ธ๋ฐ ์น ํฐํธ๊ฐ ๋ก๋ฉ๋ ๋๊น์ง ์์คํ ํฐํธ/fallback ํฐํธ๋ฅผ ๋จผ์ ๋ณด์ฌ์ค๋ค. ์น ํฐํธ ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ํ ์คํธ๋ฅผ ์น ํฐํธ๋ก ์ ํํ๋ค. ์ฌ์ฉ์๋ blank ํ์ด์ง๋ฅผ ๋ณด์ง ์๊ณ ํญ์ ํ ์คํธ๋ฅผ ๋ณผ ์ ์๋ ์ฅ์ ์ด ์๋ค. ํ์ง๋ง ์นํฐํธ์ ์์คํ ํฐํธ/fallback ํฐํธ ์ฌ์ด์ ๊ธ๊ผด์ ์๊ฐ, ๋์ด ๋ฑ ์์์ ์ฐจ์ด์ ๋ฐ๋ผ ํฐํธ์ ์ ํ์์ ์ ๋ ์ด์์์ด ๋ณ๊ฒฝ๋ ์ ์๋ค(layout shift performance). ์ด๋ fontStyleMatcher๋ฅผ ํตํด์ ๊ธ๊ผด๊ฐ์ ์์์ ํต์ผ๊ฐ์๊ฒ ๋ง์ถ ์ ์๋ค.
FIOT๋ฅผ ํด๊ฒฐ ํ ๋ฐฉ๋ฒ์ผ๋ก @font-face
์์ font-display: swap
์์ฑ์ ์ด์ฉํ์ฌ FOUT๋ก ์ ํํ๋๋ฐ, ์ด๋ ์ฌ์ฉ์ ์
์ฅ์์๋ ์๋ฌด๊ฒ๋ ๋ณด์ง ์๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ฒ ์์คํ
ํฐํธ๋ฅผ ๋จผ์ ๋ณด๊ณ ํฐํธ ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋ ํ์ ๋ค์ด๋ก๋๋ ํฐํธ๋ฅผ ๋ณด๊ฒ ๋๋ ๊ฒ์ด๋ค.
@font-face {
.
.
font-display: swap;
.
.
}
font-display๋ฅผ ์ง์ ํ๊ธฐ ์
font-display:swap ์ง์ ํ
4.5 ์ต์ ํ ์ ,ํ light house
- 5๋ฒ ์๋์์์ ํ๊ท
์ต์ ํ ์
์ต์ ํ ํ
5. ์ ํํธ์คํ ํฐํธ vs ๊ตฌ๊ธ ์นํฐํธ
5.1. ์ ํ ํธ์คํ ํฐํธ
5.2. ๊ตฌ๊ธ ์น ํฐํธ
์ ํ ํธ์คํ ํ๊ธ ํฐํธ๊ฐ ํ์คํ ๊ตฌ๊ธ ํ๊ธ ํฐํธ์ ๋นํด ๋ง์ผ๋ฉด 20๋ฐฐ ๋๊ฒ๋ 20KB -> 466KB ์ฐจ์ด๋๋ค. LCP(Largest Contentful Paint)์์๋ ๋ ๋น์ทํ ์์น๋ฅผ ๋ํ๋ธ๋ค. ๊ทธ๋ ๋ค๊ณ ์ด ์ธก์ ๋ง์ผ๋ก ๋ ๋ฐฉ์์ด ๋น์ทํ๋ค๋ผ๊ณ ๋ง ๋ณผ ์๋ ์๋ค. ํ์ฌ ์ฌ์ฉ ์ค์ธ ํฐํธ ์๊ฐ ๋ง์ง ์์ผ๋ฉฐ, preloading์ด ๋๋ ๋ฆฌ์์ค๋ค์ด ๋ง์์ง๊ฑฐ๋, ์น์ ๋ณต์ก์ฑ, ๊ท๋ชจ์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ ์ถฉ๋ถํ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ ์ ์๋ ๊ฒ์ ํ์ฌ ๋ธ๋ก๊ทธ ๋ด์์ ๋ค์ํ ํฐํธ๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ, ๋ง์ ๋ฆฌ์์ค๋ค์ด ์์ง ์์ ๊ฒฝ์ฐ์๋ ์ ํ ํธ์คํ ๊ณผ ๊ตฌ๊ธ ์นํฐํธ๋ฅผ ์ต์ ํํ ๊ฒฝ์ฐ ๋น์ทํ ํผํฌ๋จผ์ค๋ฅผ ๋์ถํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ง๋ฌด๋ฆฌ
์นํฐํธ ์ฃผ์ ๊ฐ ์๋ฉด ์ ์๋ก ์ฌ๋ฏธ์๊ณ ์๊ฐ๋ณด๋ค ๊น์ ์ฃผ์ ์๋ค. ๋ชจ๋ฅด๋ ๋ ๋ง์ ๊ฒ๋ค์ด ์์ง๋ง ๋์ gatsby ๋ธ๋ก๊ทธ์์์ ์นํฐํธ ์ต์ ํ๋ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ ํฅ์์ ํฌ๊ฒ ๊ธฐ์ฌ๊ฐ ๋์๋ค. ๋ง์ฝ Google ์นํฐํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํฐํธ์ ๊ฒฝ๋ํ ์์ ์ ์๊ฐํ ํ์๋ ์๊ณ ์ด๋ค ๋ฒ์ ์ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๋ธ๋ผ์ฐ์ ์ง์์ ํ์ธํ๋ ๋ฒ๊ฑฐ๋ก์๋ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง, ์บ์ ์ฑ๋ฅ ๋ฉด์์ ๋ณด์์ ๋๋ ๊ทธ๋ฌ์ง๋ง ๋์ด์ Google ์น ํฐํธ๊ฐ ์บ์๋ก ๋ ๋น ๋ฅด๊ฒ ์ ๊ณตํ๋ค๋ ์ด์ ๋ ์๋ ๊ฒ์ด๋ค. ๋ํ ๋์ด์ ๊ตฌ๊ธ๋ก๋ถํฐ ๋ด ํด๋ผ์ด์ธํธ๋ค์ ์ ๋ณด๋ฅผ ์์ ๋กญ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์ ํ ํธ์คํ ์ด ๋ซ์ง ์์๊น ์ถ๋ค.