๐ 01. HTML ๋ฉํ ๋ชจ๋ธ: '๊ทธ๋ฅ ํ๊ทธ ์๋๊ฐ์?'์์ ํ์ถํ๊ธฐ
๐ ๊ฐ์
HTML ํ์ฑ ์๋ฆฌ, DOM ํธ๋ฆฌ ์์ฑ, Critical Rendering Path๊น์ง โ ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ด๋ป๊ฒ ์ฝ๊ณ ๊ทธ๋ฆฌ๋์ง 5๋ ์ฐจ์ ์ธ์ด๋ก ์ค๋ช ํฉ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ / ํต์ฌ ํํธ๋ง: 8๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[HTML์ด๋ ๋ฌด์์ธ๊ฐ] โ [๋ธ๋ผ์ฐ์ ํ์ฑ ์๋ฆฌ] โ [DOM ํธ๋ฆฌ ์์ฑ] โ [Critical Rendering Path] โ [React์์ ์ฐ๊ฒฐ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- HTML์ด ๋จ์ ๋งํฌ์ ์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ์์ '๊ณ์ฝ์'์์ ์ค๋ช ํ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ DOM ํธ๋ฆฌ๋ก ๋ฐ๊พธ๋ ํ์ฑ ๊ณผ์ ์ ์์๋๋ก ๊ทธ๋ฆด ์ ์๋ค.
-
scriptํ๊ทธ ์์น๊ฐ ์ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ๋์ง ์๋ฆฌ๋ก ์ค๋ช ํ ์ ์๋ค. - React๊ฐ DOM์ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์ฐ๊ฒฐ ์ง์ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "์ํธ ๋, ์ HTML์ ์์ฃ .
<div>์ฐ๊ณ ,<p>์ฐ๊ณ , CSS ์ ํ๋ฉด ๋๋ ๊ฑฐ ์๋๊ฐ์? ๊ทผ๋ฐ ์ค๋ ์ฝ๋ ๋ฆฌ๋ทฐ์์ 'ํ์ฑ ๋ธ๋กํน'์ด๋ผ๋ ๋ง์ ๋ค์๋๋ฐ... ํ์ฑ์ด ๋ญ์์? ๋ธ๋กํน์ ๋ ๋ญ๊ณ ์. ํ๊ทธ ์์๊ฐ ์ฑ๋ฅ์ด๋ ๋ฌด์จ ์๊ด์ธ์ง ์ ํ ๋ชจ๋ฅด๊ฒ ์ด์์. ๊ทธ๋ฅ ํ๋ฉด์ ์ ๋์ค๋ฉด ๋ ๊ฑฐ ์๋๊ฐ์?" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ๊ทธ๊ฒ ๋ฑ '๊ธฐ๋ฅ ๊ตฌํ์'์ '์์ง๋์ด'์ ๊ฒฝ๊ณ์ ์ด์์. HTML ํ์ผ ํ ์ค ํ ์ค์ด ๋ธ๋ผ์ฐ์ ํํ ๋ด๋ฆฌ๋ ๋ช ๋ น์ด๊ฑฐ๋ ์. ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ๊ฑธ ์ด๋ค ์์๋ก ์ฝ๊ณ , ์ด๋์ ๋ฉ์ถ๊ณ , ์ด๋ป๊ฒ ํ๋ฉด์ ๊ทธ๋ฆฌ๋์ง ์์์ผ ์ง์ง ์ต์ ํ๋ฅผ ํ ์ ์์ด์."
๐ค ์ ์์์ผ ํ๋๊ฐ
์์๋ค ์ปค๋ฎค๋ํฐ ์๋น์ค ์ถ์ ํ๋ฃจ ์ , ์์ฒ ์ด๋ Lighthouse ์ ์๋ฅผ ์ฒ์ ๋๋ ค๋ดค๋ค.
Performance ์ ์: 42์ . ๐ด
์์(PM): "์์ฒ ๋, ์ด๊ฑฐ ์ ์ด๋ ๊ฒ ๋๋ ค์? ์ฌ์ฉ์๊ฐ 3์ด ์์ ์ฒซ ํ๋ฉด ๋ชป ๋ณด๋ฉด ๋ฐ๋ก ๋๊ฐ์."
์์ฒ ์ด์ index.html์ ์ด๋ฌ๋ค:
<!-- โ ์์ฒ ์ด์ ์ต์ด ์ฝ๋: ์คํฌ๋ฆฝํธ๊ฐ head ์์ ๋์ง๋์ง -->
<head>
<script src="analytics.js"></script>
<script src="heavy-library.js"></script>
<script src="app.js"></script>
</head>
<body>
<h1>์์๋ค ์ปค๋ฎค๋ํฐ</h1>
...
</body>๐ฆ ์ํธ ๋ฆฌ๋: "์์ฒ ๋, ๋ธ๋ผ์ฐ์ ๋ HTML์ ์์์ ์๋๋ก ํ ์ค์ฉ ์ฝ์ด์. <script> ํ๊ทธ๋ฅผ ๋ง๋๋ ์๊ฐ ํ์ฑ์ '์์ ํ ๋ฉ์ถ๊ณ ' ๊ทธ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค ๋ฐ์์ ์คํํ ๋ค์์์ผ ๋ค์ ์ฝ๊ฑฐ๋ ์. ์ง๊ธ <h1> ํ๊ทธ๋ณด๋ค <script> ์ธ ๊ฐ๊ฐ ๋จผ์ ์คํ๋๊ณ ์์ด์. ์ฌ์ฉ์ ๋์ ์๋ฌด๊ฒ๋ ์ ๋ณด์ด๋ ์๊ฐ์ด ๋ช ์ด์ฉ ๋ญ๋น๋๋ ๊ฑฐ์์."
์ด ๋ฌธ์ ๋ฅผ ์ง์ง๋ก ์ดํดํ๋ ค๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ๋ฉํ ๋ชจ๋ธ์ ๊ฐ์ถฐ์ผ ํ๋ค.
๐ 1. HTML์ '๋งํฌ์ '์ด ์๋๋ผ '๊ณ์ฝ์'๋ค
HTML์ ๋จ์ํ ํ๋ฉด์ ๊พธ๋ฏธ๋ ์ธ์ด๊ฐ ์๋์ผ. ๋ธ๋ผ์ฐ์ ์๊ฒ "์ด ๋ฌธ์์ ๊ตฌ์กฐ์ ์๋ฏธ(Semantics)๋ ์ด๊ฑฐ์ผ" ๋ผ๊ณ ์ ์ธํ๋ ๊ณ์ฝ์์ ๊ฐ๊น์.
๋ธ๋ผ์ฐ์ ๋ ์ด ๊ณ์ฝ์(HTML)๋ฅผ ์ฝ๊ณ , DOM(Document Object Model) ์ด๋ผ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ณํํด์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ฑฐ๋ .
๐ง 5์ด์๊ฒ ์ค๋ช ํ๋ค๋ฉด?
๋ ๊ณ ์ค๋ช ์(HTML)๊ฐ ์์ผ๋ฉด, ๋ ๊ณ ์กฐ๋ฆฝ ๊ฒฐ๊ณผ๋ฌผ(DOM)์ด ๋ง๋ค์ด์ง๋ ๊ฑฐ์ผ.
์ค๋ช ์๋๋ก ๋ ๊ณ ๋ฅผ ์กฐ๋ฆฝํ๋ฉด ์ด์์๋ ๋ชจํ(ํ๋ฉด์ ๋ณด์ด๋ UI)์ด ๋๋ ๊ฑฐ์ง.
์ค๋ช ์๋ฅผ ์๋ชป ์ฐ๋ฉด? ๋ ๊ณ ๊ฐ ์ด์ํ๊ฒ ์กฐ๋ฆฝ๋ผ.
HTML ๋ฌธ์์ ๋ผ๋ ๊ตฌ์กฐ:
<!doctype html> <!-- ๋ธ๋ผ์ฐ์ ์๊ฒ: "์ด๊ฑด ํ๋ HTML5 ํ์ค์ด์ผ" -->
<html lang="ko"> <!-- ๋ฃจํธ ์์: ์ด ๊ณ์ฝ์์ ์์ -->
<head> <!-- ๊ธฐ๊ณ์ฉ ๋ฉํ๋ฐ์ดํฐ: ๋ธ๋ผ์ฐ์ ยท๊ฒ์์์ง์ด ์ฝ๋ ์ ๋ณด -->
<meta charset="UTF-8" />
<title>์์๋ค ์ปค๋ฎค๋ํฐ</title>
</head>
<body> <!-- ์ฌ๋์ฉ ์ฝํ
์ธ : ์ค์ ํ๋ฉด์ ๋ณด์ด๋ ๋ถ๋ถ -->
<h1>์๋
ํ์ธ์</h1>
</body>
</html><!doctype html> ์ด ํ ์ค์ด ์ค์ํด. ์ด๊ฒ ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ "์ด ๋ฌธ์๊ฐ ๊ตฌ๋ฒ์ HTML์ธ๊ฐ?" ํ๋ฉฐ Quirks Mode (ํธํ์ฑ ๋ชจ๋)๋ก ์ง์
ํด์ ์ค๋๋ ๋ ๋๋ง ๊ท์น์ ์ ์ฉํด๋ฒ๋ ค. CSS ๋ ์ด์์์ด ์ด์ํ๊ฒ ๊นจ์ง๋ ์์ธ์ด ๋๊ธฐ๋ ํ์ง.
๐ 2. ๋ธ๋ผ์ฐ์ ์ HTML ํ์ฑ ๊ณผ์
๋ธ๋ผ์ฐ์ ๊ฐ HTML ํ์ผ์ ๋ฐ์ผ๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋จ๊ณ๋ณ๋ก ์ดํด๋ณด์.
2-1. ๋ฐ์ดํธ โ ๋ฌธ์ โ ํ ํฐ โ ๋ ธ๋ โ DOM ํธ๋ฆฌ
[์๋ฒ] HTML ๋ฐ์ดํธ ์คํธ๋ฆผ ์ ์ก
โ
[๋ธ๋ผ์ฐ์ ํ์] ๋ฐ์ดํธ โ ๋ฌธ์(Character) ๋์ฝ๋ฉ (UTF-8 ๋ฑ)
โ
[ํ ํฌ๋์ด์ ] ๋ฌธ์์ด โ ํ ํฐ(Token) ๋ถ๋ฆฌ (<html>, <head>, <body> ๋ฑ)
โ
[๋
ธ๋ ์์ฑ] ๊ฐ ํ ํฐ โ DOM ๋
ธ๋(๊ฐ์ฒด) ์์ฑ
โ
[ํธ๋ฆฌ ๊ตฌ์ฑ] ๋
ธ๋๋ค์ ๋ถ๋ชจ-์์ ๊ด๊ณ ์ฐ๊ฒฐ โ DOM ํธ๋ฆฌ ์์ฑ
<!-- ์ด HTML์ด -->
<html>
<body>
<p>์์๋ค <strong>์ปค๋ฎค๋ํฐ</strong></p>
</body>
</html><!-- ์ด๋ฐ DOM ํธ๋ฆฌ๊ฐ ๋๋ค -->
Document
โโโ html
โโโ body
โโโ p
โโโ "์์๋ค " (ํ
์คํธ ๋
ธ๋)
โโโ strong
โโโ "์ปค๋ฎค๋ํฐ" (ํ
์คํธ ๋
ธ๋)
DOM ํธ๋ฆฌ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ document.querySelector() ๋ก ์ ๊ทผํ ์ ์๋ ๋ฐ๋ก ๊ทธ ๊ฐ์ฒด ๊ตฌ์กฐ์ผ. HTML ํ์ผ์ด DOM์ด ๋๋ ๊ฑฐ์ง, DOM ์์ฒด๊ฐ HTML์ ์๋์ผ.
2-2. <script> ๊ฐ ํ์ฑ์ ๋ง๋ ์ด์
๐ฃ ์์ฒ : "๊ทธ๋ผ <script> ํ๊ทธ๋ฅผ ๋ง๋๋ฉด ์ ํ์ฑ์ด ๋ฉ์ถ๋ ๊ฑฐ์์?"
๐ฆ ์ํธ ๋ฆฌ๋: "์๋ฐ์คํฌ๋ฆฝํธ๊ฐ DOM์ ์ค์๊ฐ์ผ๋ก ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด์์. document.write() ๊ฐ์ ํจ์๋ก HTML ์์ฒด๋ฅผ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๊ฑฐ๋ ์. ๋ธ๋ผ์ฐ์ ํ์ ์
์ฅ์์๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด๋ณด๊ธฐ ์ ๊น์ง '์ด ์คํฌ๋ฆฝํธ๊ฐ ๋ค์ ์ฌ HTML์ ๋ฐ๊ฟ์ง ์ ๋ฐ๊ฟ์ง' ์ ์๊ฐ ์์ด์. ๊ทธ๋์ ์์ ํ๊ฒ, ์คํฌ๋ฆฝํธ ์์ ํ ์คํํ๊ณ ๋์์ผ ๋ค์ HTML์ ์ฝ๋ ๊ฑฐ์ฃ ."
<!-- โ ํ์ฑ ๋ธ๋กํน ํจํด (Render-Blocking) -->
<head>
<script src="heavy-library.js"></script> <!-- ์ฌ๊ธฐ์ ํ์ฑ STOP -->
</head>
<body> <!-- heavy-library.js ๋ค ๋ฐ๊ณ ์คํ๋ ๋๊น์ง ์ด ๋ถ๋ถ์ ์ฝ์ง๋ ์์ -->
<h1>์์๋ค ์ปค๋ฎค๋ํฐ</h1>
</body><!-- โ
5๋
์ฐจ์ ํด๊ฒฐ๋ฒ: defer/async ํ์ฉ -->
<head>
<!-- defer: ํ์ฑ ๊ณ์ ์งํ, ํ์ฑ ์๋ฃ ํ ์์๋๋ก ์คํ -->
<script src="app.js" defer></script>
<!-- async: ํ์ฑ ๊ณ์ ์งํ, ์คํฌ๋ฆฝํธ ๋ฐ์ผ๋ฉด ์ฆ์ ์คํ (์์ ๋ณด์ฅ X) -->
<script src="analytics.js" async></script>
</head>| ์์ฑ | ํ์ฑ ๋ธ๋กํน | ์คํ ์์ | ์คํ ์์ | ์ฌ์ฉ ์ผ์ด์ค |
|---|---|---|---|---|
| ์์ | O (๋ธ๋กํน) | ์ฆ์ | ์ ์ธ ์์ | ์ ๋ ๋น์ถ์ฒ |
defer | X | DOM ํ์ฑ ์๋ฃ ํ | ์ ์ธ ์์ ๋ณด์ฅ | ์ฑ ๋ฉ์ธ ์คํฌ๋ฆฝํธ |
async | X | ๋ค์ด๋ก๋ ์๋ฃ ์ฆ์ | ์์ ๋ณด์ฅ ์๋จ | ๋ ๋ฆฝ์ ์ธ ๋ถ์ ์คํฌ๋ฆฝํธ |
๐๏ธ 3. Critical Rendering Path: ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ธฐ๊น์ง
DOM ํธ๋ฆฌ๊ฐ ๋ง๋ค์ด์ก๋ค๊ณ ๋ฐ๋ก ํ๋ฉด์ด ๊ทธ๋ ค์ง๋ ๊ฒ ์๋์ผ. Critical Rendering Path ๋ผ๋ 6๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํด.
HTML ํ์ฑ โ DOM ํธ๋ฆฌ
CSS ํ์ฑ โ CSSOM ํธ๋ฆฌ
โ
DOM + CSSOM = Render Tree (ํ๋ฉด์ ์ค์ ๋ก ๋ณด์ผ ๋
ธ๋๋ง ์ ํ)
โ
Layout (Reflow): ๊ฐ ์์์ ์์นยทํฌ๊ธฐ ๊ณ์ฐ
โ
Paint: ์ค์ ํฝ์
๋ก ์์น
โ
Compositing: ๋ ์ด์ด ํฉ์ฑ โ ์ต์ข
ํ๋ฉด
๐ฆ ์ํธ ๋ฆฌ๋: "CSS๋ ํ์ฑ ๋ธ๋กํน์ด์์. <link rel='stylesheet'> ๋ฅผ ๋ง๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ CSSOM ์ ๋ค ๋ง๋ค ๋๊น์ง Render Tree ์์ฑ์ ๊ธฐ๋ค๋ ค์. ๊ทธ๋์ CSS๋ ํญ์ <head> ์๋จ์ ๋ฃ๋ ๊ฒ ๋ง๋ ๊ฑฐ์์. JS ๋ ํ๋จ, CSS ๋ ์๋จ โ ์ด๊ฒ 5๋
์ฐจ์ ๊ธฐ๋ณธ ์ต๊ด์ด์์."
<!-- โ
5๋
์ฐจ์ HTML ๊ธฐ๋ณธ ๋ผ๋ -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>์์๋ค ์ปค๋ฎค๋ํฐ</title>
<!-- CSS๋ head ์๋จ: CSSOM ๋จผ์ ๋ง๋ค์ด์ผ Render Tree ์์ฑ ๊ฐ๋ฅ -->
<link rel="stylesheet" href="styles.css" />
<!-- ์ฑ ์ค์ ์คํฌ๋ฆฝํธ๋ defer: DOM ์์ฑ ํ ์์๋๋ก ์คํ -->
<script src="app.js" defer></script>
</head>
<body>
<!-- ์ฝํ
์ธ ๊ฐ ๋จผ์ ํ์ฑ๋์ด ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ฒ ๋ณด์ -->
<h1>ํ์ํฉ๋๋ค!</h1>
</body>
</html>โ๏ธ 4. React์ DOM์ ๊ด๊ณ
๐ฃ ์์ฒ : "๊ทธ๋ผ React๋ฅผ ์ฐ๋ฉด ์ด DOM ํธ๋ฆฌ ์๊ธฐ๋ ์๊ด์๋ ๊ฑฐ ์๋๊ฐ์? React๊ฐ ์์์ ๋ค ํด์ฃผ์์์."
๐ฆ ์ํธ ๋ฆฌ๋: "์ ๋ฐ๋์์. React๋ Virtual DOM์ผ๋ก DOM์ ๋ ์๋ฆฌํ๊ฒ ๋ค๋ฃจ๋ ๋๊ตฌ์ง, DOM์์ ๋ ๋ฆฝ๋ผ ์๋ ๊ฒ ์๋์์. React ์ฑ๋ ๊ฒฐ๊ตญ ๋ธ๋ผ์ฐ์ ์ ์ค์ DOM์ ์กฐ์ํ๋ ๊ฒ์ผ๋ก ๋๋์. ๊ทธ๋์ DOM์ ๋ชจ๋ฅด๋ฉด React ์ฑ๋ฅ ๋ฌธ์ ๋ Hydration ์๋ฌ๋ฅผ ์ ๋ ๋ชป ์ก์์."
<!-- React ์ฑ์ ์ง์ง HTML ๋ผ๋ (index.html) -->
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>์์๋ค ์ปค๋ฎค๋ํฐ</title>
</head>
<body>
<!-- React ์ฑ์ด ๋ง์ดํธ๋ ๋จ ํ๋์ DOM ๋
ธ๋ -->
<div id="root"></div>
<!-- React JS: defer๋ก DOM ํ์ฑ ์๋ฃ ํ ์คํ -->
<script type="module" src="/src/main.tsx" defer></script>
</body>
</html>React๋ <div id="root"> ๋ผ๋ ๋น ๊ป๋ฐ๊ธฐ ๋ฅผ ์ง์
์ ์ผ๋ก ์ผ์, ๊ทธ ์์ Virtual DOM์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ์ค์ DOM์ผ๋ก ์ฐ์ด๋ด(Mount)๋ ๊ฑฐ์ผ. ๊ทธ๋์ React ์ฑ์ HTML ๋ผ๋๋ ์ฌ์ค์ ์ ๊ฒ ์ ๋ถ์ผ.
๐ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ
Next.js๋ ์ด ๊ณผ์ ์ SSR(Server-Side Rendering)๋ก ๋ฐ์ ์์ผ์.
์๋ฒ์์ ๋ฏธ๋ฆฌ HTML์ ์์ฑํด์ ๋ณด๋ด์ฃผ๋ฉด โ ๋ธ๋ผ์ฐ์ ๊ฐ<div id="root">์ ๋น ๊ป๋ฐ๊ธฐ๊ฐ ์๋ ์ค์ ์ฝํ ์ธ ๊ฐ ๋ด๊ธด HTML์ ๋ฐ๊ฒ ๋ผ์. ๊ทธ๋์ ์ฌ์ฉ์๊ฐ JavaScript ๋ก๋ฉ ์ ์๋ ์ฝํ ์ธ ๋ฅผ ๋ณผ ์ ์๋ ๊ฑฐ์์ (FCP ๊ฐ์ ).
๐ ํต์ฌ ํจํด ์ด์ ๋ฆฌ
| ๊ฐ๋ | ๋ด๊ฐ ์ดํดํ ์๋ฏธ | 5๋ ์ฐจ์ ์ค๋ช |
|---|---|---|
| DOM | HTML์ ๊ฐ์ฒด ๋ณํ๋ณธ | ๋ธ๋ผ์ฐ์ ํ์๊ฐ HTML ํ๊ทธ๋ฅผ ์ฝ์ด ๋ฉ๋ชจ๋ฆฌ ์์ ์์ฑํ ๋ ธ๋ ํธ๋ฆฌ. JS๊ฐ ์กฐ์ํ๋ ๋์. |
| ํ์ฑ ๋ธ๋กํน | <script> ์ ๋ฉ์ถค | JS๋ DOM์ ์์ ํ ์ ์์ด์, ๋ธ๋ผ์ฐ์ ๋ <script> ์คํ ์๋ฃ ์ ๊น์ง ๋ค์ HTML์ ์ฝ์ง ์์. |
defer | ๋น๋๊ธฐ ๋ก๋, ์์ ๋ณด์ฅ | DOM ํ์ฑ์ ๋ง์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋, ํ์ฑ ์๋ฃ ํ ์ ์ธ ์์๋๋ก ์คํ. |
| CRP | ํ๋ฉด ๋ ๋๋ง ํ์ดํ๋ผ์ธ | HTMLโDOM, CSSโCSSOM โ Render Tree โ Layout โ Paint โ Composite ์ 6๋จ๊ณ ๊ณผ์ . |
<!doctype html> | ํ์ค ๋ชจ๋ ์ ์ธ | ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ Quirks Mode๋ก ์ง์ ํด ์ค๋๋ ๋ ๋๋ง ๊ท์น ์ ์ฉ. ํญ์ ์ฒซ ์ค์ ํ์. |
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ค์ ์ค ๋ธ๋ผ์ฐ์ ์ HTML ํ์ฑ์ ๋ง์ ์ด๊ธฐ ๋ ๋๋ง์ ์ง์ฐ์ํค๋ ์์ธ์?
- A)
<link rel="stylesheet" href="style.css">๋ฅผ<head>์ ์ ์ธ - B)
<script src="app.js"></script>๋ฅผ<head>์defer์์ด ์ ์ธ - ๊ฐ)
<img>ํ๊ทธ์alt์์ฑ ๋๋ฝ - ๋ผ)
<meta charset="UTF-8">์<head>์ฒซ ์ค์ ์ ์ธ
โ ์ ๋ต: B
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
<script>๋ฅผdefer๋async์์ด ์ ์ธํ๋ฉด ๋ธ๋ผ์ฐ์ ํ์๋ ๊ทธ ์ง์ ์์ ํ์ฑ์ ์์ ํ ์ค๋จํฉ๋๋ค. ์คํฌ๋ฆฝํธ ํ์ผ์ ๋คํธ์ํฌ์์ ๋ค์ด๋ก๋ํ๊ณ , ์คํ๊น์ง ์๋ฃํ ๋ค์์ผ ๋ค์ HTML์ ์ฝ์ด์.<head>๊ฐ ๋ณธ๋ฌธ๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๋๋ฏ๋ก, ์ฌ์ฉ์๋ ์คํฌ๋ฆฝํธ ์คํ์ด ๋๋ ๋๊น์ง ํ๋ฉด์ ์๋ฌด๊ฒ๋ ๋ณผ ์ ์์ต๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: A๋ CSS ํ์ฑ์ผ๋ก CSSOM์ ๋ง๋๋ ๊ณผ์ ์ผ๋ก Render Tree ์์ฑ์ ํ์ํ์ง๋ง, HTML ํ์ฑ ์์ฒด๋ฅผ ๋ง์ง๋ ์์ต๋๋ค. ๊ฐ/๋ผ๋ ์ฑ๋ฅ๊ณผ ๋ฌด๊ดํ ํญ๋ชฉ์ ๋๋ค.
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ:
<script>๋defer์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ์ '๋นจ๊ฐ๋ถ(STOP)' โ<link rel=stylesheet>๋ CSSOM ์์ฑ์ฉ์ผ๋ก<head>์๋จ์ ๋ฌ์ผ ์ ์.
Q2. ๋ธ๋ผ์ฐ์ ์ Critical Rendering Path ์์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ดํ ๊ฒ์?
- A) DOM โ Layout โ CSSOM โ Render Tree โ Paint โ Composite
- B) DOM + CSSOM โ Render Tree โ Layout โ Paint โ Composite
- ๊ฐ) DOM โ Paint โ Layout โ CSSOM โ Render Tree โ Composite
- ๋ผ) CSSOM โ DOM โ Paint โ Render Tree โ Layout โ Composite
โ ์ ๋ต: B
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : HTML์ ํ์ฑํด DOM์, CSS๋ฅผ ํ์ฑํด CSSOM์ ๋ง๋ค์ด์. ์ด ๋์ ํฉ์ณ ์ค์ ํ๋ฉด์ ํ์๋ ๋ ธ๋๋ง ๋ด์ Render Tree ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๊ทธ ๋ค์ ๊ฐ ๋ ธ๋์ ์์น์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ๋ Layout(Reflow), ํฝ์ ๋ก ์์น ํ๋ Paint, ๋ ์ด์ด๋ฅผ ํฉ์ฑํ๋ Composite ์์ผ๋ก ์งํ๋ผ์.
- ์ค๋ต ํผ๋๋ฐฑ: Layout ์ด์ ์ Render Tree ๊ฐ ๋ฐ๋์ ์์ด์ผ ํด์. Render Tree ์์ด๋ ๋ฌด์์ ์ด๋์ ๊ทธ๋ ค์ผ ํ ์ง ์ ์ ์๊ฑฐ๋ ์.
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "DOM + CSSOM = ๊ฒฐํผ โ Render Tree ์๋ โ ์๋ ์์น(Layout) โ ์์น (Paint) โ ์ฌ์ง ํฉ์ฑ(Composite)"
Q3. ์์ฒ ์ด์ ํ ์คํธ ํ์
์์ฒ ์ด๋ ์๋ก์ด ๊ธฐ๋ฅ์ผ๋ก ์ธ๋ถ ์ง๋ API๋ฅผ ์ฐ๋ํด์ผ ํ๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ์ฉ๋์ด ํฌ๊ณ ,
์ง๋๊ฐ ํ์๋๋ ํ์ด์ง์์๋ง ์ฌ์ฉ๋๋ค. ์์(PM)๋ "ํ ํ๋ฉด ๋ก๋ฉ์ด ๋๋ ค์ง๋ฉด ์ ๋๋ค"๊ณ ๋ชป ๋ฐ์๋ค.
์์ฒ ์ด๊ฐ<script src="map-api.js">๋ฅผ ์ ์ธํ ๋, ๊ฐ์ฅ ์ ์ ํ ๋ฐฉ๋ฒ์?
โ
์ ๋ต: <script src="map-api.js" defer></script> ๋ฅผ <head> ์ ์ ์ธํ๊ฑฐ๋, ์ง๋๊ฐ ํ์ํ ์์ ์ JavaScript๋ก ๋์ ๋ก๋
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
defer๋ฅผ ์ฐ๋ฉด HTML ํ์ฑ์ ๋ง์ง ์๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ก๋ํด์. DOM ํ์ฑ ์๋ฃ ํ ์์๋๋ก ์คํ๋๋ ์ง๋ ์ด๊ธฐํ๋ ์์ ํ๊ฒ ํ ์ ์์ต๋๋ค. ๋ ๋์๊ฐ ์ง๋ ํ์ด์ง์ ๋ฐฉ๋ฌธํ ๋๋ง ์คํฌ๋ฆฝํธ๋ฅผ ๋์ ์ผ๋ก ์ฝ์ ํ๋ฉด ํ ํ๋ฉด์๋ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋ถ๋ฌ์ฌ ์ ์์ด์. - ์ค๋ต ํผ๋๋ฐฑ: ์์ฒ ๋,
async๋ ํ์ฑ์ ์ ๋ง์ง๋ง ์คํ ์์ ๋ณด์ฅ์ด ์ ๋ผ์. ์ง๋ API์ฒ๋ผ DOM์ด ์์ฑ๋ ํ์ ์คํ๋ผ์ผ ํ๋ ์คํฌ๋ฆฝํธ์๋defer๊ฐ ๋ ์์ ํด์. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "์ฉ๋ ํฐ ์คํฌ๋ฆฝํธ = ๋ฐ๋์
defer๋๋ ๋์ ๋ก๋ (Dynamic Import)"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ ์ง์ง ๋๊ฐ ์
๊ทธ๋ ์ด๋๋ ๋๋์ด๋ค. ์ฌ์ค HTML์ ๋๋ฌด ์ฌ์ด ๊ฑฐ๋ผ ๋ฐ๋ก ๊ณต๋ถํ ๊ฒ ์๋ค๊ณ ์๊ฐํ๋๋ฐ, ํ์ฑ ๋ธ๋กํน์ด๋ผ๋ ๊ฐ๋
ํ๋๊ฐ ๋ด <script> ์ต๊ด ์ ์ฒด๋ฅผ ๋ ๋ ค๋ฒ๋ ธ๋ค. ์๊ฐํด๋ณด๋ฉด ๋๋ ๊ทธ๋ฅ "๋์๊ฐ๋ฉด OK" ์์ค์ด์๋ ๊ฑฐ์์. ์ํธ ๋ฆฌ๋ ๋์ด ๋ด ์ฝ๋ ๋ฆฌ๋ทฐ์์ "์ <head>์ defer ์๋ ์คํฌ๋ฆฝํธ๊ฐ ์ธ ๊ฐ์ฉ์ด๋ ์์ด์?" ๋ผ๋ ๋ง์ ๋ค์์ ๋ ์๋ฌด ๋ง๋ ๋ชป ํ๋ ๊ฒ ๋๋ฌด ์ฐฝํผํ๋ค.
๐ก "HTML์ ๋จ์ ๋งํฌ์ ์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ์์ ๊ณ์ฝ์๋ค.
<script>์์น ํ๋,defer์์ฑ ํ๋๊ฐ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ๋ณด๊ธฐ๊น์ง์ ์๊ฐ์ ์ข์ฐํ๋ค."
ํด๊ทผํ๋ฉด์ ์งํ์ฒ ์์ ๊ณ์ ๋จธ๋ฆฟ์์ผ๋ก ํ์ฑ ํ์ดํ๋ผ์ธ์ ๋์๊ฒจ๋ดค๋ค. DOM ํธ๋ฆฌ โ CSSOM ํธ๋ฆฌ โ Render Tree โ Layout โ Paint โ Composite. ์ด๊ฑธ ์ธ์์๊ฐ ์๋๋ผ ์ง์ง๋ก ์ดํดํ ๊ฒ ๊ฐ์์ ๊ธฐ๋ถ์ด ์ด์ํ๊ฒ ์ข๋ค. ์ง ๊ฐ์ Lighthouse ํ ๋ฒ ๋๋ ค๋ด์ผ๊ฒ ๋ค. Lighthouse ์ ์๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฑธ ์ง์ ๋ณด๊ณ ์ถ์ด!
๐ ๋ ์์๋ณด๊ธฐ