Logo
Hyunsu Blog
optimize-webfont

๐Ÿ“†Published :Nov 4, 2021 โ€ข

๐Ÿ“†Updated :Nov 4, 2021 โ€ข

โ˜•๏ธโ˜•๏ธ7min

Gatsby ๊ตฌ๊ธ€ ์›น ํฐํŠธ์—์„œ ์…€ํ”„ ํ˜ธ์ŠคํŠธ๋กœ ์ตœ์ ํ™” ์ ์šฉ๊ธฐ

์ด ๊ธ€์„ ์“ฐ๊ฒŒ๋œ ๊ณ„๊ธฐ๋Š” ๊ตฌ๊ธ€ ์›นํฐํŠธ๋ฅผ ์ ์šฉํ•œ ํ›„ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง์‹œ ๊นœ๋นก์ž„ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ตฌ๊ธ€ ์›นํฐํŠธ์˜ ๋™์ž‘์›๋ฆฌ ๊ทธ๋ฆฌ๊ณ  ์›นํฐํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•ด ์•Œ๊ฒŒ๋˜๋ฉด์„œ ์ ์šฉํ•œ ๊ณผ์ • ์ด๋‹ค.

  • ์ž˜๋ชป๋œ ๋ถ€๋ถ„์ด๋‚˜ ๋” ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ• ๋˜๋Š” ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐ”๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

1.๋ฌธ์ œ์ ๊ณผ ์ธก์ •

ํŽ˜์ด์ง€ ์ „ํ™˜์‹œ font๊ฐ€ ๊นœ๋นก์ด๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ๋‹ค. ๋ฌธ์ œ์ ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด chrome performance, google light-house, ๊ทธ๋ฆฌ๊ณ  webpagetest.org ์ด์šฉํ•˜์˜€๋‹ค. ์ธก์ • ํ™˜๊ฒฝ์€ slow 3g, disable cache, aws s3, cloudfront๋กœ ๋ฐฐํฌ ํ›„ ๋ฒ„์ „์„ ๋Œ€์ƒ์œผ๋กœ ์‹คํ–‰ํ•˜์˜€๋‹ค.

์ธก์ •ํ•˜๊ธฐ

render_blocking web_font_issue issue

๋งจ์œ„์˜ ๋‘ ์‚ฌ์ง„์€ ๊ฐ ๋ฆฌ์†Œ์Šค๋“ค์˜ waterfall ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€์—์„œ 17๋ฒˆ ์ธ font.googleapis.com ์š”์ฒญ์ด ๊ตฌ๊ธ€ api๋กœ ๋ถ€ํ„ฐ ํฐํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๊ณผ์ • ์ค‘์˜ ํ•˜๋‚˜์ธ css๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๊ณผ์ •์ธ๋ฐ, ์ด cssํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋๋‚˜๊ณ ์„œ์•ผ ๋ Œ๋”๋ง์ด ๋œ๋‹ค. ์‚ฌ์‹ค ๊ทธ ์ „์— ์ด๋ฏธ ์ž‘์—…์„ ๋งˆ์นœ html๊ณผ jsํŒŒ์ผ์€ ์ด css ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ ๋˜๊ธฐ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋ Œ๋”๋ง ์ฐจ๋‹จํ˜„์ƒ(3.5s ์ •๋„)์„ ๊ฒช๊ณ  ์žˆ๋‹ค.

๋‘๋ฒˆ์งธ ์ด๋ฏธ์ง€ ๋˜ํ•œ ๋ Œ๋”๋ง ์ฐจ๋‹จ์œผ๋กœ 22๋ฒˆ์˜ ๋กœ์ปฌ ํฐํŠธ ๋ฆฌ์†Œ์Šค๊ฐ€ 4~5s ์ง€์—ฐ,์ €ํ•˜๋˜๋Š” ํ˜„์ƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

๋ฌธ์ œ์ ์„ ์ •๋ฆฌํ•˜์ž๋ฉด,

  1. ๋ Œ๋”๋ง ์ฐจ๋‹จ
  2. โ€œAvoid chaining critical requestโ€ error - Lighthouse
  3. ํŽ˜์ด์ง€ ์ „ํ™˜์‹œ 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 ํŒŒ์ผ์„ ์ƒ์„ฑ ํ›„ ๋ฐฐํฌ ์‹œ์—๋Š” ํฐํŠธ ํŒŒ์ผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค.

