Published on

๐Ÿ’ป Critical Rendering Path

Authors
  • avatar
    Name
    ์ตœ์˜์ค€ (Youngjun Choi)
    Twitter

์šฐ๋ฆฌ๊ฐ€ ๋‹น์—ฐํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ๋ฅผ ์ผœ์„œ,ํฌ๋กฌ์„ ๋ˆ„๋ฅด๋ฉด ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ๋ณด์—ฌ์ค€๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค ์–ด๋งˆ์–ด๋งˆํ•œ ์ž‘์—…์ด ๋’ค์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด๋‹น url์„ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ณ  ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์คฌ์„ ๋•Œ, ๊ทธ ๊ฒฐ๊ณผ ( html, css, javascript )๋ฅผ ์šฐ๋ฆฌ์—๊ฒŒ ๊ทธ๋ ค์ฃผ๋Š” ๊ณผ์ •, Critical Rendering Path์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

CRP์˜ ์ •์˜

Critical Rendering Path๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ html, css, javascript๋ฅผ ํ•ด์„ํ•ด์„œ ํ™”๋ฉด์— ๊ทธ๋ ค์ฃผ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋“ค, html, css, javascript๋ฅผ ๋ฐ›์œผ๋ฉด ๊ทธ๊ฑธ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋จผ์ € ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ณ€ํ™˜ํ•ด์ค˜์•ผํ•œ๋‹ค. ์ด๋•Œ html parser์™€ css parser๋ฅผ ์ด์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ฝ์–ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ํ† ํฐํ™”๋ฅผ ํ•œ๋‹ค. ์ด ํ† ํฐ์˜ ๊ฒฐ๊ณผ๋ฌผ๋“ค์„ ํ•œ๋ฒˆ์ฏค ๋“ค์–ด๋ณธ ์  ์žˆ๋Š” DOM๊ณผ CSSOM์ด๋‹ค.

๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋จผ์ € ์ •๋ฆฌํ•ด๋‘˜ ๊ฒƒ์€ ๊ฐ ํŒŒ์ผ์„ ์ฝ์–ด๋‚˜๊ฐ€๋Š” ๊ณผ์ •์— ์‚ฌ์šฉ๋˜๋Š” ์—”์ง„์ด ๋‘๊ฐ€์ง€๋ผ๋Š” ์ ์ด์—ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๋Š” "๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„", ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ์–ด์ฃผ๋Š” "์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„"์ด๋‹ค. ์ „๋‹ฌ๋ฐ›์€ html์„ ์ฝ๋Š” ๊ฒƒ์€ ๋ Œ๋”๋ง ์—”์ง„, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ๊ณ  DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๋“ฑ์˜ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด๋‹ค.

CRP ์„ธ๋ถ€๊ณผ์ •

์„ธ๋ถ€๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๊ณผ์ •์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

CRP

DOM ํŠธ๋ฆฌ

DOM์€ Document Object Model๋กœ HTML parser๋ฅผ ์ด์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” Tree ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•ด ๋งŒ๋“  ๊ตฌ์กฐ๋‹ค. ๋‚ด๊ฐ€ ์ž‘์„ฑํ•˜๋Š” html ํƒœ๊ทธ๋“ค์€ DOM ํŠธ๋ฆฌ์˜ Node๋กœ ๋ณ€ํ™˜๋˜๊ฒŒ ๋œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” tree๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํƒœ๊ทธ๋“ค์˜ ๋ถ€๋ชจ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link href="style.css" rel="stylesheet" />
    <title>Critical Path</title>
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div><img src="awesome-photo.jpg" /></div>
  </body>
</html>
dom

๊ทธ๋Ÿฌ๋ฉด ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ DOM tree๋Š” ์–ด๋–ป๊ฒŒ ์Šคํƒ€์ผ๋ง์ด ๋˜๋Š” ๊ฑธ๊นŒ?

CSSOM ํŠธ๋ฆฌ

