{"componentChunkName":"component---src-templates-blog-post-js","path":"/frontendPerformance/font/","result":{"data":{"site":{"siteMetadata":{"title":"Zayden","author":"[Your Name]","siteUrl":"https://gatsby-starter-bee.netlify.com","comment":{"disqusShortName":"","utterances":"JaeYeopHan/gatsby-starter-bee"},"sponsor":{"buyMeACoffeeId":"jbee"}}},"markdownRemark":{"id":"93074a71-f245-5ed4-87c2-2238441df962","excerpt":"저는 해당 도서에서 제공해주는 샘플코드를 이용하고 있으므로 샘플코드가 없으신분들은 최적화하는 과정에 대해서만 알고계서도 좋을것같습니다. 폰트 분석하기 브라우저 개발자도구에서 Network 패널에서 throttle 설정을 ‘Fast 3G’로 설정 후 폰트가 적용된 부분을 확인하면 아래와 같습니다. 폰트 적용 전  폰트 적용 후  이러한 현상은 텍스트가 보이는 시점에 폰트 다운로드가 완료되지 않아 생기는 현상입니다. Network 패널에서 폰트를 확인해 보면 파일 크기가 750kB…","html":"<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">해당 글은 \"프론트엔드 최적화 가이드\"라는 도서를 기반하여 작성한 글입니다.</code></pre></div>\n<p>저는 해당 도서에서 제공해주는 샘플코드를 이용하고 있으므로 샘플코드가 없으신분들은 최적화하는 과정에 대해서만 알고계서도 좋을것같습니다.</p>\n<br/>\n<h3 id=\"폰트-분석하기\" style=\"position:relative;\"><a href=\"#%ED%8F%B0%ED%8A%B8-%EB%B6%84%EC%84%9D%ED%95%98%EA%B8%B0\" aria-label=\"폰트 분석하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>폰트 분석하기</h3>\n<p>브라우저 개발자도구에서 Network 패널에서 throttle 설정을 ‘Fast 3G’로 설정 후 폰트가 적용된 부분을 확인하면 아래와 같습니다.</p>\n<ul>\n<li>폰트 적용 전</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 722px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 104%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAFkElEQVQ4yx2U+VOT+R3HH516Leu62y5Ores4o7O7qMgqcpkQEw4DOUGQI0BAiAlHOBJyQO4bImdQQU4V5Vh0OWztWtrObttxOv2h03/p1e/uD5l5Js/M+/m8T6m8wUjToJPLmnpOyLWcUtbwZXkdBeYezmmb+KJUy+fif73FwsSUm/nZh0xP3SM9pSeZVjMclNMxkE+XqwBXSIHU5XVjDyf4TK7jjLqBYyVVZKlqfgXOrqxDuiqjpMWKecBGJG4lGjDiG1YxntIRSajwBcqJhPU4PQo6bNeQTE4Xl9R1nFQYxc/AV5oGrjY/5LyhjSs1Jm42dBKZmyc9m2R5NUwqZWJ10cuj8QYGBm8xljKSCGmx2xTo9XlI3+oaOFJYwZdaE0eKqqjoHeZMRS0GV4TkwiraPg8zK4usrc/x4/vHrCz18/M/dlhZduN2yJidqicSqqDnoYzGe4LyqYJyfqttFNfp+IOmkfJuJ9KtcoxDPtzpDOH5VdbfvGJ7c5LDD3Psvw1ycDDBqE9FZuI+E/E6Bu0yRnxldFlKkT5V6DmrNyEV3kVudXBB18QxmYasG0ouKrQMxFJEp0KsPO1m/Xk3yysdgnYVwZCSp5kGHgvQXstt7P0KmjsKkLI1TXyiNPJFWS2VPS6Olqg5XnSXetswanM3JpeP9Y05Xq15mZnUsb83ztKSncPDeabGq5hO6oj51QR8SqxWAXhW24xUUs13rT3kNnYh5ZdzTmnA7k/wyXUZi292+c+//8r7P86zvNTGP396ycd/bfPx4zbJZCXJ8F1Gh+4wPKRgaPA20umyGo6KyGRV1PEbmZYTgu7Ry/kYH/QRnVtk8tksrzeesLf7mK0tL4vPeoSOSd7sBEiL6KSigr5HRdSnZXhQhnRCVi0cbiZb38ppkbuTRRVIF3K5IMwyOzyY7G3iigdEvRrGomr8AbnIYBUebzGJhJrZCQMhv5KZtBFnrwA8I/Rr9sVQDfrINpg4/p2w/vw1csr06Kx9DIT6eZbpZ/mxjYUFC2PpapbmWxkNlOH1lZJOVuNxlxJL1hAIiyLkNlpwTMxxvXOAUyojx3JKkM7l8LtbCuQtZtxRO9MZK6trTp6uOfAnykU7lHi9ZcQTGjJTtdh68hiJ6BkK1iJp+j10JSb4fa2ZT4UZJ3PlHLl8kwsqLVUWG4GoFUtfofh6BX6hV7+nmFTSQCKmIRH+xZRKnKLLo57bxEKVosvhMSoGR7lYYya7XBh0TcZZeRVtrlEW1ld4d/CCzBMPP7xNs7kdYX07xsZOCOtAHom4mmlRvZDnDpPxasJu4bJ7Zp6rrd3k3Gvnq8p7SN8UUnS/A0dijIPDP3P4tz323y2y8covaufkf//9wJNnNkydX+P2lrK00C501JMRpgTE4kjmyDg5TRau3xeUC8qQcorRWfpocXiJTSV5/irN2qqLne0gaytO3m6GBIhDNOMGw858osJpt7vo10v9DhVSXlsv541tXNLe59RNJVn5SuoH3XQ57UK3QeJjfaQfteIPyQnFlUzP6kSPCwmGFcxlapmZE5QjCoLBUsZFa6QrLd0cE8HOrWsnz9hCWaedjmCKv/z9T+zubfDi+TSbrxPs72d4/drL5pad3f1RXq67+PDjLO8Pony/7SE9aaDTcgXpYt0Djoj+XhI7aLANoeseoj04xs7uC/b2XrLxcpwP7zJ8vxVkZ2uEzfVh8Twi3gtztn28+yHE3psRxhJ36X0oNMwS2Tsu2nLyhoLskkpOF6j42tCE09WI32cWjRBzn6wnNa4mGC0kHlXhHy4mLYbB7riJTxjzKFHJRKSCbnOx2EO5hs/u6DiRJxf8i7hW+8tKt4vzC4mFawSwRmhlYjZTQyhaTDxUwHRMQTxQTKc1B7enAI+zgHRQia3lKv8HK8+U8QHa8DcAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"font01\"\n        title=\"font01\"\n        src=\"/static/0370f36f10b4ebf8007b7fcddfdafe51/d44c9/font01.png\"\n        srcset=\"/static/0370f36f10b4ebf8007b7fcddfdafe51/5a46d/font01.png 300w,\n/static/0370f36f10b4ebf8007b7fcddfdafe51/0a47e/font01.png 600w,\n/static/0370f36f10b4ebf8007b7fcddfdafe51/d44c9/font01.png 722w\"\n        sizes=\"(max-width: 722px) 100vw, 722px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<ul>\n<li>폰트 적용 후</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 664px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 106.33333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,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'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"font02\"\n        title=\"font02\"\n        src=\"/static/5c62895e09df41982044aa574fc354bf/31493/font02.png\"\n        srcset=\"/static/5c62895e09df41982044aa574fc354bf/5a46d/font02.png 300w,\n/static/5c62895e09df41982044aa574fc354bf/0a47e/font02.png 600w,\n/static/5c62895e09df41982044aa574fc354bf/31493/font02.png 664w\"\n        sizes=\"(max-width: 664px) 100vw, 664px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>이러한 현상은 텍스트가 보이는 시점에 폰트 다운로드가 완료되지 않아 생기는 현상입니다. Network 패널에서 폰트를 확인해 보면 파일 크기가 750kB이고 다운로드하는데 21초가 걸린 것을 볼 수 있습니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 1060px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 4%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAT0lEQVQI1x3L6wpAMACAUa+ym0KbuRSbzSjJ+7/QR/6eOlUuJ3k/SLmQ9kLTdoQtobXG9Z5xmpFSIYTEWsd1P/R++ExiTE2IiWWNKKX+8wL3vh9OlWWXywAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"font03\"\n        title=\"font03\"\n        src=\"/static/8ab6475d939127d5c920d51f71ccc2e2/77672/font03.png\"\n        srcset=\"/static/8ab6475d939127d5c920d51f71ccc2e2/5a46d/font03.png 300w,\n/static/8ab6475d939127d5c920d51f71ccc2e2/0a47e/font03.png 600w,\n/static/8ab6475d939127d5c920d51f71ccc2e2/77672/font03.png 1060w\"\n        sizes=\"(max-width: 1060px) 100vw, 1060px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>즉, 페이지가 로드되고 21초 후에야 폰트가 제대로 적용된 모습을 볼 수 있다는 의미입니다. 이러한 현상은 당연히 사용성에 영향을 줍니다. 폰트가 바뀌면서 깜박이는 모습은 페이지가 느리다는 느낌을 줄 수 있습니다.</p>\n<br/>\n<h3 id=\"fout-foit\" style=\"position:relative;\"><a href=\"#fout-foit\" aria-label=\"fout foit permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>FOUT, FOIT</h3>\n<p>폰트의 변화로 발생하는 이 현상을 FOUT(Flash of Unstyled Text) 또는 FOIT(Flash of Invisible Text)라고 합니다.</p>\n<h4 id=\"fout\" style=\"position:relative;\"><a href=\"#fout\" aria-label=\"fout permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>FOUT</h4>\n<p>FOUT는 Edge 브라우저에서 폰트를 로드하는 방식으로, 폰트의 다운로드 여부와 상관없이 먼저 텍스트를 보여준 후 폰트가 다운로드되면 그때 폰트를 적용하는 방식입니다.</p>\n<h4 id=\"foit\" style=\"position:relative;\"><a href=\"#foit\" aria-label=\"foit permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>FOIT</h4>\n<p>FOIT는 크롬, 사파리, 파이어폭스 등에서 폰트를 로드하는 방식으로, 폰트가 완전히 다운로드되기 전까지 텍스트 자체를 보여 주지 않습니다. 그리고 폰트 다운로드가 완료되면 폰트가 적용된 텍스트를 보여 줍니다. 하지만 크롬에서는 폰트가 제대로 다운로드되지 않았는데도 텍스트가 보입니다. 그 이유는 완전한 FOIT가 아니라 3초만 기다리는 FOIT이기 때문입니다. 즉, 3초 동안은 폰트가 다운로드되기를 기다리다가 3초가 지나도 폰트가 다운로드되지 않으면 기본 폰트로 텍스트를 보여줍니다. 그런 다음 폰트가 다운로드되면 해당 폰트를 적용합니다. 그래서 크롬에서 텍스트가 표시되는 과정을 보면 페이지 로드 후, 첫 3초 동안은 텍스트가 보이지 않는 것을 알 수 있습니다.</p>\n<p>여기서 중요한 것은 폰트를 최대한 최적화해서 폰트 적용 시 발생하는 깜박임 현상을 최소화하는 것입니다.</p>\n<br/>\n<h3 id=\"폰트-최적화-방법\" style=\"position:relative;\"><a href=\"#%ED%8F%B0%ED%8A%B8-%EC%B5%9C%EC%A0%81%ED%99%94-%EB%B0%A9%EB%B2%95\" aria-label=\"폰트 최적화 방법 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>폰트 최적화 방법</h3>\n<p>폰트를 최적화하는 방법은 크게 두 가지가 있습니다. 폰트 적용 시점을 제어하는 방법 또는 폰트 사이즈를 줄이는 방법입니다.</p>\n<h4 id=\"폰트-적용-시점-제어하기\" style=\"position:relative;\"><a href=\"#%ED%8F%B0%ED%8A%B8-%EC%A0%81%EC%9A%A9-%EC%8B%9C%EC%A0%90-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0\" aria-label=\"폰트 적용 시점 제어하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>폰트 적용 시점 제어하기</h4>\n<p>예시를 한가지 들어보겠습니다. 중요한 텏스트(뉴스 제목 등)의 경우 FOIT 방식으로 폰트를 적용하면 텍스트 내용이 사용자에게 빠르게 전달되지 않을 것입니다. 반면에 사용자에게 꼭 전달하지 않아도 되는 텍스트의 경우 FOUT 방식으로 인한 폰트 변화는 사용자의 시선을 분산시킬 수 있습니다. 따라서 서비스 또는 콘텐츠의 특성에 맞게 적절한 방식을 적용해야 합니다.</p>\n<p>CSS의 font-display 속성을 이용하면 폰트가 적용되는 시점을 제어할 수 있습니다. font-display는 @font-face에서 설정할 수 있고 다음 값을 가집니다.</p>\n<ul>\n<li>auto: 브라우저의 기본 동작 (기본 값)</li>\n<li>block: FOIT (timeout = 3s)</li>\n<li>swap: FOUT</li>\n<li>fallback: FOIT (timeout = 0.1s) / 3초 후에도 불러오지 못한 경우 기본 폰트로 유지, 이후 캐시</li>\n<li>optional: FOIT (timeout = 0.1s) / 이후 네트워크 상태에 따라 기본 폰트로 유지할지 결정, 이후 캐시</li>\n</ul>\n<p>이러한 속성을 이용하면 FOUT 방식으로 폰트를 렌더링하는 Edge에 FOIT 방식을 적용하거나, FOIT 방식으로 폰트를 렌더링하는 크롬에 FOUT 방식을 적용할 수 있습니다.</p>\n<p>fallback과 optional은 FOIT 방식이지만 텍스트를 보여 주지 않는 시간이 3초가 아닌 0.1초입니다. 차이점은 fallback의 경우 3초 후에도 폰트를 다운로드하지 못한 경우, 이후에 폰트가 다운로드되더라도 폰트를 적용하지 않고 캐시해 둡니다. 결국 최초 페이지 로드엣 폰트가 늦게 다운로드되면 폰트가 적용되지 않는 모습이 계속 보입니다. 하지만 페이지를 다시 로드했을때는 폰트가 캐시되어 있으므로 바로 폰트가 적용된 텍스트를 볼 수 있게 됩니다. optional의 경우 3초가 아니라 사용자의 네트워크 상태를 기준으로 폰트를 적용할지 기본 폰트로 유지할지 결정합니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@font-face</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> 폰트이름<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">src</span><span class=\"token punctuation\">:</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'폰트경로'</span><span class=\"token punctuation\">)</span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>다시 한번 정리하면, <code class=\"language-text\">font-display</code> 속성을 이용해서 폰트가 적용되는 시점을 제어할 수 있습니다. 중요한 것은 서비스하는 콘텐츠의 특성에 맞게 적절한 값을 설정하는 것입니다.</p>\n<p>이번글에서는 FOIT 방식인 block을 사용할 것입니다. 그 이유는 적용할 텍스트는 빠르게 보여 줘야 하거나 중요한 내용의 텍스트는 아니기 때문에 폰트가 적용된 상태로 보이는 것이 사용자에게 더 자연스러워 보이기 때문입니다. 여기서 문제는 block 옵션을 설정하면 안보이던 폰트가 갑자기 나타나서 조금 어색할 수도 있다는 점입니다. 이러한 문제를 해결하기 위해 페이드 인 애니메니션을 적용해 보려고 합니다.</p>\n<p>폰트에 페이드 인 효과를 적용하려면 CSS가 아닌 자바스크립트의 도움이 필요합니다. 폰트가 다운로드되기 전에는 텍스트를 보여 주지 않다가 다운로드가 완료되면 페이드 인 효과와 함께 폰트가 적용된 텍스트를 보여 주는 것입니다. 그러려면 먼저 폰트가 다운로드 완료되는 시점을 알아야 합니다. 폰트의 다운로드 시점은 fontfaceobserver라는 라이브러리를 통해 알 수 있습니다.</p>\n<blockquote>\n<p><a href=\"https://fontfaceobserver.com/\">https://fontfaceobserver.com/</a></p>\n</blockquote>\n<p>간단히 샘플코드를 통해 fontfaceobserver를 사용해보겠습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> font <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">FontFaceObserver</span><span class=\"token punctuation\">(</span><span class=\"token string\">'BMYEONSUNG'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">Sample</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token punctuation\">[</span>isFontLoaded<span class=\"token punctuation\">,</span> setIsFontLoaded<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token function\">useState</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">useEffect</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    font<span class=\"token punctuation\">.</span><span class=\"token function\">load</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token number\">20000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">setIsFontLoaded</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token operator\">&lt;</span>div\n      style<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span><span class=\"token punctuation\">{</span>\n        opacity<span class=\"token operator\">:</span> isFontLoaded <span class=\"token operator\">?</span> <span class=\"token number\">1</span> <span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n        transition<span class=\"token operator\">:</span> <span class=\"token string\">'opacity 0.3s ease'</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">}</span>\n    <span class=\"token operator\">></span>\n      Test\n    <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>div<span class=\"token operator\">></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>위 코드와 같이 load 메서드를 통해 어느 시점에 폰트가 다운로드 되었는지를 알 수 있습니다. opacity를 폰트 로드 상태에 따라 0에서 1로 바꿔 주고 transition 속성을 설정하면 폰트가 로드될 때 텍스트가 애니메이션 효과와 함께 나타날 것입니다.</p>\n<p>텍스트를 단순히 빠르게 띄우는 것도 좋지만, 이런 식으로 사용자에게 보기 편하게 서비스하는 것도 체감 성능을 높이는 데 중요합니다.</p>\n<h4 id=\"폰트-파일-크기-줄이기\" style=\"position:relative;\"><a href=\"#%ED%8F%B0%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%ED%81%AC%EA%B8%B0-%EC%A4%84%EC%9D%B4%EA%B8%B0\" aria-label=\"폰트 파일 크기 줄이기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>폰트 파일 크기 줄이기</h4>\n<p>이번에는 폰트 파일 크기를 줄여 폰트가 다운로드되는 시간을 단축하는 방법을 알아보겠습니다. 폰트 파일 크기를 줄이는 방법에는 두 가지가 있습니다. 하나는 이미지나 비디오와 마찬가지로 압축률이 좋은 폰트 포맷을 사용하는 것이고, 다른 하나는 필요한 문자의 폰트만 로드하는 것입니다.</p>\n<h5 id=\"폰트-포맷-변경하기\" style=\"position:relative;\"><a href=\"#%ED%8F%B0%ED%8A%B8-%ED%8F%AC%EB%A7%B7-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0\" aria-label=\"폰트 포맷 변경하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>폰트 포맷 변경하기</h5>\n<p>우리가 흔히 알고 있는 폰트 포맷은 TTF 및 OTF 포맷입니다. 이번글에서 사용하는 포맷은 TTF 포맷입니다. 하지만 TTF 포맷은 파일 크기가 매우 큽니다. 웹 환경에서는 해당 리소스(폰트)를 매번 다운로드 해야 하므로 적절하지 않습니다. 그래서 나온 것이 WOFF입니다.</p>\n<p>WOFF는 Web Open Font Fomat의 약자로, 이름 그대로 웹을 위한 폰트입니다. 이 포맷은 TTF 폰트를 압축하여 웹에서 더욱 빠르게 로드할 수 있도록 만들었습니다. 더 나아갓서 WOFF2라는 더욱 향상된 압축 방식을 적용한 포맷도 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">파일 크기 : EOT > TTF/OTF > WOFF > WOFF2</code></pre></div>\n<p>하지만 WOFF와 WOFF2에도 브라우저 호환성 문제가 있습니다. 물론 모던 브라우저에서는 정상적으로 사용할 수 있지만, 버전이 낮은 일부 브라우저에서는 해당 포맷을 지원하지 않을 수 있습니다. 그래서 WOFF2를 우선으로 적용하고 만약 브라우저가 WOFF2를 지원하지 않으면 WOFF를, WOFF도 지원하지 않으면 TTF를 적용해보도록 하겠습니다.</p>\n<p>앞서서 말한것처럼 현재 사용하고 있는 포맷은 TTF로 가정하고 이 포맷 폰트를 Transfonter 라는 서비스를 이용하여 WOFF와 WOFF2로 변환을 해보겠습니다.</p>\n<blockquote>\n<p><a href=\"https://transfonter.org/\">https://transfonter.org/</a></p>\n</blockquote>\n<p>해당 서비스를 이용하여 폰트를 변환하는 방법은 생략하겠습니다. 위에 해당 서비스 링크를 추가해두었으니 참고 부탁드립니다.</p>\n<p>TTF 포맷을 WOFF와 WOFF2로 변환을 하게 된다면 1.9MB(TTF)에서 790KB(WOFF)와 447KB(WOFF2)로 폰트 파일의 크기가 줄어듭니다.</p>\n<p>폰트를 적용하기 위해서는 <code class=\"language-text\">@font-face</code> 에 넣으면 되며, src 속성에 적용 우선순위가 높은 것부터 차례로 나열하면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@font-face</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> 폰트 이름<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">src</span><span class=\"token punctuation\">:</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'폰트.woff2'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'woff2'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'폰트.woff'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'woff'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'폰트.ttf'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'truetype'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>해당 폰트가 적용된 페이지를 브라우저에서 Network패널에서 확인해보면 WOFF2 포맷의 폰트가 로드되는 것을 볼 수 있습니다. 만약 브라우저가 WOFF2를 지원하지 않는다면 WOFF를 로드할 것입니다.</p>\n<h5 id=\"서브센-폰트-사용\" style=\"position:relative;\"><a href=\"#%EC%84%9C%EB%B8%8C%EC%84%BC-%ED%8F%B0%ED%8A%B8-%EC%82%AC%EC%9A%A9\" aria-label=\"서브센 폰트 사용 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>서브센 폰트 사용</h5>\n<p>앞서서는 폰트 포맷을 변경하여 파일 크기를 줄여 봤습니다. 꽤 의미 있는 수준으로 줄어들긴 했지만 447KB(WOFF2)이라는 용량은 여전히 너무 큽니다. 하지만 폰트라는 것은 모든 글자에 대한 스타일 정보를 모두 담고 있기 때문에 이 이상 줄이기 어려울지도 모릅니다. 그런데 만약 웹 서비스에서 웹 폰트를 사용하는 텍스트가 하나이거나 특정 부분일 경우에는 모든 문장의 폰트 정보를 가지고 있을 필요 없이 해당 문자의 폰트 정보만 있으면 된다는 의미입니다.</p>\n<p>이렇게 모든 문자가 아닌 일부 문자의 폰트 정보만 가지고 있는 것을 서브셋 폰트라고 합니다.</p>\n<p>서브셋 폰트는 이전에 폰트 포맷을 변경할때 사용하였던 Transfonter 서비스에서 생성할 수 있습니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 829px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 55.00000000000001%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABw0lEQVQoz22TWY+bQBCE+f8/KsqxK8WKlHViG+8aA8Mpcw+3Bz9UusfA8pCHMjND6ZvuLmNEMsAu/AF1V8iLAnmeoyxLtG2Lvu/RdZ1+juOIqqpIEhl52FuQj98vYp9xkzF+BztkaQbXFbCuV3iep6EMWJ5sDsMQvu/DcWy4QiCOY0gpVx+vjaEbkMY5oijS1S3il1ulaUrnGVVX4mSFBA/0eZIkq5+7Mvjnltz0DXVdo54Bz/aqdc3VVOQpZQvTTpHcYvI3a2UrkCGCyl8qW1rcSkMZVjxnNimF+/2upWjNGoYBHQNl08Kh2flBCM8P9MAlXVIxZBbvOYSWYY8HgQioPqWBFFo3jFRhFEC8fkN+eEP9foA8H1BvpPfvrCO6i4nR+cDDd0g2Ht5TE0m5F/R0bjSOBfH9C7yfLyj+vKE5HyHNvwTb6oDyuEe6/4XqtEdvnQl+0s/heiaYBUUX9eQ1aurbFR58L4DpnZBXGQXTUKvz7OaBF9Ty8l/j4TdNo/c8Bp6lniG3zOarbcMXIV4/vmInXtBSkhzOIg6GgRxgNwOWMNQcEAN1yrzQ0Vc1siLDJTXXL2Qr/lL4nDVN03/Fnn+PLTuMTQIUEQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"fontt04\"\n        title=\"fontt04\"\n        src=\"/static/855145dc4b41380899ef501c34eb597d/9d76a/fontt04.png\"\n        srcset=\"/static/855145dc4b41380899ef501c34eb597d/5a46d/fontt04.png 300w,\n/static/855145dc4b41380899ef501c34eb597d/0a47e/fontt04.png 600w,\n/static/855145dc4b41380899ef501c34eb597d/9d76a/fontt04.png 829w\"\n        sizes=\"(max-width: 829px) 100vw, 829px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>위에 첨부된 사진을 보면 빨간색 박스로 하이라이트된 Charactors 속성에서 필요한 문자를 입력하면 해당 문자관련 서브셋 폰트 파일이 생성됩니다.</p>\n<p>그래서 변환된 파일을 확인해보면 파일 크기가 매우 작음을 확인할 수 있습니다. 왜냐하면 기존에 폰트 파일에는 모든 문자의 폰트 정보가 포함되어 있었기 때문에 파일 크기가 굉장히 컷는데, 서브셋 폰트에서는 일부 문자를 제외하고 모두 제거했기 때문입니다.</p>\n<p>해당 폰트도 이전 했던 방식처럼 <code class=\"language-text\">@font-face</code> 에 넣으면 됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@font-face</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> 폰트 이름<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">src</span><span class=\"token punctuation\">:</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'서브셋 폰트.woff2'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'woff2'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'서브셋 폰트.woff'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'woff'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'서브셋 폰트.ttf'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'truetype'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>서브셋 폰트를 적용한 후 Network 패널에서 확인해보면, 서브셋 폰트가 아닌것보다 파일 크기가 줄었고, 빠르게 로드되는 것을 볼 수 있습니다.</p>\n<p>여기서 또 다른 방법이 있습니다. 폰트를 파일 형태가 아닌 Data-URI 형태로 CSS 파일에 포함할 수 있습니다.</p>\n<p>Data-URI랄 data 스킴이 접두어로 붙은 문자열 형태의 데이터인데, 쉽게 말해서 파일을 문자열 형태로 변환하여 문서(HTML, CSS, 자바스크립트 등)에 인라인으로 삽입하는 것입니다. 보통은 css 파일이 로드된 후 폰트를 적용하기 위해 폰트 파일을 추가로 로드해야 하지만, Data-URI 형태로 만들어서 css 파일에 넣어 두면 별도의 네트워크 로드 없이 css 파일에서 폰트를 사용할 수 있습니다.</p>\n<p>폰트 파일을 Data-URI 형태로 css 에 포함하려면 먼저 폰트를 문자열 데이터로 변환해야 합니다. 이때도 Transfonter을 이용하면 됩니다. 해당 폰트를 Data-URI 형태로 추출하기 위해서 Base64 encode 옵션을 On으로 설정해 줍니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 815px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 54.666666666666664%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsSAAALEgHS3X78AAABtklEQVQoz3WSW2/TQBCF/fP5OTyXCrVFggqJqq2CKAmpb42vu157HcdOLHSYs7ahF/FwNLZ15tszs/budt/wJb7E2I9I0kSUIs8LWGvRtu1U93v8bgeoJEGZ7JDGEbIoRC7vddP880n1Iu3jIV1Blxq/tlv4foAoilBVFYyotnsU63ucfXgHtbpG8vkK4dU5wk8fkYpMWTgo/XVdw7N1i+QpQyKnaV2J9AQzxoknp2GEi4v3MFs5eLPB9+tbhDdf0Wx+oMgymShHLd5GwB6bU/lIurWNq9QCpLFqWuRFAyVebTusY4OdrMZ2B5jZO/VbeGWpEAQhirJ0ctFn2KJGzJVW0EqhlabxOOB4PGLoewzD9NzL81527SkxcW9xHCOU3SmlXyQ08yj0McE4jg7yXA4u9S+QCZmsmUc2rxLyG2/wcDg4EfBcC7jrOgHKJTBhEApUmf8CKV4YKxuZhpXq59EdkKYgmIA/owdow6bmDXC5cYJYl9TUy4Qy8uOjjzCIcLk+x/3TDfgrvd4hD2ZlGo55Op3ejO12yAb+g0VWIkh8rHa3rnEZk+I7U7FS3CMBhC/jUvz+B30vPfEi17/EAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"font05\"\n        title=\"font05\"\n        src=\"/static/26d22a5b991f781061080064f6178a41/ef916/font05.png\"\n        srcset=\"/static/26d22a5b991f781061080064f6178a41/5a46d/font05.png 300w,\n/static/26d22a5b991f781061080064f6178a41/0a47e/font05.png 600w,\n/static/26d22a5b991f781061080064f6178a41/ef916/font05.png 815w\"\n        sizes=\"(max-width: 815px) 100vw, 815px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>변환이 완료되면 변환된 파일 중 stylesheet.css 파일을 열어 <code class=\"language-text\">@font-face</code>에서 <code class=\"language-text\">src</code>속성에 url 부분을 복사해서 가져와 적용할 css 파일에 넣어주면됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token atrule\"><span class=\"token rule\">@font-face</span></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> 폰트 이름<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">src</span><span class=\"token punctuation\">:</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'data:font/woff2;charset=utf-8;base64....'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'woff2'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'서브셋 폰트.woff'</span><span class=\"token punctuation\">)</span></span>\n      <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'woff'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token url\"><span class=\"token function\">url</span><span class=\"token punctuation\">(</span><span class=\"token string url\">'서브셋 폰트.ttf'</span><span class=\"token punctuation\">)</span></span> <span class=\"token function\">format</span><span class=\"token punctuation\">(</span><span class=\"token string\">'truetype'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-display</span><span class=\"token punctuation\">:</span> block<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>그리고나서 해당 페이지를 브라우저 Network 패널에서 확인해보면 폰트가 Data-URI 형태로 로드되는 것을 볼 수 있습니다. 그리고 소요시간을 보면 매우 짧은것을 확인해 볼 수 있습니다.</p>\n<p>기본적으로 브라우저에서 Data-URI를 네트워크 트래픽으로 인식해서 기록하지만 실제로는 이미 다른 파일 내부에 임베드되어 있어 별도의 다운로드 시간이 필요하지 않습니다. 그래서 시간이 매우 짧은 것입니다. 해당 Data-URI 항목을 클릭하여 Timing 탭을 살펴보면 다운로드 시간이 고려하지 않아도 될 만큼 작음을 알 수 있습니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 868px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 54%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB0klEQVQoz42T2XabMBCG9RwxWIjFIBazuoDAsU2MkzR1e9w4afv+D/J3hOtcJT25+M5oRqPRLBJLswLLtIDqNqjbHmGcQvUbVF9aNO0az+ff+HE6o+u3KFcN+tsBhslhGAZM08ScC0R0JpAxZJiAeQsJzcIPJ6MfRLjaNDJakuNy2ne9YJKWcKdAWgrbg+P6b7C1Uvjz+opf52ecvh/x8vOEUEaUhQC3HJhzMTHn9qRfpDsF0/qVq84kZaVUj7puURQVynI13Xp10uv/ccnWfoO5lKauPaTSoiSb+inIydIBCcPgmM3mH6J906xEUdZIljmYSYaGhrAbHyGoRxZdoG2GLsXxMYwPeHg64vD1G+7/cVkfMT4+waY+R2mJ2+GAolZgK8fBGEnskwhrz0Xn2lCOQGNxKNvCXRRipL332Mfh5LuVPg5pgl0YgA2+h5KeyIqeRNN01EuFJaUuKEMN1wMh+Dtou019TNMcFZ3b5AVYyw2oLMOurrEl7mhAY79G7HqQlkAo7A+RDvm4C3gzA2kQ4lCVYEkQYyha7KoefZyholIrIQjrUxR8jn2e42W3xVBVYPYiRpCvIcsNnKjETE/Wcj8HDe+GO/DppxR1h5im/Rc/QUtmNSt7tgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"font06\"\n        title=\"font06\"\n        src=\"/static/dc4d2b137c14103c13c4a03ffb0f0880/748b0/font06.png\"\n        srcset=\"/static/dc4d2b137c14103c13c4a03ffb0f0880/5a46d/font06.png 300w,\n/static/dc4d2b137c14103c13c4a03ffb0f0880/0a47e/font06.png 600w,\n/static/dc4d2b137c14103c13c4a03ffb0f0880/748b0/font06.png 868w\"\n        sizes=\"(max-width: 868px) 100vw, 868px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span></p>\n<p>여기서 주의할점은 Data-URI 형태가 항상 좋은 것은 아니라는 점입니다. 해당 폰트 내용은 css 파일에 포함된 것이므로 css의 다운로드 속도 또한 고려해야 합니다. Data-URI가 포함된 만큼 css 파일의 다운로드는 느려질 것입니다. 이번 글에서는 해당 폰트 파일을 서브셋을 통해 파일 크기를 매우 작게 만들었기 때문에 Data-URI 형태로 포함해도 큰 문제가 없지만, 매우 큰 파일을 Data-URI 형태로 포함한다면 포함한 파일 크기가 그만큼 커져 또 다른 병목을 발생시킬 수 있습니다.</p>\n<br/>","frontmatter":{"title":"폰트 최적화","date":"August 11, 2023"}}},"pageContext":{"slug":"/frontendPerformance/font/","previous":{"fields":{"slug":"/frontendPerformance/imagsSize/"},"frontmatter":{"title":"이미지 사이즈 최적화"}},"next":{"fields":{"slug":"/yagmyagm/asynawait/"},"frontmatter":{"title":"알고 쓰자 - async, await"}}}}}