optimizing_googlefont

๋ Œ๋”๋ง ์ฐจ๋‹จ์ด ์—†์–ด์ง„ ๋•์— ์ดˆ๊ธฐ ๋ Œ๋”๋ง์ด ์ด์ „ 7s -> 2.5s~3s ๋กœ ๋‹จ์ถ•๋˜์—ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋ณ„ ํ˜ธํ™˜์„ฑ์„ ๋ณด์ž๋ฉด,

2.2 ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ

ํฐํŠธ ํ˜•์‹์€ woff, woff2, EOT, TTF ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. woff2 ๊ฐ€ ๊ฐ€์žฅ ๊ฒฝ๋Ÿ‰ํ™”๋˜์–ด์žˆ์œผ๋ฉฐ 30% ์ •๋„ ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฉฐ IE๋ฅผ ์ œ์™ธํ•œ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋“ค์€ woff2๋ฅผ ์ง€์›ํ•œ๋‹ค, html ํŒŒ์ผ์—์„œ preload ์‹œ ํŒŒ์ผ ํ˜•์‹์œผ๋กœ๋„ ์ ํ•ฉํ•˜๋‹ค.

๊ตฌ๊ธ€ ์›น ํฐํŠธ๋Š” woff์™€ woff2๋ฅผ ์ง€์›ํ•œ๋‹ค. IE11 ๊นŒ์ง€๋Š” woff๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ IE11 ์ด์ „ ๋ฒ„์ „์„ ์ง€์›ํ•˜๋ ค๋ฉด, EOT ๋˜๋Š” TTF ํฐํŠธ ํ˜•์‹๋งŒ์ด ๊ฐ€๋Šฅํ•œ๋ฐ ๊ตฌ๊ธ€ ์›นํฐํŠธ๋Š” ์ด ํ˜•์‹๋“ค์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

woff2
woff2
woff
woff
EOT
eot
TTF
ttf

Resource Hints ์ธ preload์™€ preconnect๋Š” IE์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ preload๊ฐ€ ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ผ๋ฉด woff2๋„ ๊ฐ™์ด ์ง€์›์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ IE ๋ธŒ๋ผ์šฐ์ €๋Š” ์˜ˆ์™ธ์ด๋‹ค. IE๋ฅผ ๋Œ€์‘ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์…€ํ”„ ํ˜ธ์ŠคํŒ…์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

preload
preload
preconnect
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๊ฐœ์˜ ํ‚ค๋กœ ๊ตฌ์„ฑ๋˜์–ด์ง„ ํŠœํ”Œ์ด๋‹ค.

  1. https://a.example (the top-level site) - ๋ฐฉ๋ฌธํ•œ ์›น์‚ฌ์ดํŠธ
  2. https://a.example (the current-frame site)
  3. https://x.example/doge.png (the resource URL)

https://a.example์— ๋ฐฉ๋ฌธํ•˜์—ฌ https://x.example/doge.png ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ์ฒ˜์Œ ๋ฐฉ๋ฌธ์ด๋‹ˆ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.

๊ฐ™์€ ์œ ์ €๊ฐ€ https://b.example ์— ๋ฐฉ๋ฌธํ•˜๊ณ  ๊ฐ™์€ ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•œ๋‹ค. ๊ธฐ์กด ์บ์‹œ ์‹œ์Šคํ…œ๊ณผ๋Š” ๋‹ฌ๋ฆฌ the top-level site ์บ์‹œ ํ‚ค๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ, ์ƒˆ๋กœ ์บ์‹œ๋กœ ์ €์žฅํ•œ๋‹ค.