cssํŒŒ์ผ์€ ๋ณดํ†ต html์˜ head์— ๋„ฃ์–ด์ฃผ๋Š”๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด html์„ ์ฝ๋‹ค๊ฐ€ link:css๋ฅผ ๋งŒ๋‚˜๋ฉด html ํŒŒ์‹ฑ์„ ๋ฉˆ์ถ”๊ณ  css ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๋ถˆ๋Ÿฌ์˜จ cssํŒŒ์ผ์€ css parser์— ์˜ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋ฆฌ๊ตฌ์กฐ์ธ CSSOM (CSS Object Model)์„ ๋งŒ๋“ค๊ฒŒ ๋˜๊ณ , ๋ธŒ๋ผ์šฐ์ €๋Š” ๋งŒ๋“  tree๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด์„œ CSS์˜ ๊ธฐ๋ณธ ์›๋ฆฌ์ธ Cascading rule (์•„๋ž˜๋กœ ๋‚ด๋ ค์˜ฌ ์ˆ˜๋ก, ํ•ด๋‹น ํƒœ๊ทธ์— ๊ตฌ์ฒด์ ์ธ styling์š”์†Œ์ผ์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค)๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. CSSOM์„ ๋งŒ๋“  ์ดํ›„์— ๋‹ค์‹œ htmlํŒŒ์‹ฑ์ด ๋ฉˆ์ถฐ์ง„ ๊ณณ์œผ๋กœ ๋Œ์•„๊ฐ€ ๋‹ค์‹œ html์„ ํŒŒ์‹ฑํ•œ๋‹ค.

body {
  font-size: 16px;
}
p {
  font-weight: bold;
}
span {
  color: red;
}
p span {
  display: none;
}
img {
  float: right;
}
cssom.png

์ด๋ ‡๊ฒŒ ๋งŒ๋“  ๊ฐ๊ฐ์˜ Tree๋“ค์€ ์–ด๋–ป๊ฒŒ ํ•ฉ์น ๊นŒ?

Render Tree

Render Tree๋Š” ์•ž์„œ ์ •๋ฆฌํ•œ DOM tree์™€ CSSOM Tree๋ฅผ ํ•ฉ์ณ์„œ, DOM Tree์˜ Node์— CSSOM์—์„œ ๊ฒฐ์ •๋œ ์Šคํƒ€์ผ๋ง์„ ์ ์šฉํ•œ ๊ตฌ์กฐ๋‹ค. Render Tree์—์„œ ํŠน์ง•์ ์ธ ๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๊ทธ๋ ค์ฃผ์ง€ ์•Š์„ ๋ถ€๋ถ„ (html์˜ head๋‚˜ display:none์œผ๋กœ ์Šคํƒ€์ผ๋ง๋œ node)์„ ์ œ์™ธํ•˜๊ณ  ๋ณด์—ฌ์ค„ ๋ถ€๋ถ„๋งŒ ๋‹ด๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

render tree

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ Javascript๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฑธ๊นŒ?

Javascript

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ cssํŒŒ์ผ๊ณผ ๋™์ผํ•˜๊ฒŒ html์˜ ํŒŒ์‹ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ Œ๋”๋ง ์—”์ง„์ด script๋ฅผ ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด DOM์ƒ์„ฑ์„ ์ค‘์ง€ํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ํŒŒ์‹ฑ๊ณผ ์‹คํ–‰์„ ์ง„ํ–‰ํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ์–ด AST(abstract syntax tree)๋ฅผ ์ƒ์„ฑํ•œ ํ›„์— ์‹คํ–‰ํ•œ๋‹ค. ์ด๋•Œ DOM์ด๋‚˜ CSSOM์„ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด ๋ Œ๋”ํŠธ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฒŒ ๋˜๊ณ , ๋ณ€๊ฒฝ๋œ ๋ Œ๋”ํŠธ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋ฆฌํ”Œ๋กœ์šฐ(layout ๊ณ„์‚ฐ์„ ๋‹ค์‹œ ์‹คํ–‰)์™€ ๋ฆฌํŽ˜์ธํŠธ(๋‹ค์‹œ paint๊ณผ์ •์„ ๋‹ค์‹œ ์ง„ํ–‰)๋ฅผ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€๊ฒฝ๊นŒ์ง€ ํ•œ ํ›„์— ๋ Œ๋”ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ์–ด๋””์— ์š”์†Œ๋ฅผ ๊ทธ๋ฆด์ง€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜๋‹ค.

Layout

