{"componentChunkName":"component---src-templates-blog-post-js","path":"/frontendPerformance/imgPreLoading/","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":"366d6a8c-565e-5f45-8a85-c5e57edb033d","excerpt":"저는 해당 도서에서 제공해주는 샘플코드를 이용하고 있으므로 샘플코드가 없으신분들은 최적화하는 과정에 대해서만 알고계서도 좋을것같습니다. 느린 이미지 로딩 이미지의 사이즈가 클때 다운로드 시간이 오래 걸려서 다운로드가 완료될 때까지 아무것도 뜨지 않는 현상이 발생합니다. 여기서 이미지가 화면에 제때 뜰 수 있도록 미리 다운로드하는 기법인 이미지 사전 로딩 기법을 적용해 보겠습니다.  이미지 사전 로딩 이미지는 이미지가 화면에 그려지는 시점, 즉 HTML 또는 CSS…","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=\"#%EB%8A%90%EB%A6%B0-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%A1%9C%EB%94%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>느린 이미지 로딩</h3>\n<p>이미지의 사이즈가 클때 다운로드 시간이 오래 걸려서 다운로드가 완료될 때까지 아무것도 뜨지 않는 현상이 발생합니다. 여기서 이미지가 화면에 제때 뜰 수 있도록 미리 다운로드하는 기법인 이미지 사전 로딩 기법을 적용해 보겠습니다.</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto;  max-width: 816px;\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 51%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsSAAALEgHS3X78AAAB7UlEQVQoz62Ry2sTURjF838IYsSdr7/BgguLxReICg3ajZpHlapN5j2JNI+ZiZuqaVrTPBpbwRSNqW0UamzBigvBlQVXIrhRKD6gWB/9eWcSSjddCH5wOJxzz5z5LteXsSwsx9mELFa2A9tpo6Ntpw03k3FsL7+hRc7t8tmpFGZ0EGVgAEO6RuRIHye3dXNqZw+9e44T2HuC0/4ezviPcujYPg6c3c7BwC4O9+2n+9xuunr9dAV2ICtBsnYWX16XeF2v8XaxxfLiPG/qsyyN1XhZmOZV6QFL4zVaN6u8GL3PwqMS8808rbkxFprjPG8WeDabZ65xm3tphRuJuChM6Hz5/Im1P7/Zar6trbLO1vP9xzpPpibJ6Cq+kbjG8rv3fFhZ5ePXn/zr/BKLuKs8naq2C3OGzOTwMMVbOSq5ER5XK8xUy4LLPCze8TAzUfa8zZgujFIvFWhUijTuTlAdMsleF1d2UkkSVy4jhy6gRoKol8Io/SHU/jAx4UnhixvahRIJeToaPI8cDna8IJbYznZf2X1qI5HgajSGpKhoZhzVMASbRGUZSRWeYQrP7LDh8aAkIWta29MNhtJpLLfQymQw3Y+jUVRFQdd1NBHUdQ0pFkMWpbqrO9A67J55edcTP00lk+3CjCj8X3AL/wJm2C+BbIeEhgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"imagePre\"\n        title=\"imagePre\"\n        src=\"/static/85b5a93787597c85f5773c4febf0e4a2/b4098/imagePre.png\"\n        srcset=\"/static/85b5a93787597c85f5773c4febf0e4a2/5a46d/imagePre.png 300w,\n/static/85b5a93787597c85f5773c4febf0e4a2/0a47e/imagePre.png 600w,\n/static/85b5a93787597c85f5773c4febf0e4a2/b4098/imagePre.png 816w\"\n        sizes=\"(max-width: 816px) 100vw, 816px\"\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<br/>\n<h3 id=\"이미지-사전-로딩\" style=\"position:relative;\"><a href=\"#%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%82%AC%EC%A0%84-%EB%A1%9C%EB%94%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>이미지 사전 로딩</h3>\n<p>이미지는 이미지가 화면에 그려지는 시점, 즉 HTML 또는 CSS에서 이미지를 사용하는 시점에 로드됩니다. 하지만 이런 경우 외에 자바스크립트로 이미지를 직접 로드하는 방법이 한가지 있습니다. 자바스크립트의 <code class=\"language-text\">Image</code> 객체를 사용하는 방법입니다.</p>\n<p><code class=\"language-text\">Image</code> 객체는 아래와 같이 사용할 수 있습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> img <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Image</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nimg<span class=\"token punctuation\">.</span>src <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">{이미지 주소}</span><span class=\"token template-punctuation string\">`</span></span></code></pre></div>\n<p>해당 방법을 이용하여 샘플 코드에 적용해 보겠습니다.</p>\n<p>해당 코드는 첫 페이지 마운트된 후인 타이밍에 이미지를 사전 로드하는 코드입니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><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        LazyImageModal<span class=\"token punctuation\">.</span><span class=\"token function\">preload</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">const</span> img <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Image</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        img<span class=\"token punctuation\">.</span>src <span class=\"token operator\">=</span> <span class=\"token string\">'https://stillmed.olympic.org/media/Photos/2016/08/20/part-1/20-08-2016-Football-Men-01.jpg?interpolation=lanczos-none&amp;resize=*:800'</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></code></pre></div>\n<p>위와 같은 코드가 이미지 사전 로딩이 가능한 이유는 이미지를 로드할 때 브라우저가 해당 이미지를 캐싱해 두기 때문입니다.</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: 10%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsSAAALEgHS3X78AAAAlklEQVQI1zWLywqCUABE/RJ7EOG1m+nNKM1dLUxCKijosWlRYViRRLsW0SKijz6J0OIwcxhGC3wfS0qkKXCsJq5SeD0vd5PGHyEQ9Rot2cB17KJLYaByHKNe/Pq+R9tuoXVXNwa7J8H2gTk501neGZ/exJcP0+u3yOHhhR4mVKMjlVGCHqWoaM9snbHYZITzlFJ8oZxvP/NOR0bqGqgsAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"imgPre2\"\n        title=\"imgPre2\"\n        src=\"/static/01104b5a7eb5df09f7845e30986b0654/748b0/imgPre2.png\"\n        srcset=\"/static/01104b5a7eb5df09f7845e30986b0654/5a46d/imgPre2.png 300w,\n/static/01104b5a7eb5df09f7845e30986b0654/0a47e/imgPre2.png 600w,\n/static/01104b5a7eb5df09f7845e30986b0654/748b0/imgPre2.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>위에 사진을 보면 네크워크 패널에서 확인한 결과입니다. 조금 더 살펴보면 사전 로드한 이미지의 Size 항목이 disk cache라고 적혀 있습니다. 그리고 다운로드 시간이 매우 짧은 것을 볼 수 있습니다. 그 이유는 페이지가 로드된 후 바로 이미지를 사전 로드해 뒀기 때문입니다. </p>\n<p>그런데 여기서 한가지 고민해볼것은 몇 장의 이미지까지 사전 로드해 둘 것인가입니다. 사전 로딩을 하는 순간 브라우저의 리소스를 그만큼 많이 사용하기 떄문에 다른 성능 문제를 야기할수도 있습니다. 따라서 어떤 콘텐츠를 사전 로드할 때는 정말 사전 로딩이 필요한지 고민해야 합니다. </p>\n<br/>","frontmatter":{"title":"이미지 사전 로딩","date":"July 27, 2023"}}},"pageContext":{"slug":"/frontendPerformance/imgPreLoading/","previous":{"fields":{"slug":"/frontendPerformance/componentPreLoading/"},"frontmatter":{"title":"컴포넌트 사전 로딩"}},"next":{"fields":{"slug":"/algorithm/leetcode/438/"},"frontmatter":{"title":"leetcode - Find All Anagrams in a String"}}}}}