๊ฐ™์€ ์œ ์ €๊ฐ€ ์ด๋ฒˆ์—” 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 ์›น ํฐํŠธ์—์„œ ์•Œ์•„์„œ ์ž‘์—…ํ•ด์คฌ๋˜ ์ผ๋ จ์˜ ๊ณผ์ •๋“ค์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

  1. ์ตœ์ ํ™”๋œ font format ๋กœ์ปฌ ํŒŒ์ผ
  2. @font-face์ง€์ •
  3. preload ์„ค์ •
  4. 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๊ฐ€ ์žˆ๋‹ค.

  1. FOIT๋Š” ๊ธ€๊ผด์„ ๋กœ๋“œํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €๋Š” ํ…์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ˆจ๊ธด๋‹ค. Chrome์ด๋‚˜ Firefox๋Š” 3์ดˆ ๋™์•ˆ ํ…์ŠคํŠธ๋ฅผ ์ˆจ๊ธฐ๊ณ  ๊ทธ๋•Œ๊นŒ์ง€ ํฐํŠธ๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ ํฐํŠธ๊ฐ€ ๋กœ๋“œ๋œ๋‹ค. Safari์˜ ๊ฒฝ์šฐ๋Š” ๋ชจ๋“  ๊ธ€๊ผด์„ ๋กœ๋“œํ•  ๋•Œ๊นŒ์ง€ ํ…์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ˆจ๊ธด๋‹ค.

  2. FOUT๋Š” Internet Explorer์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ ์›น ํฐํŠธ๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ๊นŒ์ง€ ์‹œ์Šคํ…œํฐํŠธ/fallback ํฐํŠธ๋ฅผ ๋จผ์ € ๋ณด์—ฌ์ค€๋‹ค. ์›น ํฐํŠธ ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ํ…์ŠคํŠธ๋ฅผ ์›น ํฐํŠธ๋กœ ์ „ํ™˜ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๋Š” blank ํŽ˜์ด์ง€๋ฅผ ๋ณด์ง€ ์•Š๊ณ  ํ•ญ์ƒ ํ…์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์›นํฐํŠธ์™€ ์‹œ์Šคํ…œํฐํŠธ/fallback ํฐํŠธ ์‚ฌ์ด์˜ ๊ธ€๊ผด์˜ ์ž๊ฐ„, ๋†’์ด ๋“ฑ ์„œ์‹์˜ ์ฐจ์ด์— ๋”ฐ๋ผ ํฐํŠธ์˜ ์ „ํ™”์‹œ์ ์— ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค(layout shift performance). ์ด๋Š” fontStyleMatcher๋ฅผ ํ†ตํ•ด์„œ ๊ธ€๊ผด๊ฐ„์˜ ์„œ์‹์„ ํ†ต์ผ๊ฐ์žˆ๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.

FIOT๋ฅผ ํ•ด๊ฒฐ ํ•  ๋ฐฉ๋ฒ•์œผ๋กœ @font-face ์—์„œ font-display: swap ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ FOUT๋กœ ์ „ํ™˜ํ•˜๋Š”๋ฐ, ์ด๋Š” ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์‹œ์Šคํ…œ ํฐํŠธ๋ฅผ ๋จผ์ € ๋ณด๊ณ  ํฐํŠธ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— ๋‹ค์šด๋กœ๋“œ๋œ ํฐํŠธ๋ฅผ ๋ณด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

font-dsplay์˜ ์†์„ฑ ๊ฐ’๊ณผ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… - naverD2-์›น ํฐํŠธ ์‚ฌ์šฉ๊ณผ ์ตœ์ ํ™”์˜ ์ตœ๊ทผ ๋™ํ–ฅ

@font-face { . . font-display: swap; . . }
font-display๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์ „
display_swap_before
font-display:swap ์ง€์ • ํ›„
display_swap_after

4.5 ์ตœ์ ํ™” ์ „,ํ›„ light house

  • 5๋ฒˆ ์‹œ๋„์—์„œ์˜ ํ‰๊ท 
์ตœ์ ํ™” ์ „
display_swap_after
์ตœ์ ํ™” ํ›„
display_swap_after

5. ์…€ํ”„ํ˜ธ์ŠคํŒ… ํฐํŠธ vs ๊ตฌ๊ธ€ ์›นํฐํŠธ

5.1. ์…€ํ”„ ํ˜ธ์ŠคํŒ… ํฐํŠธ

after_optimizing_localfont

5.2. ๊ตฌ๊ธ€ ์›น ํฐํŠธ

optimize_google_font