Layout๊ณผ์ •์€ Render Tree๋กœ ์–ด๋–ค์š”์†Œ๋กœ ์–ด๋–ป๊ฒŒ ๊ทธ๋ฆด์ง€๋ฅผ ๊ฒฐ์ •ํ•œ ํ›„์— ์–ด๋””์— ๊ทธ๋ฆด์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ํ•ด๋‹น์š”์†Œ์˜ ๋ถ€๋ชจ์ž์‹๊ด€๊ณ„, css์—์„œ ์ •์˜๋œ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์ด์šฉํ•ด ๊ณ ์ •๋œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <title>Critial Path: Hello world!</title>
  </head>
  <body>
    <div style="width: 50%">
      <div style="width: 50%">Hello world!</div>
    </div>
  </body>
</html>
layout

์ด์ œ ์œ„์น˜๊นŒ์ง€ ๊ณ„์‚ฐ์ด ๋๋‚ฌ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ๋“œ๋””์–ด ์‹ค์ œ๋กœ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ด๋‹ค.

Paint์™€ composite

Paint๋Š” ๋ธŒ๋ผ์šฐ์ € ์š”์†Œ๋ฅผ ์‹ค์ œ ํ”ฝ์…€๋‹จ์œ„๋กœ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์š”์†Œ๋ฅผ ๊ทธ๋ฆด ๋•Œ ํ•œ ์ธต์— ๋‹ค ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธต์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ทธ๋ฆฐ๋‹ค๋Š” ์ ์ด๋‹ค. ํ•˜๋‚˜์˜ ์ธต์— ๊ทธ๋ฆฌ์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธต๋กœ ๋‚˜๋ˆ ์„œ ๊ทธ๋ฆฌ๋Š” ์ด์œ ๋Š”, ํ•˜๋‚˜ surface์— ๊ทธ๋ฆด ๊ฒฝ์šฐ, ๋‚ด๋ถ€ ์š”์†Œ์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๋ฉด ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ ค์•ผํ•˜๋Š” ๋‹จ์ ์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์œ„์น˜๋‚˜ ์Šคํƒ€์ผ๋ง ์š”์†Œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ์ธต์œผ๋กœ ๊ทธ๋ ค์ง„๋‹ค. ๋ณ€ํ™”๋  ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ์ธต์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ css์˜ will-change์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ์ธต์œผ๋กœ ๊ทธ๋ ค๋†“์€ ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์˜ ์ธต์œผ๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •์„ composite์ด๋ผ๊ณ  ํ•œ๋‹ค.

CRP์™€ ์„ฑ๋Šฅ

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

๋งŒ์•ฝ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด layout์ด ์ƒˆ๋กœ ์ผ์–ด๋‚˜์•ผํ•œ๋‹ค๋ฉด layout์ด ๋ณ€๊ฒฝ๋œ ์ดํ›„ ๊ณผ์ •์ธ paint์™€ composite๋„ ๋‹ค์‹œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๋ณ€ํ™”๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์š”์†Œ๋ฅผ ์ด๋™์‹œํ‚ฌ ๋•Œ position์„ ๋ณ€ํ™”์‹œํ‚ค๋Š” ๊ฒƒ(layout) ๋ณด๋‹ค transform์„ ์ด์šฉํ•ด (transform) ์š”์†Œ๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๊ฒŒ ๋” ์„ฑ๋Šฅ์ด ์ข‹์€ ์ด์œ ๊ฐ€ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ๋น„๊ต๋ฅผ ์œ„ํ•ด์„œ๋Š” https://csstriggers.com/์™€ ๊ฐ™์€ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ์กฐํ•ด ๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ์ ์ ˆํ•œ styling์˜ ์„ ํƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ฆฌ์•กํŠธ์™€ CRP

๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ DOM์š”์†Œ๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…๋“ค์„ ๋งŽ์ด ํ•ด์™”๋‹ค. CRP๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด ์—ฌํƒœ๊นŒ์ง€ ์ž‘์—…ํ–ˆ๋˜ ๊ณผ์ •์— ๋Œ€ํ•ด ์˜๋ฌธ์ด ์ƒ๊ธด๋‹ค. DOM์„ ์ง์ ‘๊ฑด๋“œ๋ฆฌ๋ฉด ์ดํ›„์— layout, paint, composite๋„ ๋‹ค ๋‹ค์‹œ ์ผ์–ด๋‚˜์•ผํ•˜๊ณ  ํ™”๋ฉด์ด ๊นœ๋นก์ผ ๊ฒƒ ๊ฐ™์€๋ฐ ์™œ ์ผ์–ด๋‚˜์ง€ ์•Š์•˜์„๊นŒ?

