ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] ๋ฆฌ์•กํŠธ๋Š” Reflow, Repaint ์ด์Šˆ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ์„๊นŒ? (feat. ๊ฐ€์ƒ๋”)
    ๐ŸŽ Browser 2023. 2. 20. 19:12

     

    ๐ŸŽ ์„œ๋ก 


    ์ •์ ์ธ ์›น์‚ฌ์ดํŠธ, ๋”์˜ ๋ณ€๊ฒฝ์ด ์ ์€ ์›น์‚ฌ์ดํŠธ๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ, SPA์ฒ˜๋Ÿผ ๋” ๋ณ€๊ฒฝ์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ์›น์‚ฌ์ดํŠธ์˜ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๊ฐ ๋…ธ๋“œ์— ๊ด€ํ•ด ๋งŽ์€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์›น์„œ๋ฒ„ ์„ฑ๋Šฅ ์ด์Šˆ์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜์˜€์„๊นŒ์š”?

    (๋ Œ๋”๋ง ๊ณผ์ •๊ณผ ์›น์„œ๋ฒ„ ์„ฑ๋Šฅ ์ด์Šˆ์— ๊ณต๊ฐ์ด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜ ๐ŸŽ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์˜ ํ๋ฆ„?๋ถ€ํ„ฐ ์ฝ์–ด๋ณด์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค)

     

     

     

    ๐ŸŽ DOM์ด ๋ญ”๊ฐ€์š”?


    ์ €ํฌ๊ฐ€ ๋ถ€๋ฅด๋Š” DOM์€ DOM ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. DOM ํŠธ๋ฆฌ๋ž€ ๋ฐ”๋กœ / ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•˜๊ณ  ๋˜ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก / ์‘๋‹ต์œผ๋กœ ๋ฐ›์•„์˜จ HTMLํŒŒ์ผ์˜ ๊ฐ ์›์†Œ๋“ค์„ / ๋…ธ๋“œ๋กœ ํ•˜๋Š” / ํŠธ๋ฆฌ ํ˜•ํƒœ์˜ ํŒŒ์‹ฑ๋ณธ์ด๋ž๋‹ˆ๋‹ค. 

    ์–ด๋– ํ•œ ์›์†Œ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์†์„ฑ์„ ๋ถ€์—ฌํ•˜๋ฉด, ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ทธ ์›์†Œ๋ฅผ ๋‹ด์€ ๋…ธ๋“œ๋ฅผ ๋” ํŠธ๋ฆฌ์—์„œ ์ฐพ๊ณ , ์ˆ˜์ •ํ•  ์›์†Œ ๋ฐ ๊ทธ ์ž์‹์›์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์ƒˆ๋กญ๊ฒŒ ์ˆ˜์ •ํ•  ์›์†Œ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ๋‹ค์‹œ ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŒ… ๊ณผ์ •์ด ์ง„ํ–‰๋˜๊ฒŒ ๋˜์ฃ .

    ๋ฆฌ์•กํŠธ๋Š” "๊ฐ€์ƒ๋” (Virtual DOM)"์ด๋ผ๋Š” ์›๋ฆฌ๋กœ ๋” ๋น ๋ฅธ! ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค. 

     

     

     

     

    ๐ŸŽ ๋ฆฌ์•กํŠธ ๊ฐ€์ƒ๋”๊ณผ ์กฐ์ž‘ ๊ณผ์ •


    ๊ฐ€์ƒ๋”์€ ์‹ค์ œ ๋”์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜ค๋ธŒ์ ํŠธ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” 2๊ฐœ์˜ ๊ฐ€์ƒ๋”์„ ๋งŒ๋“ค์–ด, ํ•˜๋‚˜๋Š” ๋ณ€๊ฒฝ ์ „, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ณ€๊ฒฝ ํ›„ ํ˜•ํƒœ๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

     

    ๋‘ ๋ณต์‚ฌ๋ณธ์„ ๋น„๊ตํ•˜์—ฌ ์ •ํ™•ํžˆ ์–ด๋–ค ์›์†Œ๊ฐ€ ๋ณ€ํ–ˆ๋Š”์ง€ ์ฐพ์•„๋‚ด๋Š” Diffing ๊ณผ์ •์„ ๊ฑฐ์นœ ํ›„ → ๋”ฑ ๋ฐ”๋€ ๋ถ€๋ถ„๋“ค๋งŒ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์— ํ•œ ๋ฒˆ์— ์ ์šฉ(Batch Update)์‹œ์ผœ์ฃผ๋Š” Reconciliation ๊ณผ์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

     

    ์ด๋Š” ๋”์—์„œ ์ œ๊ฑฐ ๋ฐ ๊ต์ฒดํ•˜๋Š” ๊ณผ์ •๋ณด๋‹ค JS ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ณผ์ •์ด ๋” ์‰ฝ๊ณ  ๋น ๋ฅด๊ธฐ์— ๋ฆฌ์•กํŠธ๋Š” ๋น ๋ฅธ ์‚ฌ์šฉ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 

    ๋˜ํ•œ, ๋” ์กฐ์ž‘์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ€์ƒ ๋”์—์„œ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ Reflow, Repaint๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ Œ๋”๋ง ๊ณผ์ •์˜ ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

     

     

     

    ๐ŸŽ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์˜ ํ๋ฆ„?

    ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ดํ•ดํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ , ์ด ๊ณผ์ •์„ ์ตœ์†Œํ™”ํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ์ž๊ฐ€ URL๋ฅผ ์ž…๋ ฅ ํ›„, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฒ€์ƒ‰์–ด์ธ์ง€ URL์ธ์ง€ ํŒ๋‹จํ•œ ํ›„, URL๋ผ๋ฉด ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์œผ๋กœ html, css, javascript, static (img์™€ ๊ฐ™์€) ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๊ฒŒ ๋˜๋Š”๋ฐ, ๋ฐ›์•„์˜จ ํŒŒ์ผ์„ ํ™”๋ฉด์— ๋ Œ๋”๋ง ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด html ํŒŒ์ผ์„ ๋ Œ๋”๋ง ์—”์ง„์—๊ฒŒ ์ „๋‹ฌํ•ด ๋‹ค์Œ ๊ณผ์ •์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

    (๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—”์ง„: ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ๋” ํฐ Event Loop ์ดํ•ด)

     

    1. DOM ํŠธ๋ฆฌ ์ƒ์„ฑ

    ๋ Œ๋”๋ง ์—”์ง„์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ์ „๋‹ฌ๋ฐ›์€ HTMLํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” DOM ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. CSSOM ํŠธ๋ฆฌ ์ƒ์„ฑ

    ๋”ฐ๋กœ ์ ์šฉ๋œ ์Šคํƒ€์ผ๋ง + ์Šคํƒ€์ผ๋ง์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ์›์†Œ์˜ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ €์ƒ ๋””ํดํŠธ ์Šคํƒ€์ผ๋ง์„ ์ ์šฉํ•˜์—ฌ CSSOM์ด๋ผ๋Š” ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

     

     

    3. ์•ž ๋‘ ํŠธ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ Render ํŠธ๋ฆฌ ์ƒ์„ฑ

    DOM ํŠธ๋ฆฌ & CSSOM ํŠธ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ⇒ Render ํŠธ๋ฆฌ ํ˜•ํ•ฉ๋‹ˆ๋‹ค.

    display:none; ์†์„ฑ์ด ์„ค์ •๋œ ๋…ธ๋“œ๋Š” Render ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.   visibility: invisible;์€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ํ•˜์ง€๋งŒ, ๊ณต๊ฐ„์€ ์ฐจ์ง€ํ•˜๋˜ ์š”์†Œ๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ฒŒ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—   Render ํŠธ๋ฆฌ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

     

    4. Attachment

    ๋ชจ๋“  ๋…ธ๋“œ๋Š” attach ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ๊ณผ์ •์—์„œ attach ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ๋ชจ๋“  ์Šคํƒ€์ผ ์ •๋ณด๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ๊ณ„์‚ฐ๋˜๊ณ  ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

     

    5. ๋ ˆ์ด์•„์›ƒ Layout

    ํŠธ๋ฆฌ ๋‚ด ๋…ธ๋“œ๋“ค์˜ ์œ„์น˜/ํฌ๊ธฐ/์ˆœ์„œ ์ •๋ณด(์ตœ์ƒ์œ„ ์›์†Œ ๋งจ ๋ฐ‘์— ๋ฐฐ์น˜ํ•˜๋Š” ๋“ฑ 3์ฐจ์›)๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ ๋…ธ๋“œ์— ์ขŒํ‘œ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ํ™”๋ฉด์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

     

    6. ํŽ˜์ธํŠธ Paint

    ๋ ˆ์ด์•„์›ƒ ๋‹จ๊ณ„์—์„œ ๋ฐฐ์น˜๋œ ์›์†Œ๋“ค์— ์ƒ‰์„ ์ž…ํžˆ๊ณ  ํ™”๋ฉด์— ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.

     

     

    ๐ŸŽ  Reflow & Repaint


    ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ํ›„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋”์„ ์กฐ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด, ๊ฐ ๋…ธ๋“œ์˜ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋ถ€์—ฌํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ ๊ณผ์ • (reflow)๊ณผ ์ƒ‰์ƒ์„ ์ž…ํžˆ๋Š” ํŽ˜์ธํŒ… ๊ณผ์ • (repaint) ์ด ๋‹ค์‹œ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

    reflow๋Š” position, width, height, margin, display, overflow ๋“ฑ ์„ ์„ค์ •ํ•  ๋•Œ (์ฆ‰ ์ƒ์„ฑ๋œ DOM ๋…ธ๋“œ์˜ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋  ๋•Œ) ์˜ํ–ฅ๋ฐ›์€ ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ˆ˜์น˜๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์—ฌ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์žฌ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

    • ์–ธ์ œ ๋ฐœ์ƒํ•˜๋‚˜์š”?
      • ํŽ˜์ด์ง€ ์ดˆ๊ธฐ ๋ Œ๋”๋ง (์ตœ์ดˆ Layout ๊ณผ์ •)
      • ์œˆ๋„์šฐ ๋ฆฌ์‚ฌ์ด์ง• (Viewport ํฌ๊ธฐ ๋ณ€๊ฒฝ์‹œ)
      • DOM ๋…ธ๋“œ์˜ ์ถ”๊ฐ€, ์ œ๊ฑฐ
      • DOM ๋…ธ๋“œ์˜ ์œ„์น˜, ํฌ๊ธฐ ๋ณ€๊ฒฝ (margin, padding, border, width, height ๋“ฑ..)
      • ์ด๋ฏธ์ง€ ํฌ๊ธฐ ๋ณ€๊ฒฝ
      • ํฐํŠธ ๋ณ€๊ฒฝ, ํ…์ŠคํŠธ ๋‚ด์šฉ ๋ณ€๊ฒฝ
      • CSS3 ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํŠธ๋žœ์ง€์…˜
      • offset, scrollTop, scrollLeft๊ณผ ๊ฐ™์€ ๊ณ„์‚ฐ๋œ ์Šคํƒ€์ผ ์ •๋ณด ์š”์ฒญ
    • ์ตœ์ ํ™” ๋ฐฉ๋ฒ•๋ก 
      • ๊ฐ€์žฅ ํ•˜์œ„ ๋…ธ๋“œ์˜ ์Šคํƒ€์ผ๋ง ๋ณ€๊ฒฝ์„ ์šฐ์„  ์‹œ ๋ณ€๊ฒฝํ•˜์—ฌ, ๊ฐ์‹ธ๋Š” ์ƒ์œ„ ๋…ธ๋“œ์— reflow๋ฅผ ์ตœ์†Œํ™”. 
      • ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์žˆ๋Š” ์—˜๋ฆฌ๋จผํŠธ
        • ์œ„์น˜๊ฐ€ ๊ณ„์† ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์— position ์†์„ฑ์„ fixed, absolute๋กœ ์ง€์ •ํ•˜์—ฌ ์ง€์ •๋œ ๋…ธ๋“œ๋ฅผ ์ „์ฒด ๋…ธ๋“œ์—์„œ ๋ถ„๋ฆฌ์‹œ์ผœ ํ•ด๋‹น ๋…ธ๋“œ์—๋งŒ Reflow๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ์ œํ•œ
      • cssText๋กœ ํ•œ๋ฒˆ์— ์Šคํƒ€์ผ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์ตœ์ ํ™” ๋ฐฉ๋ฒ•?   
    // bad
    const body = document.body;
    body.style.width = '50px';
    body.style.height = '100px';
     
    // good
    const body = document.body;
    body.style.cssText = 'width: 50px; heigh: 100px;';
    
    • ์Šคํƒ€์ผ๋ง ํƒœ๊ทธ
      • left, right, width, height < transform
      • visibility/display < opacity์Šคํƒ€์ผ๋ง ํƒœ๊ทธ

     

     

    repaint๋Š” background, background-image, color, outline, text-decoration ๋“ฑ์„ ์„ค์ •ํ•  ๋•Œ, ์žฌ์ƒ์„ฑ๋œ ๋ Œ๋”ํŠธ๋ฆฌ์— ๋‹ค์‹œ ์ƒ‰์„ ์ž…ํžˆ๊ณ  ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. 

     background-color, visibility์™€ ๊ฐ™์ด ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์Šคํƒ€์ผ ์†์„ฑ๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ์—๋Š” Reflow๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•„ Repaint๋งŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค

      

     

    ์ฐธ์กฐ์ž๋ฃŒ:

    ์Šค๋ฌด๋”” ํ•œ ์ž” ๋งˆ์‹œ๋ฉฐ ๋๋‚ด๋Š” ๋ฆฌ์•กํŠธ+TDD ์„œ์ 

    Reflow or Repaint(or ReDraw) ๊ณผ์ • ์„ค๋ช… ๋ฐ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

    Reflow์™€ Repaint

     

Designed by Tistory.