<Profiler>๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ React ํŠธ๋ฆฌ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<Profiler id="App" onRender={onRender}>
<App />
</Profiler>

๋ ˆํผ๋Ÿฐ์Šค

<Profiler>

๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ <Profiler>๋กœ ๊ฐ์‹ธ์ค๋‹ˆ๋‹ค.

<Profiler id="App" onRender={onRender}>
<App />
</Profiler>

Props

  • id: ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
  • onRender: ํ”„๋กœํŒŒ์ผ๋ง ๋œ ํŠธ๋ฆฌ ๋‚ด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค React๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” onRender ์ฝœ๋ฐฑ์ž…๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ๋œ ๋‚ด์šฉ๊ณผ ์†Œ์š”๋œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ


onRender ์ฝœ๋ฐฑ

React๋Š” onRender ์ฝœ๋ฐฑ์„ ๋ Œ๋”๋ง ๋œ ๋‚ด์šฉ๊ณผ ๊ฐ™์ด ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

function onRender(id, phase, actualDuration, baseDuration, startTime, commitTime) {
// ๋ Œ๋”๋ง ์‹œ๊ฐ„ ์ง‘๊ณ„ ํ˜น์€ ๋กœ๊ทธ...
}

๋งค๊ฐœ๋ณ€์ˆ˜

  • id: ์ปค๋ฐ‹๋œ <Profiler> ํŠธ๋ฆฌ์˜ ๋ฌธ์ž์—ด id ํ”„๋กœํผํ‹ฐ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‹ค์ค‘์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŠธ๋ฆฌ ๋‚ด์—์„œ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ปค๋ฐ‹ ๋˜์—ˆ๋Š”์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
  • phase: "mount", "update" ํ˜น์€ "nested-update". ํŠธ๋ฆฌ๊ฐ€ ์ตœ์ดˆ๋กœ ๋งˆ์šดํŠธ๋˜์—ˆ๋Š”์ง€ ๋˜๋Š” props, state ๋˜๋Š” hook์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฆฌ๋ Œ๋”๋ง ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • actualDuration: ํ˜„์žฌ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด <Profiler>์™€ ์ž์‹๋“ค์„ ๋ Œ๋”๋งํ•˜๋Š”๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜์œ„ ํŠธ๋ฆฌ๊ฐ€ memoization์„ ์–ผ๋งˆ๋‚˜ ์ž˜ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค (e.g. memo ์™€ useMemo). ๋งŽ์€ ์ž์‹์ด ํŠน์ • props๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์‹œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ด์ƒ์ ์œผ๋กœ๋Š” ์ด ๊ฐ’์€ ์ตœ์ดˆ ๋งˆ์šดํŠธ ์ดํ›„์—๋Š” ๋งŽ์ด ๊ฐ์†Œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • baseDuration: ์ตœ์ ํ™” ์—†์ด ์ „์ฒด <Profiler> ํ•˜์œ„ํŠธ๋ฆฌ์— ๋Œ€ํ•ด ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ถ”์ •ํ•˜๋Š” ์†Œ์š”๋œ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ์— ์žˆ๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ํ•ฉ์‚ฐํ•˜์—ฌ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ตœ์•…์˜ ๋ Œ๋”๋ง ๋น„์šฉ(์˜ˆ: ์ตœ์ดˆ ๋งˆ์šดํŠธ ๋˜๋Š” memoization์ด ์—†๋Š” ํŠธ๋ฆฌ)์„ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค. actualDuration ๊ณผ ๋น„๊ตํ•˜์—ฌ memoization์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • startTime: React๊ฐ€ ํ˜„์žฌ ์—…๋ฐ์ดํŠธ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•œ ์‹œ์ ์— ๋Œ€ํ•œ ์ˆซ์ž ํƒ€์ž„์Šคํƒฌํ”„์ž…๋‹ˆ๋‹ค.
  • commitTime: React๊ฐ€ ํ˜„์žฌ ์—…๋ฐ์ดํŠธ๋ฅผ ์ปค๋ฐ‹ํ•œ ์‹œ์ ์— ๋Œ€ํ•œ ์ˆซ์ž ํƒ€์ž„์Šคํƒฌํ”„์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ปค๋ฐ‹๋œ ๋ชจ๋“  ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๊ฐ„์— ๊ณต์œ ๋˜๋ฏ€๋กœ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ๋ฒ•

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ธก์ •

React ํŠธ๋ฆฌ๋ฅผ <Profiler> ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์„œ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.

<App>
<Profiler id="Sidebar" onRender={onRender}>
<Sidebar />
</Profiler>
<PageContent />
</App>

ํŠธ๋ฆฌ ๋‚ด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋ฅผ ์ปค๋ฐ‹ํ•  ๋•Œ๋งˆ๋‹ค React๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” onRender ์ฝœ๋ฐฑ(ํ•จ์ˆ˜)์™€ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด id (๋ฌธ์ž์—ด) ๋‘ ๊ฐœ์˜ props๊ฐ€ ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์˜ํ•˜์„ธ์š”!

ํ”„๋กœํŒŒ์ผ๋ง์€ ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๊ฐ€ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ”„๋กœํŒŒ์ผ๋ง์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋œ ํŠน์ˆ˜ํ•œ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!

<Profiler>๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ธก์ •๊ฐ’๋“ค์„ ๋ชจ์•„์ค๋‹ˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด, React Developer Tools์˜ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ํƒญ์„ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”. ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์จ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ถ€๋ถ„๋ณ„ ์ธก์ •

<Profiler> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ถ€๋ถ„๋ณ„๋กœ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<App>
<Profiler id="Sidebar" onRender={onRender}>
<Sidebar />
</Profiler>
<Profiler id="Content" onRender={onRender}>
<Content />
</Profiler>
</App>

<Profiler> ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<App>
<Profiler id="Sidebar" onRender={onRender}>
<Sidebar />
</Profiler>
<Profiler id="Content" onRender={onRender}>
<Content>
<Profiler id="Editor" onRender={onRender}>
<Editor />
</Profiler>
<Preview />
</Content>
</Profiler>
</App>

<Profiler>๋Š” ๊ฐ€๋ฒผ์šด ์ปดํฌ๋„ŒํŠธ์ด์ง€๋งŒ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์•ฝ๊ฐ„์˜ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.