์ด์œ ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ ํ”ผ์ƒ์ ์œผ๋กœ๋งŒ ์•Œ๊ณ  ์žˆ๋˜ ๋ฆฌ์•กํŠธ์˜ V-DOM๊ณผ Reconcilation ๋•๋ถ„์ด์—ˆ๋‹ค.

V-DOM

๋ฆฌ์•กํŠธ๋Š” ๊ฐ€์ƒ DOM, V-DOM(Virtual DOM)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ์ƒํƒœ์— ๋”ฐ๋ผ UI์˜ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ณ€ํ™”์— ํ•ญ์ƒ ์ฆ‰๊ฐ์ ์œผ๋กœ DOM์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, V-DOM์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•  ํƒ€์ด๋ฐ์„ ๊ด€๋ฆฌํ•˜๋Š” "์Šค์ผ€์ค„๋Ÿฌ"๊ฐ€ ์žˆ์–ด, ๋ณ€ํ™”๋“ค์„ ๋ชจ์•„์„œ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— state๋ฅผ ๋ฐ”๊พธ์—ˆ์„ ๋•Œ ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์žˆ๊ณ , "setState๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค"๋Š” ์˜๋ฏธ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋‹ค. V-DOM ๋•๋ถ„์— ์ •๋ง ํ•„์š”ํ•œ ๋ถ€๋ถ„์—๋งŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ Reconcilation์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

post-thumbnail

๊ทธ๋Ÿฌ๋ฉด Reconcilation์—์„œ V-DOM๊ณผ ์‹ค์ œ DOM์€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋ ๊นŒ?

Reconcilation

react์—์„œ ๋ฆฌ๋žœ๋”๋ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋Š” props๋‚˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ•œ ๊ฒฝ์šฐ๋‹ค. ์ƒํƒœ๋ณ€ํ™”์— ๋”ฐ๋ผ V-DOM์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‹ค์ œ DOM๊ณผ ๋น„๊ตํ•ด, ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ณผ์ •์„ Reconcilation๋ผ๊ณ  ํ•œ๋‹ค. Reconcilation์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ™”์— ๋”ฐ๋ผ ์–ด๋–ค ์š”์†Œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์ผ์ผํžˆ ๋น„๊ตํ•œ๋‹ค๋ฉด ๋ฆฌ์•กํŠธ ๊ณต์‹ํ™ˆํŽ˜์ด์ง€์—์„œ๋Š” O(n^3)์˜ ์‹œ๊ฐ„๋ณต์žก๋„(n์€ tree ์š”์†Œ ์ˆ˜) ๋ฅผ ๊ฐ–๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ์ผ์ผํžˆ ๋‹ค ๋น„๊ตํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ ๋ฆฌ์•กํŠธ๋Š” ๋‘๊ฐ€์ง€ ์ „์ œ๋ฅผ ์ด์šฉํ•œ๋‹ค.

์ฒซ๋ฒˆ์งธ๋Š” element type์ด ๋‹ฌ๋ผ์ง€๋ฉด ๋‹ค๋ฅธ tree๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ์ ์ด๋‹ค. aํƒœ๊ทธ์—์„œ imgํƒœ๊ทธ๋กœ ๋ฐ”๋€๋‹ค๋ฉด ์•„์˜ˆ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋ถ€๋ชจ node๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉด ์ผ์ผํžˆ ์ž์‹๊นŒ์ง€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด tree๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ์ƒํƒœ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ „์ œํ•œ ๋™์ž‘์ด๋‹ค. ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ฌ ๋•Œ ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ƒํƒœ๋กœ ๋ณ€ํ™”์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค๋Š” ์›์น™์ด ์—ฌ๊ธฐ์„œ ๊ธฐ์ธํ•œ๋‹ค. Object์˜ ์ฐธ์กฐ๊ฐ’์„ ์ด์šฉํ•œ ์–•์€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ์ƒํƒœ์ธ์ง€ ๋‹ค๋ฅธ ์ƒํƒœ์ธ์ง€ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œ์ผœ์ค„ ๋•Œ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์„ ํ• ๋‹นํ•ด ์ฃผ์–ด์•ผํ•œ๋‹ค.

