๐ŸŒ 01. HTML ๋ฉ˜ํƒˆ ๋ชจ๋ธ: '๊ทธ๋ƒฅ ํƒœ๊ทธ ์•„๋‹Œ๊ฐ€์š”?'์—์„œ ํƒˆ์ถœํ•˜๊ธฐ

2026๋…„ 3์›” 5์ผ ์ˆ˜์ •๋จ

๐Ÿ“‹ ๊ฐœ์š”

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 (๋ธ”๋กœํ‚น)์ฆ‰์‹œ์„ ์–ธ ์ˆœ์„œ์ ˆ๋Œ€ ๋น„์ถ”์ฒœ
deferXDOM ํŒŒ์‹ฑ ์™„๋ฃŒ ํ›„์„ ์–ธ ์ˆœ์„œ ๋ณด์žฅ์•ฑ ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ
asyncX๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ ์ฆ‰์‹œ์ˆœ์„œ ๋ณด์žฅ ์•ˆ๋จ๋…๋ฆฝ์ ์ธ ๋ถ„์„ ์Šคํฌ๋ฆฝํŠธ

๐Ÿ—๏ธ 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๋…„ ์ฐจ์˜ ์„ค๋ช…
DOMHTML์˜ ๊ฐ์ฒด ๋ณ€ํ™˜๋ณธ๋ธŒ๋ผ์šฐ์ € ํŒŒ์„œ๊ฐ€ 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 ์ ์ˆ˜๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฑธ ์ง์ ‘ ๋ณด๊ณ  ์‹ถ์–ด!


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