์…€ํ”„ ํ˜ธ์ŠคํŒ… ํ•œ๊ธ€ ํฐํŠธ๊ฐ€ ํ™•์‹คํžˆ ๊ตฌ๊ธ€ ํ•œ๊ธ€ ํฐํŠธ์— ๋น„ํ•ด ๋งŽ์œผ๋ฉด 20๋ฐฐ ๋„˜๊ฒŒ๋„ 20KB -> 466KB ์ฐจ์ด๋‚œ๋‹ค. LCP(Largest Contentful Paint)์—์„œ๋Š” ๋‘˜ ๋น„์Šทํ•œ ์ˆ˜์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ์ด ์ธก์ •๋งŒ์œผ๋กœ ๋‘ ๋ฐฉ์‹์ด ๋น„์Šทํ•˜๋‹ค๋ผ๊ณ ๋งŒ ๋ณผ ์ˆ˜๋Š” ์—†๋‹ค. ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ํฐํŠธ ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์œผ๋ฉฐ, preloading์ด ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋“ค์ด ๋งŽ์•„์ง€๊ฑฐ๋‚˜, ์›น์˜ ๋ณต์žก์„ฑ, ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋Š” ์ถฉ๋ถ„ํžˆ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํ˜„์žฌ ๋ธ”๋กœ๊ทธ ๋‚ด์—์„œ ๋‹ค์–‘ํ•œ ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋“ค์ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์…€ํ”„ ํ˜ธ์ŠคํŒ…๊ณผ ๊ตฌ๊ธ€ ์›นํฐํŠธ๋ฅผ ์ตœ์ ํ™”ํ•  ๊ฒฝ์šฐ ๋น„์Šทํ•œ ํผํฌ๋จผ์Šค๋ฅผ ๋„์ถœํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์›นํฐํŠธ ์ฃผ์ œ๊ฐ€ ์•Œ๋ฉด ์•Œ ์ˆ˜๋ก ์žฌ๋ฏธ์žˆ๊ณ  ์ƒ๊ฐ๋ณด๋‹ค ๊นŠ์€ ์ฃผ์ œ์˜€๋‹ค. ๋ชจ๋ฅด๋Š” ๋” ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์ง€๋งŒ ๋‚˜์˜ gatsby ๋ธ”๋กœ๊ทธ์—์„œ์˜ ์›นํฐํŠธ ์ตœ์ ํ™”๋Š” ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ํฌ๊ฒŒ ๊ธฐ์—ฌ๊ฐ€ ๋˜์—ˆ๋‹ค. ๋งŒ์•ฝ Google ์›นํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํฐํŠธ์˜ ๊ฒฝ๋Ÿ‰ํ™” ์ž‘์—…์„ ์ƒ๊ฐํ•  ํ•„์š”๋„ ์—†๊ณ  ์–ด๋–ค ๋ฒ„์ „์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋„๋ก ๋ธŒ๋ผ์šฐ์ € ์ง€์›์„ ํ™•์ธํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€๋„ ์—†์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, ์บ์‹œ ์„ฑ๋Šฅ ๋ฉด์—์„œ ๋ณด์•˜์„ ๋•Œ๋„ ๊ทธ๋žฌ์ง€๋งŒ ๋”์ด์ƒ Google ์›น ํฐํŠธ๊ฐ€ ์บ์‹œ๋กœ ๋” ๋น ๋ฅด๊ฒŒ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ด์ ๋„ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ๋”์ด์ƒ ๊ตฌ๊ธ€๋กœ๋ถ€ํ„ฐ ๋‚ด ํด๋ผ์ด์–ธํŠธ๋“ค์˜ ์ •๋ณด๋ฅผ ์ž์œ ๋กญ๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์…€ํ”„ ํ˜ธ์ŠคํŒ…์ด ๋‚ซ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.


์ฐธ๊ณ ์ž๋ฃŒ

Hi, I'm Hyunsu ๐Ÿ‘‹

Profile Image

์•ˆ๋…•ํ•˜์„ธ์š”. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ฃผํ˜„์ˆ˜์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ํ’๋ถ€ํ•˜๊ณ  ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์ผ์— ๋ฟŒ๋“ฏํ•จ์„ ๋Š๋‚๋‹ˆ๋‹ค.

์˜ต์‹œ๋””์–ธ(Obsidian)์—์„œ ํ˜„์žฌ ๋ธ”๋กœ๊ทธ๋กœ ํ•˜๋‚˜์”ฉ ๊ธ€์„ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์— ์žˆ์–ด์š”. โ˜•๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป โ›ท

Github on ViewReach Me Out