๋‘๋ฒˆ์งธ๋กœ ๊ฐœ๋ฐœ๊ณผ์ •์—์„œ key๋ฅผ ์ด์šฉํ•ด ๋‹ฌ๋ผ์ ธ์•ผํ•  ๋ถ€๋ถ„์„ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. react๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ map์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์„ ๋•Œ ์ž์ฃผ ๋งˆ์ฃผํ•˜๋Š” ์—๋Ÿฌ์˜€๋Š”๋ฐ ์™œ ๋ฆฌ์•กํŠธ๊ฐ€ ์—๋Ÿฌ๋กœ ๋˜์ ธ์ฃผ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค. key๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ”๋€Œ์–ด์•ผํ•˜๋Š” ์š”์†Œ๋ฅผ ์•Œ๋ ค์คŒ์œผ๋กœ์จ ๋ถˆํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์œ„ ๋‘๊ฐ€์ง€ ์ „์ œ๋ฅผ ์ด์šฉํ•ด V-DOM๊ณผ ์‹ค์ œ DOM์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ DOM์—์„œ ๋ณ€ํ™”๋˜์•ผํ•  ๋ถ€๋ถ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ณ , ์ฐพ์€ ๋ถ€๋ถ„์€ ์ ์ ˆํ•œ ํƒ€์ด๋ฐ์— ํ•œ๋ฒˆ์— ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์–ด, ๊นœ๋นก์ž„์—†์ด ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์Šค์ฝ”ํ”„, ์‹คํ–‰์ปจํ…์ŠคํŠธ,ํด๋กœ์ €๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ๋„ ๋А๊ผˆ์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋‹น์—ฐํ•˜๊ฒŒ ์“ฐ๊ณ  ์žˆ๋Š” ๊ฒƒ ๋’ค์—์„œ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š” ์ž‘์—…๋“ค์„ ์•Œ๊ฒŒ ๋˜๋ฉด ๊นœ์ง ๋†€๋ผ๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŽ์€ ์ž‘์—…์ด ๋˜๊ณ  ์žˆ๋‹ค๋‹ˆ... "๋ˆ„๊ตฐ๊ฐ€ ํ•˜๋Š” ๋ชจ์Šต์ด ์‰ฌ์›Œ๋ณด์ธ๋‹ค๋ฉด ๊ทธ์‚ฌ๋žŒ์€ ๊ทธ๋ถ„์•ผ์˜ ๊ณ ์ˆ˜๋‹ค"๋ผ๋Š” ๋ง์ด ์žˆ๋“ฏ์ด ๊ทธ๋งŒํผ์˜ ์ถ”์ƒํ™”๊ฐ€ ์ž˜ ๋˜์–ด์žˆ์–ด ์‚ฌ์šฉ์ž๋Š” ๊ทธ๋Ÿฐ ๋ถ€๋ถ„๋“ค์„ ์•Œ์ง€ ๋ชปํ•ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ๋†€๋ž๋‹ค. CRP๋ฅผ ์ด์ „์— ์•Œ๊ณ ๋Š” ์žˆ์—ˆ์ง€๋งŒ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ๋น„์–ด์žˆ๋Š” ๋ถ€๋ถ„์ด์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ๊ธฐํšŒ์— ์—ฐ๊ฒฐ์ด ๋˜๋ฉด์„œ ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ์˜€๋‹ค. ๋ฆฌ์•กํŠธ๋ฅผ ์“ฐ๋Š” ์ด์œ ๋กœ ๋‹จ์ˆœํžˆ ์‹œ์žฅ์—์„œ ๋งŽ์ด ์“ฐ์—ฌ์„œ๋ผ๊ณ  ๋Œ€๋‹ตํ•˜๊ธฐ ๋ณด๋‹ค๋Š”, SPA์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋‹ค์–‘ํ•œ interaction์„ ํ•˜๋ฉด์„œ DOM์š”์†Œ๋“ค์„ ๊ฑด๋“œ๋ฆฌ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ V-dom๊ณผ reconcilation๊ณผ ๊ฐ™์€ ๋‚ด๋ถ€ ๋™์ž‘์œผ๋กœ ์ตœ์ ํ™”๊ฐ€ ๋œ ๋ Œ๋”๋ง์„ ๋ณด์žฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—๋ผ๊ณ  ๋Œ€๋‹ตํ•˜๋ฉด ๋” ์ข‹์€ ๋Œ€๋‹ต์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ฐธ์กฐ