{
    "componentChunkName": "component---src-pages-markdown-remark-frontmatter-slug-tsx",
    "path": "/posts/react-profiler/",
    "result": {"data":{"markdownRemark":{"html":"<p><code class=\"language-text\">Profiler</code>는 React App이 렌더링하는 빈도와 렌더링 비용을 측정합니다.</p>\n<p>주의할 점은 <code class=\"language-text\">Profiler</code> 가 오버헤드를 만들기 때문에 <strong>프로덕션 빌드에서는 비활성화되어 있다는 점 입니다.</strong> 실제로 제가 구현한 App을 production과 development 환경으로 실행시켜 Profiler를 실행시켜 보았습니다.</p>\n<ul>\n<li>\n<p>production</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; margin: 2rem 0\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 59.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAABYlAAAWJQFJUiTwAAACHklEQVQoz51QyW7TUBT1H7BBzSIdojajncl2Yjtx7JCpIYUCEgtQWiYBv4HEgg9ALEqbiTAJFcGfoKQL0gxKokioA0kWVA1SVwe9lyZyVegCS0f3+L177rnvMN1uF+12G71eD81mE51OB7v1OlqtFhqNBuqEN1r49qOCg9EhTn6fgHyVShWSrCIWX8a16zeRWVmlnKlWKtit1VCrfcfOThXD4QCHB/sY9PvY39tDv/8Tw8EAw18DHI2OMDo+pgMb9Tp8vAS/koQa0SErKsSADGb781e8fLWBjc0CNnNFFN5+ROnTFxTevEfpwzbyxTJyhTLy+TK2ciW83iqgWHqHZ89fwOkOwOEOwEUqK0CQNDC3bmdx6fIcZi0umOcdMC24MGPzw2S2wjRnH1cjZq2YMS/BbHHSgUawXgnM2v0nWLR74eEVsD4JHIE3CM4njzmt50HEDk6kcBK4x5y5k32IhSUOrCd4zvF/wGTvPcb8IgfWe3Ygdf6H6KI7Zv3B09OB0l+FNhcPOytQjPnFRtMNycFEaOdEWsmZX1ThE8LwCmH4AyrNb9pnwGRrmqHF6qbNbr9yBnxQQzJ9A/HUKqKJFcpDkSS98/AheAyVREY3vLv2CBabB9qVNMJaigoUNQElkoAoRyFKOgJKFHwwAiGo0X85HEdYT9G+kDbuJy8gm55myE4zmORGnPVYBlrsKsL6MtRomnI9nqFGxmyNT/4DuHDMRUyzg1AAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"production\"\n        title=\"production\"\n        src=\"/static/d35a5a8d5463b684ae8421cd6959367d/5a190/production.png\"\n        srcset=\"/static/d35a5a8d5463b684ae8421cd6959367d/772e8/production.png 200w,\n/static/d35a5a8d5463b684ae8421cd6959367d/e17e5/production.png 400w,\n/static/d35a5a8d5463b684ae8421cd6959367d/5a190/production.png 800w,\n/static/d35a5a8d5463b684ae8421cd6959367d/c1b63/production.png 1200w,\n/static/d35a5a8d5463b684ae8421cd6959367d/0d98f/production.png 1276w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n</li>\n<li>\n<p>development</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 800px; margin: 2rem 0\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 64.99999999999999%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAADHklEQVQ4y2WR3U+bdRTHn7/AGy+MG8xtAqWUdkUoI5so4sQLvfAl0WGo422BwKTtmC6ZZGGIc07FeWGMccs0GnWbY2zVjKnXzLS2hbZZayJD6tNX2gdklFr68jHPrzol/pJvzjnf5HzP+Z6fND8/j9/vZ25ujoWFBbxeL7duBQS8Xh9utwefz08gEGB2dlZElbv9a4D0H4uUXpFisSgySVEUYrEY8XicVCpJPB4mFpNJpeICsViY5eUlFCVJIpEQSCaTKEqKVGqJlZUV8vl8SbZYRHI6nbhcLvx+Hz5fkJs3ZWZmQjidYWZmIjgcYTyeJA7HbRyOn3C73fzT87PLRSQSIZfL/Su4trZGCXdYX98gmQRFKSGRgFQKwS0v50in75BOp8VWq6urZDIZIVQoFMSWqrCkTgiHw8K2LP+OLP921/bSUpR4PEIkEiIalZFlWZxGta32LC4uEo1GBa/W2WwWSbX6SzBIKBQiGAzicXtQ71rIF8j+mRXT1U0ymXWBXG6DjY0s+XxO1IVCXkS1Fp9yffoHxsZP8dXFK1yatHPx8jUufHOVLy9M8vWlKabs01z99gbXvvte5Ffs00zZbwiovMrZr//IufNfcP7Tz5GGrK9yz71lmPa00tTcRuPefTz59At0dA2y39xHR7cFc4+Vjh4r3QNH6eo/wsu9VszdFjoP2ujoeoWeviO0tj3L1gc0SKffPcOWbRp0uxrR6Oqp1NZRa2ziuRc7OdA7iOXwEFbbEIcG+zlss3B85ABjoy8x8UEfb78/wIm3evnwExsHB9rZUWFEOj76JveXV6HbtZvq2gYBVbi6tpG9j7bw2vDzvP5GJ6MT/bx31kZrWwsPP97CsXEzn51t59zH7dgnuxkefobynUakU6cnuK+s4q5gSawUq2oeYvuDBvQtT9D8zjiPfXQG3SP7KN9uYE9jHSOdBo6a9ZzsM7D/qXp2aBqQjo2cYMu2KmF584alXKs3oamuQz94CIPFinZ3M9qaOqp0JsoqTZRXmtha0cDOahPa2gak0bGT/7O8SfTvqDU2oTVudlGjr/8PSn1/AZOR18oGIHh3AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"development\"\n        title=\"development\"\n        src=\"/static/5f0dfc76877bfa16f9f2913c7d6c856c/5a190/development.png\"\n        srcset=\"/static/5f0dfc76877bfa16f9f2913c7d6c856c/772e8/development.png 200w,\n/static/5f0dfc76877bfa16f9f2913c7d6c856c/e17e5/development.png 400w,\n/static/5f0dfc76877bfa16f9f2913c7d6c856c/5a190/development.png 800w,\n/static/5f0dfc76877bfa16f9f2913c7d6c856c/966a0/development.png 944w\"\n        sizes=\"(max-width: 800px) 100vw, 800px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n</li>\n</ul>\n<p>주로 사용하는 번들러인 <code class=\"language-text\">Webpack</code>을 사용한다면 <strong>4 버전 이상일 경우 production mode에서 profiler를 지원하지 않는 등의 방법으로 코드를 최소화</strong> 시켜주지만 그 이하의 버전일 경우 <strong>TenserPlugin</strong>을 사용해주어야 합니다.</p>\n<br>\n<h2>사용법</h2>\n<p><code class=\"language-text\">Profiler</code>는 React 트리 내에 어디에나 추가될 수 있습니다. Profiler를 추가하면 특정 부분의 렌더링 비용을 계산해줍니다. 이때 필요한 <strong>props</strong>는 두 가지 입니다.</p>\n<p><strong>id</strong>와 <strong>onRender</strong> 콜백 함수이며 Profiler 컴포넌트 하위의 컴포넌트에 업데이트가 커밋되면 호출됩니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"language-jsx\"><code class=\"language-jsx\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Profiler <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">render</span><span class=\"token punctuation\">(</span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Profiler</span></span> <span class=\"token attr-name\">id</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>Navigation<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">onRender</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>callback<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Navigation</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">Profiler</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n  </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span><span class=\"token class-name\">App</span></span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>위처럼 사용할 수 있으며 복수의 <code class=\"language-text\">Profiler</code> 컴포넌트를 사용하여 다른 부분들을 계산할 수 있습니다.</p>\n<p><code class=\"language-text\">Profiler</code> 컴포넌트는 가벼운 컴포넌트 이지만, 조금의 CPU와 메모리를 잡아먹기 때문에, 필요할 때만 사용해야 합니다.</p>\n<br>\n<hr>\n<br>\n<h2>onRender</h2>\n<p>위에도 언급한 바와 같이 <strong>onRender</strong>로 콜백 함수를 전달해야 합니다. 콜백 함수는 다음과 같습니다.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">function</span> <span class=\"token function\">onRenderCallback</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">id<span class=\"token punctuation\">,</span> phase<span class=\"token punctuation\">,</span> actualDuration<span class=\"token punctuation\">,</span> baseDuration<span class=\"token punctuation\">,</span> startTime<span class=\"token punctuation\">,</span> commitTime<span class=\"token punctuation\">,</span> interactions</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 기능..</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>각 인자들은 다음과 같습니다.\n<ul>\n<li><strong>id</strong> : 방금 커밋된 <code class=\"language-text\">Profiler</code> 컴포넌트의 <strong>id</strong> prop, 위에도 언급한 바와 같이 복수의 <code class=\"language-text\">Profiler</code> 컴포넌트를 사용할 수 있는데, 이 때 복수의 컴포넌트를 사용할 시 어떤 컴포넌트가 해당 콜백을 실행시켰는지에 대해 알 수 있습니다.</li>\n<li><strong>phase</strong> : 해당 컴포넌트가 마운트된건지, 아니면 어떤 이벤트 혹은 상태 변화로 인하여 리렌더링 된건지를 식별합니다. (<strong>mount</strong>, <strong>update</strong>)</li>\n<li><strong>actualDuration</strong> : 현재 업데이트에 해당하는 자손 컴포넌트들을 렌더하는데 걸린 시간, 이는 하위 트리가 얼마나 <strong>메모이제이션</strong>을 잘 활용하고 있는지를 암시합니다. 이상적으로 다수의 컴포넌트들은 특정 prop이 변할 경우에만 리렌더링이 필요하기 때문에 이 값은 초기 렌더링 이후 상당 부분 감소해야 합니다.</li>\n<li><strong>baseDuration</strong> : <code class=\"language-text\">Profiler</code> 트리 내 개별 컴포넌트들의 렌더링 비용의 최악 케이스를 계산해줍니다.</li>\n<li><strong>startTime</strong> : react가 현재 업데이트에 대해 렌더링을 시작한 시간</li>\n<li><strong>commitTime</strong> : react가 현재 업데이트를 커밋한 시간</li>\n<li><strong>interactions</strong> : 업데이트가 계획되었을 때 추적하고 있던 상호작용의 집합</li>\n</ul>\n</li>\n</ul>\n<br>\n<hr>\n<br>\n<h2>일단 부딪쳐보며 사용해보기</h2>\n<p>제가 구현한 App에 대해서 한 번 사용해보도록 하겠습니다. App의 코드를 전부 공유해드릴 수 없는 점 양해 부탁드립니다..ㅠㅠ 😅</p>\n<br>\n<ul>\n<li>\n<p><strong>onRender</strong> 콜백 함수 작성</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> <span class=\"token literal-property property\">renderCallback</span><span class=\"token operator\">:</span> <span class=\"token function-variable function\">ProfilerOnRenderCallback</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">id<span class=\"token punctuation\">,</span> phase<span class=\"token punctuation\">,</span> ad<span class=\"token punctuation\">,</span> bd<span class=\"token punctuation\">,</span> st<span class=\"token punctuation\">,</span> ct<span class=\"token punctuation\">,</span> interations</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n  console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">'s actual duration is </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>ad<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<ul>\n<li>단순하게 현재 업데이트 된 컴포넌트가 얼마나 최적화가 잘 되어있는지 확인하기 위해서 다음과 같은 함수를 작성하였습니다.</li>\n</ul>\n</li>\n</ul>\n<br>\n<p>단순하게 props에 따라 결과가 달라지는 컴포넌트에 <strong>memo</strong>를 사용하지 않아보고, 사용해 보면서 그 결과를 한번 비교해보겠습니다.</p>\n<ul>\n<li>\n<p><strong>memo</strong>를 사용하지 않은 컴포넌트에서의 결과</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 566px; margin: 2rem 0\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 106.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAADZElEQVQ4y01U6ZqaQBDc14i7Kije4g1yKPclqLhmk3x5/wepfNWomx/NzADd09VV3W+K0sd8sYbrRbBdH4vlFvpyg719hLF3YDlH7EwbpuXKu719gO14sl9vTfmH3yzHg9rT8NbuqNiZDvKyRlHdJOjRj1Fe7jjXP+GFKarrHXl5xel8Q5gUCOIci9UWk6mO2XyF2XyJ6XyJrtLHGx9zfSU30ImB0+IigfaOh4MfS/a8+KPdxftHF633Dlrvbbx/dPCj1Uar1ZZVUTW8ETKjM21CY/C95SBOcvhB/FqDMEEYpYjiVN5x77ge/DCWfZIWUHuDBvJ6u0eclYjTElvDxsELUd9/of78hTSvcKl/4nr7wu3+G6eqRlFekBUVtjsLhmlLIlwFMgs5nS3k5dawMNNXciZRJEjqpDd14juimcwWctYGY/QHYwyGEwzHsybDziPDND9Lwbk3TAdZcUaSVwiiDGlxfpHCjPmN5DEByz6KEsiB1LDT7Qn9SVbh+vn7QcwV2ekiTPthJqQw2/XGfCBoGGW5xNoKPtrKgxRVw3gyx2ZnPXTW6I/Om91e9uOpLgEIqdcfoq8NMRxNMRhNZB2NZxKjgdxVsdoY8KMM7jEUXVFjYZyLHt1jAD9MBTazjtMTkqyUf0mg5XoC1zn435CX6538XN//iGOUllJPQnePEaL0BGPvwrSPWG1M+Z/Z0JeZcyV0YVlR+5KucwgkCJ29IBHWCZ/6JFF0ehodmc3TGLyvjRrIXaXJkMUnc3N9LZIgJNttoHDlJX6UykrmqdWdYYtP818AVX30Mgkh1Ora9C4zJcM8s7Ysx/M9HVmz0XguGtQGk0aP2ugJWROxkoCiqkVr7BqeeTuzIUns3UYmihjJlBJ01Ma6vSfkZnzRmTUjy/piLWJl/UzrICu/Ez6NzIuwKTXrIH48v8YXi57kZzEGICSRSXGRWrJjSBbXY5Dg4EUi8OFohsl0ITodT/Rvlqn8IMplHhIy5yBbkaNMgvixwKHRicbOeI609mP/gszbnh2iLzYywtiOnNyEtVobooSn8Rs7iaWS88YQkSv/s0wmOVgpYAZnpuXlU7pEBkN1E+aZMUnjlOeFDM6gJE4gkx19uZUa3b7+4lx/iRODxI8W48jneBqMpi+JPLvjf2OG/wDRU6g2MGAW4AAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"notmemo\"\n        title=\"notmemo\"\n        src=\"/static/ffc2327b746ffbcbe97b8ef67e08943d/6fe44/notmemo.png\"\n        srcset=\"/static/ffc2327b746ffbcbe97b8ef67e08943d/772e8/notmemo.png 200w,\n/static/ffc2327b746ffbcbe97b8ef67e08943d/e17e5/notmemo.png 400w,\n/static/ffc2327b746ffbcbe97b8ef67e08943d/6fe44/notmemo.png 566w\"\n        sizes=\"(max-width: 566px) 100vw, 566px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n</li>\n<li>\n<p><strong>memo</strong>를 사용하여 최적화한 컴포넌트에서의 결과</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 582px; margin: 2rem 0\"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 84.5%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAABYlAAAWJQFJUiTwAAACwUlEQVQ4y01UWXaiQBRlHdEgIEYlyDwoMwiKMTE53dlB738Nt899RLs/nlQV5as7FYqum9haO6SHAnGawd55UmG8h+uF8MMEnh/LPAgTBFEqxXXXj+AHMaL4AC+IoelLKPNnDXGa4/x2wzB+IEozZEWD6+0XxusX2n7E9fYbbx+/pOp2QNePcLwQOzeQp+vHsGwX6sKAstCW2DkB8rKVP5wuH2iOZzTdGf35iro7wXYCcJ+xfMFiYch4Nl886mmmgsB0YwVF001srJ3AJmXHDYUqKZKOUPcjeH4k66Tv/TfnuzCiPBE0bQnlWdXhh6mgITIvSBDGBwzjO9rjGUXVyfjy/iWyVE3/2MfDeYAfJLB3/kSZP2xQ1v2D8r05NWWzsulhrjZYb2yhReqzmfqg+/QzJluhTEGjJBNz6JZQjfYyJmUKb706kgY+LduR52Zr49V2J4Mcf2pIykG0FyTdcJHx3XVB2p0E9Z0y55SC1Kt2kP08lMYKZXa1Hf+BkBnkiTSJ5biBvCPiKJnmjIsgcwOYqzVe1hZWL9vJZXZ1vEjylVedbGZoiSIvG+RVK++EQT8KKqJM9oUcwgtxyGtBqao6lPnsGWGY4HS54f3zW4JctydpMF4/JY80iLeDSK1XVxgRyL0oG2uhmVDWXoqwPiNNc4lIVjZID6XQJwoWs8YwUx6WbpgwlpPbLCZAKNMUb/zG4fsPiqKSK8dG1KqoO2RFLcWD+tMbjsNF6BLxtDfDPitlD6Mnpsznqthf1Ee5u6TeHkfJJCWg01zPyhb7rBLEDPXWcn7QrqTIgKVohilwmXreZxpARBSaCPgkioU2aaXKXTbky0Lq96ak/s9lN0TVDNKQgjPQZX0URIe8knU6XHcDyuYodT+QLpM+ZVIX+vS1of3UhmGd3DxIbKgVm3Y/2nGNTUib0brnj7U014LwL2eCI0nzc8JwAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"memo\"\n        title=\"memo\"\n        src=\"/static/7b49801b0de975ca946325623b0d373d/7c1cd/memo.png\"\n        srcset=\"/static/7b49801b0de975ca946325623b0d373d/772e8/memo.png 200w,\n/static/7b49801b0de975ca946325623b0d373d/e17e5/memo.png 400w,\n/static/7b49801b0de975ca946325623b0d373d/7c1cd/memo.png 582w\"\n        sizes=\"(max-width: 582px) 100vw, 582px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n        decoding=\"async\"\n      />\n    </span></p>\n</li>\n</ul>\n<br>\n<p>이처럼 <code class=\"language-text\">Profiler</code>를 이용하여 본인이 작성한 컴포넌트의 최적화가 잘 되어가는지를 확인할 수 있습니다!</p>\n<br>\n<p>이전에는 매번 '이렇게 하면 최적화가 되겠지..?' 라고 생각만 했었는데, 이제는 React App을 만들 때 <code class=\"language-text\">Profiler</code>를 사용하여 최적화에 대해 직접적으로 확인할 수 있을 것 같네요..</p>\n<p>긴 글 읽어주셔서 감사합니다 !! 🥺</p>","frontmatter":{"date":"November 08, 2021","slug":"/posts/react-profiler","title":"[React] Profiler API","description":"🧐 2021.11.08 거북목 스터디, React의 Profiler를 이용하여 성능 최적화를 확인해보자."}}},"pageContext":{"id":"f820965e-4e4d-5a35-aab3-410baf6b9965","frontmatter__slug":"/posts/react-profiler","__params":{"frontmatter__slug":"posts"}}},
    "staticQueryHashes": []}