ex) λΈŒλΌμš°μ €κ°€ ~μ½λŠ”λ²•

λ³Έ 글은 ν…ŒμŠ€νŠΈ λ¬Έμ„œ μž…λ‹ˆλ‹€.

Profile Picture
seoungin
2023-02-24

이런 λΆ„λ“€κ»˜ 이 글을 μΆ”μ²œν•©λ‹ˆλ‹€.

  1. 이미 λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ λ™μž‘μ— λŒ€ν•΄ "기초적인" 지식이 μžˆμœΌμ‹  λΆ„
  2. λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ • 쀑 Parsing에 집쀑 해보고 싢은 λΆ„

이 κΈ€μ˜ μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. μ„œλ¬Έ
  2. HTML Parsing 방법
  3. CSS Parsing 방법
  4. DOM and CSSOM

ν˜Ήμ‹œλ‚˜ λΉ λ₯΄κ²Œ ν›‘μ–΄λ³΄κ³ λ§Œ μ‹Άλ‹€λ©΄, μ‹€μ œλ‘œ parsing의 예제λ₯Ό 담은 Tokenization Example만 보셔도 μ’‹μŠ΅λ‹ˆλ‹€! (우츑의 λͺ©μ°¨λ‘œ μ΄λ™ν•΄μ£Όμ„Έμš”!)

1. μ„œλ¬Έ

λ©΄μ ‘κ΄€ : μ£Όμ†Œμ°½μ— www.google.com을 μž…λ ₯ν–ˆμ„λ•Œ μΌμ–΄λ‚˜λŠ” 과정에 λŒ€ν•΄μ„œ μ„€λͺ…ν•΄λ³΄μ„Έμš”.

λ‹€μŒκ³Ό 같은 μ§ˆλ¬Έμ„ μ–Όλ§ˆλ‚˜ 많이 λ“€μ–΄λ³΄μ…¨λ‚˜μš”? 정말 λ§Žμ€ κΈ€μ—μ„œλ„ κ°•μ‘°λ˜κ³  μ–ΈκΈ‰λ˜λŠ” 만큼 μ›Ήκ°œλ°œμžμ—κ²Œ μ€‘μš”ν•œ 질문으둜 자리작고 μžˆμŠ΅λ‹ˆλ‹€.

Rendering Engine이 λ™μž‘ν•˜μ—¬ 화면에 google을 κ·Έλ¦¬λŠ” 과정을 ν‘œμ‹œν•œ 도식도 μž…λ‹ˆλ‹€.

저도 λ§ˆμ°¬κ°€μ§€λ‘œ μ›Ή κ°œλ°œμžλ‘œμ„œ 정말 μ—¬λŸ¬λ²ˆ λ§ˆμ£Όν•˜λŠ” κ°œλ…μ΄μ—ˆλŠ”λ°μš”. ν•œλ²ˆ κ³΅λΆ€ν•˜λŠ”κΉ€μ— μ œλŒ€λ‘œ 곡뢀λ₯Ό 진행해보고 μ‹Άμ–΄. 이번 κΈ°νšŒμ— μ˜€λ‘œμ§€ Parsing만 λ‹΄μ•„μ„œ ν•™μŠ΅μ„ 진행해보렀 ν•©λ‹ˆλ‹€.

λΆ€μŠ€νŠΈμΊ ν”„ κΈ°κ°„μ€‘μ—μ„œλ„ Parsing에 λŒ€ν•΄ κ³΅λΆ€ν–ˆλ˜ 기얡을 더듬어 κ°€λ©΄ μ’‹κ² λ‹€ μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€!

깊이 μžˆλŠ” ν•™μŠ΅μ„ μ§„ν–‰ν•˜κΈ° μœ„ν•΄μ„œ 이번 글은 μ˜€λ‘œμ§€ Parsing λ§Œμ„ λ‹΄μŠ΅λ‹ˆλ‹€. μ œκ°€ 찾을 수 μžˆλŠ” λ²”μœ„ λ‚΄μ—μ„œ λΈŒλΌμš°μ €κ°€ Parsing을 ν•˜λŠ” λ‚΄μš©μ„ μ΅œλŒ€ν•œ λ‹΄μ•„λ³΄μ•˜μœΌλ‹ˆ 잘 λ΄μ£Όμ‹œκΈΈ λ°”λžλ‹ˆλ‹€!

2. HTML Parsing

HTML은 HyperText Markup Language의 μ•½μžλ‘œ, μ›Ήμ˜ κΈ°λ°˜μ„ 이루며 μ›Ή νŽ˜μ΄μ§€μ— ꡬ쑰와 의미λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. HTML νŒŒμ‹±μ˜ λ‚΄λΆ€ μž‘λ™ 원리λ₯Ό μ΄ν•΄ν•˜λŠ” 것은 μ›Ή μ½˜ν…μΈ λ₯Ό ν”„λ‘œκ·Έλž˜λ°μ μœΌλ‘œ 생성, 뢄석, λ˜λŠ” μˆ˜μ •ν•˜κ³ μž ν•˜λŠ” κ°œλ°œμžμ™€ λ””μžμ΄λ„ˆμ—κ²Œ ν•„μˆ˜μ μž…λ‹ˆλ‹€.

HTML Parsing 과정은 μ›Ή κ°œλ°œμ— μžˆμ–΄μ„œ λ‹Ήμ—°νžˆ ν•„μˆ˜μ μΈ λΆ€λΆ„μž…λ‹ˆλ‹€. 이 과정을 ν†΅ν•΄μ„œ μ›Ή νŽ˜μ΄μ§€λ₯Ό 읽어내어 λ‚΄κ°€ μ›ν•˜λŠ” 정보λ₯Ό μΆ”μΆœν•˜κ³  κ·Έ λ‚΄μš©μ„ ν™œμš©ν•˜κ³€ ν•©λ‹ˆλ‹€. ν˜Ήμ€ κ²€μƒ‰μ—”μ§„μ—κ²Œ λ…ΈμΆœλ˜λ„λ‘ ν•˜λŠ” κ³Όμ •μ—μ„œλ„ μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 이 κΈ€μ—μ„œ λ‹€λ£¨λŠ” 과정은 였히렀 λ°˜λŒ€μž…λ‹ˆλ‹€.

λΈŒλΌμš°μ €λŠ” HTML Parserλ₯Ό ν†΅ν•΄μ„œ HTML을 읽어내고 κ·Έ ꡬ쑰와 의미λ₯Ό λΆ„μ„ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. 기본적으둜 HTML νŒŒμ‹±μ€ HTML λ¬Έμ„œλ₯Ό ꡬ성 μš”μ†Œλ‘œ λΆ„ν•΄ν•˜κ³  Document Object Model (DOM) 을 κ΅¬μ„±ν•˜λŠ” 과정을 ν¬ν•¨ν•©λ‹ˆλ‹€.

ν•΄λ‹Ή λ‹¨λ½μ—μ„œλŠ”, HTML의 νŒŒμ‹±κ³Όμ •μ„ μžμ„Ένžˆ μ‚΄νŽ΄λ³Ό μ˜ˆμ •μž…λ‹ˆλ‹€.

μ•„λž˜μ˜ 과정은 λŒ€ν‘œμ μœΌλ‘œ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. HTML 의 기본적인 ꡬ쑰에 λŒ€ν•΄μ„œ μ΄ν•΄ν•˜κΈ°
  2. HTML Parsing 과정에 λŒ€ν•΄μ„œ μ΄ν•΄ν•©λ‹ˆλ‹€. (tokenization , tree construction)

1. basic HTML document

HTML Parsing 과정을 μ΄ν•΄ν•˜κΈ° 전에 기초적인 HTML을 λ¨Όμ € μ΄ν•΄ν•©λ‹ˆλ‹€.

HTML은 μ›Ή νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ ν‘œμ€€ λ§ˆν¬μ—… μ–Έμ–΄μž…λ‹ˆλ‹€. HTML은 μ›Ή νŽ˜μ΄μ§€μ˜ ꡬ쑰λ₯Ό μ •μ˜ν•˜κ³ , ν…μŠ€νŠΈ, 이미지, 링크, 폼, λ²„νŠΌ λ“± μ›Ή νŽ˜μ΄μ§€μ— ν‘œμ‹œλ˜λŠ” λ‹€μ–‘ν•œ μš”μ†Œλ₯Ό λ°°μΉ˜ν•˜κ³  μŠ€νƒ€μΌλ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

HTML은 'νƒœκ·Έ'라고 λΆˆλ¦¬λŠ” κΊΎμ‡  κ΄„ν˜Έ(<>)둜 λ‘˜λŸ¬μ‹ΈμΈ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ ꡬ쑰λ₯Ό λ§Œλ“­λ‹ˆλ‹€. μ΄λŸ¬ν•œ νƒœκ·ΈλŠ” λŒ€κ²Œ μ‹œμž‘ νƒœκ·Έμ™€ μ’…λ£Œ νƒœκ·Έλ‘œ κ΅¬μ„±λ˜λ©°, κ·Έ 사이에 μ›Ή νŽ˜μ΄μ§€μ˜ μ‹€μ œ λ‚΄μš©μ΄ λ“€μ–΄κ°‘λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, <p>λŠ” 단락(paragraph)을 μ‹œμž‘ν•˜λŠ” νƒœκ·Έμ΄κ³ , </p>λŠ” 단락을 λλ‚΄λŠ” νƒœκ·Έμž…λ‹ˆλ‹€.

HTML λ¬Έμ„œλŠ” λΈŒλΌμš°μ €μ— μ˜ν•΄ ν•΄μ„λ˜μ–΄ μ‚¬μš©μžμ—κ²Œ μ›Ή νŽ˜μ΄μ§€μ˜ ν˜•νƒœλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€.

<!DOCTYPE html>
<!-- λ¬Έμ„œ νƒ€μž… μ„ μ–Έ (DOCTYPE): HTML5λ₯Ό 의미 -->
<html>
	<!-- HTML: 루트 μš”μ†Œ -->

	<head>
		<!-- Head: 메타데이터 λΆ€λΆ„ -->
		<meta charset="UTF-8" />
		<!-- 문자 인코딩 -->
		<title>νŽ˜μ΄μ§€ 제λͺ©</title>
		<!-- νŽ˜μ΄μ§€ 제λͺ© -->
		<link rel="stylesheet" type="text/css" href="styles.css" />
		<!-- μ—°κ²°λœ μŠ€νƒ€μΌμ‹œνŠΈ -->
		<script src="script.js"></script>
		<!-- μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 -->
	</head>

	<body>
		<!-- Body: μ‹€μ œ λ³΄μ΄λŠ” λ‚΄μš© -->
		<h1>제λͺ©</h1>
		<!-- 제λͺ© -->
		<p>λ‹¨λ½μž…λ‹ˆλ‹€.</p>
		<!-- 단락 -->

		<img src="image.jpg" alt="이미지 μ„€λͺ…" />
		<!-- 이미지 -->

		<a href="https://www.example.com">링크</a>
		<!-- 링크 -->

		<!-- 기타 μš”μ†Œ -->
	</body>
</html>

  • <!DOCTYPE html>: HTML5 λ¬Έμ„œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” DOCTYPE μ„ μ–Έμž…λ‹ˆλ‹€.

  • <html>: HTML λ¬Έμ„œμ˜ 루트 μš”μ†Œμž…λ‹ˆλ‹€. λͺ¨λ“  λ‹€λ₯Έ HTML μš”μ†ŒλŠ” 이 νƒœκ·Έ 내뢀에 μœ„μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • <head>: 이 λΆ€λΆ„μ—λŠ” νŽ˜μ΄μ§€μ˜ 메타데이터가 λ“€μ–΄κ°‘λ‹ˆλ‹€. μ˜ˆλ‘œλŠ” νŽ˜μ΄μ§€ 제λͺ©, 문자 인코딩, μ™ΈλΆ€ μŠ€νƒ€μΌμ‹œνŠΈμ™€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 등이 μžˆμŠ΅λ‹ˆλ‹€.

  • <body>: 이 λΆ€λΆ„μ—λŠ” μ›Ή νŽ˜μ΄μ§€μ˜ μ‹€μ œλ‘œ λ³΄μ΄λŠ” λ‚΄μš©μ΄ λ“€μ–΄κ°‘λ‹ˆλ‹€. μ˜ˆλ‘œλŠ” ν…μŠ€νŠΈ, 이미지, 링크, 제λͺ©, 단락 등이 μžˆμŠ΅λ‹ˆλ‹€.

μ΄μ œλŠ” 본격적으둜 HTML Parsing Process에 λŒ€ν•΄μ„œ ν•™μŠ΅ν•˜κ² μŠ΅λ‹ˆλ‹€.

HTML Parsing Process

HTML Parsing은 HTML documentλ₯Ό λΆ„μ„ν•˜κ³  κ·Έ ꡬ쑰적인 ꡬ성 μš”μ†ŒμΈ tag, attrivutes, contentλ₯Ό μΆ”μΆœν•˜μ—¬ μ˜λ―ΈμžˆλŠ” model을 λ§Œλ“€μ–΄λƒ…λ‹ˆλ‹€. 즉 DOM(Document Object Model) λ₯Ό μƒμ„±ν•΄λƒ…λ‹ˆλ‹€.

HTML Parsing Process의 일련의 과정을 담은 도식도 μž…λ‹ˆλ‹€

1. HTML Token

Tokenization 은 HTML νŒŒμ‹± κ³Όμ •μ—μ„œ κ°€μž₯ 기본적인 λ‹¨κ³„μž…λ‹ˆλ‹€. raw HTML을 token이라고 λΆˆλ¦¬λŠ” 더 μž‘μ€ λ‹¨μœ„λ‘œ λΆ„ν•΄ν•˜λŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. 토큰은 HTML λ¬Έμ„œλ₯Ό κ΅¬μ„±ν•˜λŠ” κ°œλ³„μ μΈ μš”μ†Œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 즉 token은 documnet 의 μ΅œμ†Œν•œμ˜ κ°€μΉ˜λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

μ›μ‹œ(λ˜λŠ” raw) HTML μ½”λ“œλž€? μ›Ή λΈŒλΌμš°μ €μ— μ˜ν•΄ 아직 μ²˜λ¦¬λ˜μ§€ μ•Šμ€, 원본 μƒνƒœμ˜ HTML μ½”λ“œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” HTML λ¬Έμ„œλ₯Ό κ΅¬μ„±ν•˜λŠ” νƒœκ·Έ, 속성, ν…μŠ€νŠΈ 등이 ν¬ν•¨λ˜μ–΄ μžˆλŠ” 초기 ν˜•νƒœμ˜ μ½”λ“œμž…λ‹ˆλ‹€. μ›μ‹œ HTML μ½”λ“œλŠ” 일반적으둜 ν…μŠ€νŠΈ μ—λ””ν„°λ‚˜ μ½”λ“œ μ—λ””ν„°μ—μ„œ λ³Ό 수 있으며, μ›Ή λΈŒλΌμš°μ €μ˜ "νŽ˜μ΄μ§€ μ†ŒμŠ€ 보기" μ˜΅μ…˜μ„ ν†΅ν•΄μ„œλ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. μ›μ‹œ HTML μ½”λ“œλŠ” νŒŒμ‹± 과정을 톡해 λΈŒλΌμš°μ €μ— μ˜ν•΄ ν•΄μ„λ˜κ³ , 이후에 μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ§€λŠ” μ›Ή νŽ˜μ΄μ§€μ˜ ꡬ쑰와 λ‚΄μš©μ„ ν˜•μ„±ν•©λ‹ˆλ‹€. 이 μ½”λ“œλŠ” 직접 μž‘μ„±λ  μˆ˜λ„ 있고, μ„œλ²„μ—μ„œ λ™μ μœΌλ‘œ μƒμ„±λ˜μ–΄ ν΄λΌμ΄μ–ΈνŠΈμ— 전솑될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

HTML Tokenization은 λ‹€μŒκ³Ό 같은 과정을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

HTML μ½”λ“œλ₯Ό ν† ν°μœΌλ‘œ λΆ„ν•΄ν•˜κΈ°

토큰화 κ³Όμ • 쀑 HTML μ½”λ“œλ₯Ό λ¬Έμžλ‹¨μœ„λ‘œ μŠ€μΊ”ν•˜μ—¬ νŒ¨ν„΄μ„ μ‹λ³„ν•˜κ³  λ‹€μ–‘ν•œ μœ ν˜•μ˜ 토큰을 인식할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ•Œ Parsing Algorithm은 μ½”λ“œλ₯Ό λΆ„μ„ν•˜λ©° token idetification 을 ν†΅ν•΄μ„œ νŠΉμ • λ¬Έμžμ™€ μˆœμ„œλ₯Ό μ°Ύμ•„ λƒ…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄μ„œ <λ₯Ό λ§Œλ‚˜λ©΄ νƒœκ·Έμ˜ μ‹œμž‘μ„ ν‘œμ‹œν•˜κ³  μ΄λŠ” ν† ν°μ˜ 쑴재λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ HTML μ½”λ“œλŠ” 순차적으둜 λΆ„μ„λ˜λ©° νŒŒμ„œκ°€ 토큰을 λ™μ μœΌλ‘œ μ‹λ³„ν•˜λŠ” μˆœκ°„ μ½”λ“œμ—μ„œ λΆ„λ¦¬ν•©λ‹ˆλ‹€. 이 과정은 전체 HTML μ½”λ“œκ°€ 토큰화 λ λ•Œ κΉŒμ§€ μ§„ν–‰λ©λ‹ˆλ‹€.

ν† ν°μ˜ μ’…λ₯˜

  • <tag> : μ‹œμž‘ νƒœκ·ΈλŠ” HTML μš”μ†Œμ˜ μ‹œμž‘μ„ λ‚˜νƒ€λ‚΄λ©° <tag> λ¬Έλ²•μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, <p>λŠ” λ‹¨λ½μ˜ μ‹œμž‘ νƒœκ·Έλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ‹œμž‘ νƒœκ·ΈλŠ” μš”μ†Œ μœ ν˜•μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•˜κ³  속성을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • </tag> : μ’…λ£Œ νƒœκ·ΈλŠ” HTML μš”μ†Œμ˜ μ’…λ£Œλ₯Ό λ‚˜νƒ€λ‚΄λ©° </tag> λ¬Έλ²•μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, </p>λŠ” 단락 μš”μ†Œμ˜ μ’…λ£Œ νƒœκ·Έλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ’…λ£Œ νƒœκ·ΈλŠ” μ‹œμž‘ νƒœκ·Έμ— μ˜ν•΄ μ •μ˜λœ ꡬ쑰λ₯Ό λ°˜μ˜ν•˜λ©° λ¬Έμ„œμ˜ 계측적 ꡬ쑰에 κΈ°μ—¬ν•©λ‹ˆλ‹€.

  • <tag /> : 일뢀 HTML μš”μ†ŒλŠ” 자체적으둜 μ’…λ£Œλ  수 있으며 λ³„λ„μ˜ μ’…λ£Œ νƒœκ·Έκ°€ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 자체 μ’…λ£Œ νƒœκ·ΈλŠ” '' λ¬Έλ²•μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, '
    'λŠ” 쀄 λ°”κΏˆ νƒœκ·Έλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 자체 μ’…λ£Œ νƒœκ·ΈλŠ” 일반적으둜 λ‚΄μš©μ΄ μ—†κ±°λ‚˜ νŠΉλ³„ν•œ μ²˜λ¦¬κ°€ ν•„μš”ν•œ μš”μ†Œμ— μ‚¬μš©λ©λ‹ˆλ‹€.

  • Text : ν…μŠ€νŠΈ 토큰은 HTML μš”μ†Œ λ‚΄μ˜ 문자 λ‚΄μš©μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 이듀은 일반 ν…μŠ€νŠΈ, λ¬Έμžμ—΄ λ˜λŠ” νƒœκ·Έλ‚˜ λ‹€λ₯Έ νŠΉλ³„ν•œ ν† ν°μ˜ 일뢀가 μ•„λ‹Œ 문자 μˆœμ„œλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. ν…μŠ€νŠΈ 토큰은 HTML λ¬Έμ„œμ˜ λ³΄μ΄λŠ” λ‚΄μš©μ— κΈ°μ—¬ν•©λ‹ˆλ‹€.

  • 주석 : HTML 주석은 μ½”λ“œ 내에 λ…ΈνŠΈλ‚˜ 주석을 μΆ”κ°€ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” ν† ν°μž…λ‹ˆλ‹€.

  • DOCTYPE : DOCTYPE 토큰은 λ¬Έμ„œ μœ ν˜• 선언을 λ‚˜νƒ€λ‚΄λ©° μ‚¬μš©λ˜λŠ” HTML 버전에 λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 이것은 HTML λ¬Έμ„œμ˜ μ‹œμž‘ λΆ€λΆ„μ—μ„œ νŠΉμ • λ¬Έλ²•μœΌλ‘œ ν‘œμ‹œλ©λ‹ˆλ‹€. DOCTYPE 토큰은 λ¬Έμ„œκ°€ λΈŒλΌμš°μ €λ‚˜ νŒŒμ„œμ— μ˜ν•΄ μ˜¬λ°”λ₯΄κ²Œ ν•΄μ„λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

μ—¬κΈ°κΉŒμ§€ Tokenization κ³Ό Token의 μ’…λ₯˜μ— λŒ€ν•΄μ„œ ν•™μŠ΅μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ Tokenzation Algorithm에 λŒ€ν•΄μ„œ ν•™μŠ΅μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

2. Tokenization Algorithm

Tokenization Algorithm 은 HTML νŒŒμ‹± κ³Όμ • μ€‘μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ 단계 μž…λ‹ˆλ‹€. 이 κ³Όμ •μ€‘μ—μ„œ νŒŒμ‹± 도쀑 λ‹€μ–‘ν•œ μœ ν˜•μ˜ 토큰을 μ‹λ³„ν•˜κ³  μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 논리λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

1. λ³€μˆ˜μ™€ 데이터 μ΄ˆκΈ°ν™”

이 λ‹¨κ³„μ—μ„œ νŒŒμ„œλŠ” 토큰화 도쀑 μƒμ„±λœ 토큰을 μ €μž₯ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ λ³€μˆ˜μ™€ 데이터 ꡬ쑰λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. μ΄λŠ” λ°°μ—΄, μ—°κ²° 리슀트 λ˜λŠ” λ‹€λ₯Έ μ μ ˆν•œ 데이터 ꡬ쑰λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 것을 포함할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ•Œκ³ λ¦¬μ¦˜μ€ νŒŒμ‹± 과정을 μΆ”μ ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ ν”Œλž˜κ·Έλ‚˜ μƒνƒœ λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν”Œλž˜κ·ΈλŠ” νŠΉμ • 쑰건을 λ‚˜νƒ€λ‚΄κ±°λ‚˜ μ•Œκ³ λ¦¬μ¦˜μ˜ 흐름을 μ œμ–΄ν•˜λŠ” 데 μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. Tokenization Algorithm은 μƒνƒœμƒνƒœ 기계(State Machine)λ₯Ό λ°”νƒ•μœΌλ‘œ μ„€λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. HTML λ¬Έμ„œλ₯Ό μ½μœΌλ©΄μ„œ Data state,Tag open stateλΌλŠ” 두가지 μƒνƒœλ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. μ΄ˆκΈ°μƒνƒœλŠ” Data state둜 μ΄ˆκΈ°ν™” λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

2. HTML μ½”λ“œ μŠ€μΊ” μ‹œμž‘:

HTML μ½”λ“œλŠ” 첫 번째 λ¬ΈμžλΆ€ν„° μŠ€μΊ”μ„ μ‹œμž‘ν•˜μ—¬ 토큰화 과정을 μ‹œμž‘ν•©λ‹ˆλ‹€. νŒŒμ„œλŠ” μ½”λ“œμ˜ 각 문자λ₯Ό κ²€μ‚¬ν•˜μ—¬ HTML κ΅¬μ‘°μ—μ„œμ˜ 역할을 λΆ„μ„ν•©λ‹ˆλ‹€.

3. 토큰 경계 식별:

이 λ‹¨κ³„μ—μ„œ 토큰화 μ•Œκ³ λ¦¬μ¦˜μ€ νŠΉμ • 문자 νŒ¨ν„΄κ³Ό μ‹œν€€μŠ€λ₯Ό 기반으둜 λ‹€μ–‘ν•œ μœ ν˜•μ˜ 토큰을 μΈμ‹ν•˜κ³  κ΅¬λΆ„ν•©λ‹ˆλ‹€. μ•Œκ³ λ¦¬μ¦˜μ€ ν† ν°μ˜ 경계λ₯Ό μ‹λ³„ν•˜κ³  생성될 ν† ν°μ˜ μœ ν˜•μ„ κ²°μ •ν•©λ‹ˆλ‹€. <λ₯Ό λ§Œλ‚˜κ²Œ 되면, Tag open state μƒνƒœλ‘œ λ³€κ²½λ©λ‹ˆλ‹€. 그리고 μ—¬λŸ¬ λ¬Έμžμ—΄μ„ μ§€λ‚˜μΉ˜κ²Œ λ˜μ§€λ§Œ >문자λ₯Ό λ§Œλ‚ λ•Œ κΉŒμ§€ μƒνƒœλ₯Ό λ³€ν™”ν•˜μ§€ μ•Šλ‹€κ°€ >문자λ₯Ό λ§Œλ‚˜κ³  λ‚˜μ„œ stateλ₯Ό λ‹€μ‹œ Data state둜 λ³€κ²½ν•˜κ³ , 기쑴의 <``>λ₯Ό ν†΅ν•΄μ„œ λ§Œλ“€μ–΄μ§€κ²Œ 된 μ˜μ—­μ€ Tokenization이 μ§„ν–‰λ©λ‹ˆλ‹€.

4. μ‹œμž‘ νƒœκ·Έ 처리:

μ•Œκ³ λ¦¬μ¦˜μ΄ < 문자λ₯Ό κ°μ§€ν•˜λ©΄ μ΄μ–΄μ§€λŠ” λ¬Έμžκ°€ μ‹œμž‘ νƒœκ·Έλ₯Ό λ‚˜νƒ€λ‚΄λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ κ²€μ‚¬ν•©λ‹ˆλ‹€. νƒœκ·Έ 이름과 κ΄€λ ¨λœ μ–΄νŠΈλ¦¬λ·°νŠΈλŠ” HTML μ½”λ“œμ—μ„œ μΆ”μΆœλ©λ‹ˆλ‹€. μ‹œμž‘ νƒœκ·Έ 토큰이 μƒμ„±λ˜μ–΄ νƒœκ·Έ 이름과 μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό ν¬ν•¨ν•˜λ©°, 토큰 데이터 ꡬ쑰에 μ €μž₯λ©λ‹ˆλ‹€.

5. μ’…λ£Œ νƒœκ·Έ 처리:

</ μ‹œν€€μŠ€λ₯Ό λ§Œλ‚˜λ©΄ μ•Œκ³ λ¦¬μ¦˜μ€ μ΄μ–΄μ§€λŠ” 문자λ₯Ό μ’…λ£Œ νƒœκ·Έλ‘œ ν•΄μ„ν•©λ‹ˆλ‹€. νƒœκ·Έ 이름은 μ½”λ“œμ—μ„œ μΆ”μΆœλ©λ‹ˆλ‹€. μ’…λ£Œ νƒœκ·Έ 토큰이 μƒμ„±λ˜μ–΄ νƒœκ·Έ 이름을 ν¬ν•¨ν•˜λ©°, 토큰 데이터 ꡬ쑰에 μΆ”κ°€λ©λ‹ˆλ‹€.

6. 자체 μ’…λ£Œ νƒœκ·Έ 처리:

μ•Œκ³ λ¦¬μ¦˜μ΄ 자체 μ’…λ£Œ νƒœκ·Έ, 예λ₯Ό λ“€μ–΄ <br/>을 λ§Œλ‚˜λ©΄, 자체 μ’…λ£Œ νƒœκ·Έ 토큰을 μƒμ„±ν•©λ‹ˆλ‹€. 자체 μ’…λ£Œ νƒœκ·Έμ™€ κ΄€λ ¨λœ λͺ¨λ“  μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ 토큰에 ν¬ν•¨λ©λ‹ˆλ‹€. 자체 μ’…λ£Œ νƒœκ·Έ 토큰이 토큰 데이터 ꡬ쑰에 μΆ”κ°€λ©λ‹ˆλ‹€.

7. ν…μŠ€νŠΈ λ‚΄μš© 처리:

νƒœκ·Έλ‚˜ νŠΉλ³„ν•œ μ‹œν€€μŠ€μ˜ 일뢀가 μ•„λ‹Œ λ¬ΈμžλŠ” ν…μŠ€νŠΈ λ‚΄μš©μœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€. μ•Œκ³ λ¦¬μ¦˜μ€ μ—°μ†λœ 문자λ₯Ό ν…μŠ€νŠΈ ν† ν°μœΌλ‘œ μˆ˜μ§‘ν•˜κ³  토큰 데이터 ꡬ쑰에 μ €μž₯ν•©λ‹ˆλ‹€. μ•Œκ³ λ¦¬μ¦˜μ€ ν•„μš”μ— 따라 ν…μŠ€νŠΈ λ‚΄μš© λ‚΄μ˜ 곡백, 쀄 λ°”κΏˆ, 및 기타 ν…μŠ€νŠΈ μ„œμ‹μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

8. 주석 처리:

μ•Œκ³ λ¦¬μ¦˜μ΄ <!-- μ‹œν€€μŠ€λ₯Ό κ°μ§€ν•˜λ©΄ μ΄μ–΄μ§€λŠ” 문자λ₯Ό μ£Όμ„μœΌλ‘œ μΈμ‹ν•©λ‹ˆλ‹€. μ£Όμ„μ˜ λ‚΄μš©μ€ μΆ”μΆœλ©λ‹ˆλ‹€. 주석 토큰이 μƒμ„±λ˜μ–΄ 주석 λ‚΄μš©μ„ ν¬ν•¨ν•˜λ©°, 토큰 데이터 ꡬ쑰에 μΆ”κ°€λ©λ‹ˆλ‹€.

9. DOCTYPE μ„ μ–Έ 처리:

μ•Œκ³ λ¦¬μ¦˜μ€ HTML λ¬Έμ„œμ˜ μ‹œμž‘ λΆ€λΆ„μ—μ„œ DOCTYPE 선언을 μ‹λ³„ν•˜κ³  μΆ”μΆœν•©λ‹ˆλ‹€. DOCTYPE 토큰은 μ‚¬μš©λ˜λŠ” HTML 버전에 λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. DOCTYPE 토큰이 μƒμ„±λ˜μ–΄ κ΄€λ ¨ 정보λ₯Ό ν¬ν•¨ν•˜λ©°, 토큰 데이터 ꡬ쑰에 μ €μž₯λ©λ‹ˆλ‹€.

10. HTML μ½”λ“œ 계속 μŠ€μΊ”:

각 토큰을 μ²˜λ¦¬ν•œ 후에 μ•Œκ³ λ¦¬μ¦˜μ€ HTML μ½”λ“œλ₯Ό 계속 μŠ€μΊ”ν•˜λ©°, λ‹€μŒ 문자둜 μ΄λ™ν•˜κ³  토큰화 κ·œμΉ™μ„ 기반으둜 ν‰κ°€ν•©λ‹ˆλ‹€. 이 과정은 전체 HTML μ½”λ“œκ°€ μŠ€μΊ”λ˜κ³  토큰화될 λ•ŒκΉŒμ§€ λ°˜λ³΅λ©λ‹ˆλ‹€.

Tokenization Example

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‘œ Tokenization에 λŒ€ν•΄μ„œ ν•™μŠ΅μ„ 마무리 지어 λ³΄κ² μŠ΅λ‹ˆλ‹€.

<html>
	<head>
		<title>My Web Page</title>
	</head>
	<body>
		<p>Welcome to my web page.</p>
	</body>
</html>

처음 λ¬Έμ„œλ₯Ό 읽기 μ‹œμž‘ν•˜λ©°, 초기 μƒνƒœλŠ” Data stateμ˜€μ§€λ§Œ, <λ₯Ό λ§Œλ‚˜ Tag open state μƒνƒœλ‘œ λ³€κ²½λ©λ‹ˆλ‹€. κ·Έ 이후 >λ₯Ό λ§Œλ‚ λ•Œ κΉŒμ§€ Tag open state μƒνƒœλ₯Ό μœ μ§€ν•˜λ‹€κ°€ >λ₯Ό λ§Œλ‚˜ λ‹€μ‹œ Data state둜 λ³€κ²½λ©λ‹ˆλ‹€. λ˜ν•œ Tag open stateκ³Όμ •μ—μ„œ parsing된 <html> μ΄λΌλŠ” λ¬Έμžμ—΄μ€ Tokenization 이 μ§„ν–‰λ©λ‹ˆλ‹€.

μ•„λž˜λŠ” μœ„μ˜ 과정을 κ±°μ³μ„œ μƒμ„±λœ Token λ“€ μž…λ‹ˆλ‹€.

  1. μ‹œμž‘ νƒœκ·Έ 토큰: <html>
  2. μ‹œμž‘ νƒœκ·Έ 토큰: <head>
  3. μ‹œμž‘ νƒœκ·Έ 토큰: <title>
  4. ν…μŠ€νŠΈ 토큰: "My Web Page"
  5. μ’…λ£Œ νƒœκ·Έ 토큰: </title>
  6. μ’…λ£Œ νƒœκ·Έ 토큰: </head>
  7. μ‹œμž‘ νƒœκ·Έ 토큰: <body>
  8. μ‹œμž‘ νƒœκ·Έ 토큰: <p>
  9. ν…μŠ€νŠΈ 토큰: "Welcome to my web page."
  10. μ’…λ£Œ νƒœκ·Έ 토큰: </p>
  11. μ’…λ£Œ νƒœκ·Έ 토큰: </body>
  12. μ’…λ£Œ νƒœκ·Έ 토큰: </html>

μ§€κΈˆκΉŒμ§€ HTML documentλ₯Ό Tokenization Algorithm에 λŒ€ν•΄μ„œ ν•™μŠ΅μ„ μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή 토큰듀은 κ²°κ΅­ DOM(Document Object Model)을 μƒμ„±ν•˜λŠ” 발판이 λ˜μ–΄ μ€λ‹ˆλ‹€.

이제 μ§€κΈˆκΉŒμ§€ μƒμ„±ν•œ Token듀을 톡해 Treeλ₯Ό λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€.

3. Tree Construction (1)

Tree Construction은 HTML νŒŒμ‹±κ³Όμ • μ€‘μ—μ„œ κ°€μž₯ μ€‘μš”ν•œ λ‹¨κ³„μž…λ‹ˆλ‹€. HTML μ½”λ“œκ°€ 토큰화 되고 νŠΈν°λ“€μ΄ λͺ¨λ‘ μ€€λΉ„κ°€ λ˜μ—ˆλ‹€λ©΄, 트리λ₯Ό κ΅¬μ„±ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ€ μ΄λŸ¬ν•œ 토큰듀을 κ°€μ Έμ™€μ„œ Tree Construction 을 μ§„ν–‰ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ λ§Œλ“€μ–΄μ§„ 것을 DOM(Document Object Model) 이라고 ν•©λ‹ˆλ‹€. DOM tree λŠ” HTML λ¬Έμ„œλ₯Ό Pasing ν•˜κ³  이λ₯Ό μ˜λ―ΈμžˆλŠ” λ‹¨μœ„μ˜ 집합 (Token)으둜 λ³€ν™”μ‹œν‚¨ λ’€ , 이λ₯Ό 톡해 계측적인 ꡬ쑰둜 λ§Œλ“€μ–΄ λƒ…λ‹ˆλ‹€!

μ΄μ œλΆ€ν„° ꡬ체적으둜 Dom treeλ₯Ό λ§Œλ“€μ–΄ λ‚΄λŠ” 과정에 λŒ€ν•΄μ„œ ν•™μŠ΅μ„ μ§„ν–‰ν•©λ‹ˆλ‹€.

DOM tree의 rootλ₯Ό 생성

트리 ꡬ성 κ³Όμ •μ˜ μ‹œμž‘μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ€ DOM 트리의 루트 λ…Έλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 루트 λ…Έλ“œλŠ” 전체 HTML λ¬Έμ„œλ₯Ό λŒ€ν‘œν•©λ‹ˆλ‹€. 이것은 DOM 트리의 계측적 ꡬ쑰λ₯Ό κ΅¬μ„±ν•˜κΈ° μœ„ν•œ μ‹œμž‘μ μœΌλ‘œ μž‘μš©ν•©λ‹ˆλ‹€.

child Node 생성

μ•Œκ³ λ¦¬μ¦˜μ΄ 토큰화 κ³Όμ •μ—μ„œ μƒμ„±λœ 토큰듀을 μˆœνšŒν•˜λ©΄μ„œ, HTML μš”μ†Œλ₯Ό λŒ€ν‘œν•˜λŠ” μ‹œμž‘ νƒœκ·Έλ₯Ό λ§Œλ‚©λ‹ˆλ‹€. 각 μ‹œμž‘ νƒœκ·Έμ— λŒ€ν•΄ μ•Œκ³ λ¦¬μ¦˜μ€ DOM νŠΈλ¦¬μ— μš”μ†Œ λ…Έλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

μš”μ†Œ λ…Έλ“œλ“€μ€ HTML μš”μ†Œμ— λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  있으며, μš”μ†Œμ˜ νƒœκ·Έ 이름, 속성, 그리고 μ€‘μ²©λœ λ‚΄μš©μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μš”μ†Œ λ…Έλ“œλ“€μ€ DOM 트리의 ꡬ성 μš”μ†Œκ°€ λ˜μ–΄, HTML λ¬Έμ„œμ˜ ꡬ쑰λ₯Ό ν˜•μ„±ν•©λ‹ˆλ‹€.

parent-child relation 생성

HTML λ¬Έμ„œμ˜ 계측적 ꡬ쑰λ₯Ό λ°˜μ˜ν•˜κΈ° μœ„ν•΄ μ•Œκ³ λ¦¬μ¦˜μ€ μš”μ†Œ λ…Έλ“œλ“€ 사이에 λΆ€λͺ¨-μžμ‹ 관계λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. μ‹œμž‘ νƒœκ·Έκ°€ 발견되면, ν•΄λ‹Ή μš”μ†Œ λ…Έλ“œλŠ” 이전에 μ—΄λ¦° μš”μ†Œμ˜ μžμ‹μ΄ λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•΄μ„œ μ€‘μ²©λœ ꡬ쑰가 μƒμ„±λ˜λ©°, μš”μ†Œλ“€μ€ 그듀이 ν¬ν•¨λ˜λŠ” 기쀀에 따라 κ³„μΈ΅μ μœΌλ‘œ μ‘°μ§λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, HTML μ½”λ“œ <div><p>Hello, World!</p></div>λ₯Ό 고렀해보면, μ•Œκ³ λ¦¬μ¦˜μ€ <div> μš”μ†Œμ— λŒ€ν•œ μš”μ†Œ λ…Έλ“œμ™€ <p> μš”μ†Œμ— λŒ€ν•œ λ…Έλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. <p> μš”μ†Œ λ…Έλ“œλŠ” <div> μš”μ†Œ λ…Έλ“œμ˜ μžμ‹μ΄ λ˜μ–΄, λΆ€λͺ¨-μžμ‹ 관계λ₯Ό ν˜•μ„±ν•©λ‹ˆλ‹€.

Nodeκ°„ ν˜•μ œ 관계 처리:

λΆ€λͺ¨-μžμ‹ 관계 외에도 μ•Œκ³ λ¦¬μ¦˜μ€ μš”μ†Œλ“€ μ‚¬μ΄μ˜ ν˜•μ œ 관계도 μ²˜λ¦¬ν•©λ‹ˆλ‹€. μƒˆλ‘œμš΄ μ‹œμž‘ νƒœκ·Έκ°€ 이전에 μ—΄λ¦° μš”μ†Œμ™€ 같은 λΆ€λͺ¨λ₯Ό κ³΅μœ ν•  λ•Œ, 그것은 κΈ°μ‘΄ μš”μ†Œμ˜ ν˜•μ œκ°€ λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, HTML μ½”λ“œ <div><p>Paragraph 1</p><p>Paragraph 2</p></div>μ—μ„œλŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ 두 개의 <p> μš”μ†Œ λ…Έλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 두 <p> μš”μ†ŒλŠ” λ™μΌν•œ λΆ€λͺ¨ <div>λ₯Ό 가지고 μ„œλ‘œμ˜ ν˜•μ œμž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λΆ€λͺ¨-μžμ‹ 및 ν˜•μ œ 관계λ₯Ό μ •ν™•ν•˜κ²Œ μ„€μ •ν•¨μœΌλ‘œμ¨ μ•Œκ³ λ¦¬μ¦˜μ€ DOM의 트리 ꡬ쑰λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€. 결과둜 λ‚˜μ˜¨ DOM νŠΈλ¦¬λŠ” HTML μš”μ†Œμ˜ μ€‘μ²©λœ 쑰직을 λ°˜μ˜ν•˜μ—¬ HTML λ¬Έμ„œμ˜ 계측적 ν‘œν˜„μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

4. μ€‘μ²©λœ HTML μš”μ†ŒμΌλ•Œμ˜ 문제 ν•΄κ²°

HTML μš”μ†Œμ˜ μ€‘μ²©λœ ꡬ쑰(nested structure)λž€, ν•œ μš”μ†Œκ°€ λ‹€λ₯Έ μš”μ†Œ 내뢀에 μœ„μΉ˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” 트리 ꡬ쑰둜 ν‘œν˜„λ˜λ©°, μ΄λŸ¬ν•œ ꡬ쑰λ₯Ό 톡해 μ›Ή νŽ˜μ΄μ§€μ˜ λ ˆμ΄μ•„μ›ƒκ³Ό λ‚΄μš©μ΄ μ •μ˜λ©λ‹ˆλ‹€.

<div>
  <p>μ•ˆλ…•ν•˜μ„Έμš”.</p>
  <ul>
    <li>ν•­λͺ© 1</li>
    <li>ν•­λͺ© 2</li>
  </ul>
</div>

이 μ˜ˆμ‹œμ—μ„œ <div> μš”μ†ŒλŠ” <p> μš”μ†Œμ™€ <ul> μš”μ†Œλ₯Ό 내뢀에 ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, <ul> μš”μ†ŒλŠ” <li> μš”μ†Œλ₯Ό 내뢀에 ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이런 μ‹μœΌλ‘œ ν•˜λ‚˜μ˜ μš”μ†Œκ°€ λ‹€λ₯Έ μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” ꡬ쑰λ₯Ό "μ€‘μ²©λœ ꡬ쑰"라고 ν•©λ‹ˆλ‹€.

이 μ€‘μ²©λœ κ΅¬μ‘°λŠ” Document Object Model (DOM) 트리둜 ν‘œν˜„λ  λ•Œ, λΆ€λͺ¨-μžμ‹ 관계λ₯Ό ν˜•μ„±ν•˜κ²Œ λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μœ„μ˜ HTML μ½”λ“œμ—μ„œ <div> μš”μ†ŒλŠ” <p>와 <ul>의 λΆ€λͺ¨κ°€ 되며, <ul>은 <li>의 λΆ€λͺ¨κ°€ λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ€‘μ²©λœ ꡬ쑰λ₯Ό 톡해 μ›Ή νŽ˜μ΄μ§€μ˜ 계측적 ꡬ쑰가 ν˜•μ„±λ˜κ³ , 이λ₯Ό μ‰½κ²Œ μ‘°μž‘ν•˜κ±°λ‚˜ μŠ€νƒ€μΌμ„ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

open element stack의 ν™œμš©

μ•Œκ³ λ¦¬μ¦˜μ€ μ€‘μ²©λœ μš”μ†Œλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ "open element stack" λ˜λŠ” "element stack"μ΄λΌλŠ” μŠ€νƒμ„ μœ μ§€ν•©λ‹ˆλ‹€. 이 μŠ€νƒμ€ ν† ν°ν™”λœ HTML μ½”λ“œλ₯Ό 톡해 μ•Œκ³ λ¦¬μ¦˜μ΄ μ§„ν–‰λ˜λ©΄μ„œ ν˜„μž¬ μ—΄λ € μžˆλŠ” μš”μ†Œλ₯Ό μΆ”μ ν•©λ‹ˆλ‹€. 아직 λ‹«νžˆμ§€ μ•Šμ€ 각 μš”μ†Œ λ…Έλ“œλŠ” μŠ€νƒμ— ν‘Έμ‹œλ©λ‹ˆλ‹€.

μ‹œμž‘ νƒœκ·Έλ₯Ό ν†΅ν•œ λ…Έλ“œ 생성

μ•Œκ³ λ¦¬μ¦˜μ΄ μ‹œμž‘ νƒœκ·Έ 토큰을 λ§Œλ‚˜λ©΄ ν•΄λ‹Ή HTML μš”μ†Œμ— λŒ€ν•œ μƒˆλ‘œμš΄ μš”μ†Œ λ…Έλ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μƒˆλ‘œ μƒμ„±λœ μš”μ†Œ λ…Έλ“œλŠ” κ·Έ λ‹€μŒ DOM νŠΈλ¦¬μ— μΆ”κ°€λ©λ‹ˆλ‹€. μš”μ†Œ λ…Έλ“œλ₯Ό μΆ”κ°€ν•˜κΈ° 전에, μ•Œκ³ λ¦¬μ¦˜μ€ ν˜„μž¬ μš”μ†Œμ˜ μ μ ˆν•œ λΆ€λͺ¨λ₯Ό κ²°μ •ν•˜κΈ° μœ„ν•΄ μ˜€ν”ˆ μš”μ†Œ μŠ€νƒμ„ ν™•μΈν•©λ‹ˆλ‹€. λΆ€λͺ¨ μš”μ†ŒλŠ” μŠ€νƒμ—μ„œ κ°€μž₯ μ΅œκ·Όμ— μ—΄λ¦° μš”μ†Œμž…λ‹ˆλ‹€.

λΆ€λͺ¨-μžμ‹ 관계 문제 ν•΄κ²°

μ•Œκ³ λ¦¬μ¦˜μ€ HTML μ½”λ“œμ—μ„œμ˜ 쀑첩을 기반으둜 μš”μ†Œ κ°„μ˜ λΆ€λͺ¨-μžμ‹ 관계λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. λΆ€λͺ¨-μžμ‹ κ΄€κ³„λŠ” DOM νŠΈλ¦¬μ—μ„œ 반영되며, λΆ€λͺ¨ μš”μ†Œκ°€ μžμ‹ μš”μ†Œμ˜ 직접적인 쑰상 역할을 ν•©λ‹ˆλ‹€. μ•Œκ³ λ¦¬μ¦˜μ€ 각 μžμ‹ μš”μ†Œ λ…Έλ“œκ°€ κ·Έκ²ƒμ˜ λΆ€λͺ¨ μš”μ†Œ λ…Έλ“œ 내에 μ˜¬λ°”λ₯΄κ²Œ μ€‘μ²©λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

μ’…λ£Œνƒœκ·Έλ₯Ό ν†΅ν•œ μŠ€νƒ 제거

μ•Œκ³ λ¦¬μ¦˜μ΄ μ’…λ£Œ νƒœκ·Έ 토큰을 λ§Œλ‚˜λ©΄, ν•΄λ‹Ή μš”μ†Œκ°€ λ‹«ν˜”λ‹€λŠ” 것을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ•Œκ³ λ¦¬μ¦˜μ€ μΌμΉ˜ν•˜λŠ” νƒœκ·Έ 이름을 가진 κ°€μž₯ μ΅œκ·Όμ— μ—΄λ¦° μš”μ†Œλ₯Ό μ°ΎκΈ° μœ„ν•΄ μ˜€ν”ˆ μš”μ†Œ μŠ€νƒμ„ ν™•μΈν•©λ‹ˆλ‹€. μ•Œκ³ λ¦¬μ¦˜μ€ μΌμΉ˜ν•˜λŠ” νƒœκ·Έ 이름을 가진 μš”μ†Œλ₯Ό μ°Ύκ³  닫을 λ•ŒκΉŒμ§€ μŠ€νƒμ—μ„œ μš”μ†Œλ₯Ό μ œκ±°ν•©λ‹ˆλ‹€. μš”μ†Œλ₯Ό λ‹«λŠ” 것은 그것이 μ™„μ „ν•˜κ³ , κ·Έκ²ƒμ˜ λΆ€λͺ¨ μš”μ†Œ 내에 μ˜¬λ°”λ₯΄κ²Œ μ€‘μ²©λ˜μ—ˆλ‹€κ³  κ°„μ£Όλ©λ‹ˆλ‹€. μš”μ†Œκ°€ λ‹«νžˆλ©΄, 그듀은 μŠ€νƒμ—μ„œ μ œκ±°λ˜μ–΄ μ™„μ „νžˆ μ²˜λ¦¬λ˜μ—ˆλ‹€κ³  ν‘œμ‹œλ©λ‹ˆλ‹€.

Tree Construction Example

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‘œ Tree Construction에 λŒ€ν•΄μ„œ ν•™μŠ΅μ„ 마무리 지어 λ³΄κ² μŠ΅λ‹ˆλ‹€.

<html>
	<head>
		<title>My Web Page</title>
	</head>
	<body>
		<p>Welcome to my web page.</p>
	</body>
</html>

DOM 트리λ₯Ό ꡬ좕할 μ°¨λ‘€μž…λ‹ˆλ‹€. μ²˜μŒμ—λŠ” 루트 λ…Έλ“œλ§Œ μžˆλŠ” μƒνƒœμž…λ‹ˆλ‹€. 'html' μ‹œμž‘ νƒœκ·Έ 토큰을 λ§Œλ‚˜λ©΄, 'html' λ…Έλ“œκ°€ 루트 λ…Έλ“œμ˜ μžμ‹μœΌλ‘œ μΆ”κ°€λ©λ‹ˆλ‹€. 이후 'head', 'title', 'body', 'p' λ“±μ˜ λ…Έλ“œλ„ λ™μΌν•œ λ°©μ‹μœΌλ‘œ νŠΈλ¦¬μ— μΆ”κ°€λ©λ‹ˆλ‹€.

'p' λ…Έλ“œλ₯Ό 예둜 λ“€λ©΄, 이 λ…Έλ“œλŠ” 'body' λ…Έλ“œμ˜ μžμ‹μœΌλ‘œ λ“€μ–΄κ°‘λ‹ˆλ‹€. 그리고 κ·Έ μ•ˆμ˜ ν…μŠ€νŠΈ "Welcome to my web page."λŠ” 'p' λ…Έλ“œμ˜ μžμ‹μœΌλ‘œ λ“€μ–΄κ°€κ²Œ λ©λ‹ˆλ‹€.

μ•„λž˜λŠ” μ˜ˆμ‹œλ‘œ μž‘μ„±λœ tree ꡬ쑰 μž…λ‹ˆλ‹€.

html
β”œβ”€β”€ head
β”‚   └── title
β”‚       └── "My Web Page"
└── body
    └── p
        └── "Welcome to my web page."

Graceful Degradation (μš°μ•„ν•œ μ €ν•˜)

HTML νŒŒμ‹± μ•Œκ³ λ¦¬μ¦˜μ€ μ’…μ’… μ—λŸ¬λ‘œ 인해 ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•˜κΈ°λ³΄λ‹€λŠ” μ½˜ν…μΈ μ˜ 볡ꡬ와 λ Œλ”λ§μ„ μš°μ„ μ‹œν•©λ‹ˆλ‹€. μš°μ•„ν•œ μ €ν•˜ κΈ°μˆ μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ•Œκ³ λ¦¬μ¦˜μ€ μ—λŸ¬κ°€ μžˆλ”λΌλ„ κ°€λŠ₯ν•œ λ§Žμ€ μœ νš¨ν•œ μ½˜ν…μΈ λ₯Ό νŒŒμ‹±ν•˜κ³  λ Œλ”λ§ν•˜λ €κ³  λ…Έλ ₯ν•©λ‹ˆλ‹€. 이 μ ‘κ·Ό 방식은 μ‚¬μš©μžκ°€ HTML λ¬Έμ„œμ˜ 일뢀가 λ¬Έμ œκ°€ μžˆλ”λΌλ„ μ‚¬μš© κ°€λŠ₯ν•œ μ½˜ν…μΈ μ— 계속 μ ‘κ·Όν•˜κ³  μƒν˜Έ μž‘μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

<!--잘λͺ»λœ μ½”λ“œ-->
<!DOCTYPE html>
<html>
<head>
    <title>Test Page</title>
</head>
<body>

<h1>Welcome to My Website

<p>This is a paragraph.</p>
<p>This is another paragraph

<ul>
    <li>List Item 1
    <li>List Item 2
</ul>

</body>
</html>

λ‹€μŒμ˜ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ ν™•μΈν•œ κ²°κ³Ό

μœ„μ˜ HTML μ½”λ“œλŠ” λ§Žμ€ 문법 였λ₯˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

<h1> νƒœκ·Έκ°€ λ‹«νžˆμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 두 번째 <p> νƒœκ·Έκ°€ λ‹«νžˆμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. <li> νƒœκ·Έλ“€μ΄ λ‹«νžˆμ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

κ·ΈλŸΌμ—λ„ λΆˆκ΅¬ν•˜κ³  λŒ€λΆ€λΆ„μ˜ μ›Ή λΈŒλΌμš°μ €λŠ” 이λ₯Ό 적절히 λ Œλ”λ§ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 의미 μžˆλŠ” μ½˜ν…μΈ λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€. 이것이 λ°”λ‘œ "μš°μ•„ν•œ μ €ν•˜"의 ν•œ μ˜ˆμ‹œλΌκ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œκ°€ μ™„λ²½ν•˜μ§€ μ•Šλ”λΌλ„ λΈŒλΌμš°μ €κ°€ 이해할 수 μžˆλ„λ‘ μ΅œλŒ€ν•œ λ…Έλ ₯ν•©λ‹ˆλ‹€.

3. CSS Parsing

Cascading Style Sheets (CSS)λŠ” μ›Ή μ„œλΉ„μŠ€μ—μ„œ μ‹œκ°μ  외관을 ν˜•μ„±ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ‚¬μš©μžμ—κ²Œ 맀λ ₯적이고 νŽΈλ¦¬ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€λ €κ³  λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ‹Ήμ—°ν•˜κ²Œλ„ λΈŒλΌμš°μ €λŠ” CSS documentλ₯Ό parsingν•˜μ—¬, μš°λ¦¬κ°€ λ§Œλ“  dom tree에 μ—°κ²°ν•˜λŠ” κΈ°λŠ₯(이 κ³Όμ •μ—μ„œ CSSOM이 μƒμ„±λ©λ‹ˆλ‹€)을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

1. CSS Parsing 이유

CSS Parsing을 ν•˜λŠ” κ°€μž₯ μ£Όμš”ν•œ μ΄μœ λŠ” CSS μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ μŠ€νƒ€μΌ 을 λΆ„λ¦¬ν•˜κ³  μΆ”μΆœν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μΆ”μΆœλœ μŠ€νƒ€μΌ μ€‘μ—μ„œλŠ” HTML μš”μ†Œμ˜ μ‹œκ°μ  λͺ¨μ–‘(색, 크기, λͺ¨μ–‘, μœ„μΉ˜ λ“±λ“±)을 κ²°μ •ν•˜λŠ” 정보λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•©λ‹ˆλ‹€. λΈŒλΌμš°μ €λŠ” Parsing을 ν†΅ν•΄μ„œ style을 μΆ”μΆœν•˜κ³  μ €μž₯ν•˜μ—¬ μ°¨ν›„ λ Œλ”λ§ κ³Όμ •μ—μ„œ ν™œμš©ν•©λ‹ˆλ‹€.

CSS Parsingdms λ‹€μŒκ³Ό 같은 이유λ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€.

1.ꡬ문 μœ νš¨μ„± 검사:

CSS Parsing은 CSS μ½”λ“œκ°€ μ •μ˜λœ ꡬ문 κ·œμΉ™ 및 ꡬ쑰λ₯Ό μ€€μˆ˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. 선택기, 속성, κ°’ 및 κ΅¬λ‘μ μ˜ μ˜¬λ°”λ₯Έ μ‚¬μš©μ„ ν¬ν•¨ν•˜μ—¬ μ½”λ“œκ°€ μ˜¬λ°”λ₯΄κ²Œ μž‘μ„±λ˜μ—ˆλŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€. ꡬ문 μœ νš¨μ„± κ²€μ‚¬λŠ” CSS μ½”λ“œμ˜ 였λ₯˜λ‚˜ 뢈일치λ₯Ό μ‹λ³„ν•˜κ³  ν‘œμ‹œν•˜λŠ” 데 도움이 λ˜λ―€λ‘œ κ°œλ°œμžλŠ” 이λ₯Ό μˆ˜μ •ν•˜κ³  μŠ€νƒ€μΌμ΄ μ μ ˆν•˜κ²Œ λ Œλ”λ§λ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. CSS 개체 λͺ¨λΈ(CSSOM) ꡬ좕:

CSS Parsing은 CSS 개체 λͺ¨λΈ(CSSOM)을 κ΅¬μ„±ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. CSSOM은 CSS μ½”λ“œμ˜ κ΅¬μ‘°ν™”λœ ν‘œν˜„μ„ λ‚˜νƒ€λ‚΄λ―€λ‘œ κ°œλ°œμžλŠ” ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ CSS 속성 및 값에 μ•‘μ„ΈμŠ€ν•˜κ³  μ‘°μž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μŠ€νƒ€μΌμ‹œνŠΈμ™€ μƒν˜Έ μž‘μš©ν•˜κ³  μ›Ή μš”μ†Œ ν‘œμ‹œμ— 동적 λ³€κ²½ 사항을 μ μš©ν•˜λŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.

3. μŠ€νƒ€μΌ κ²°μ •:

ꡬ문 뢄석 쀑에 CSS κ·œμΉ™μ€ 선택기λ₯Ό 기반으둜 ν•΄λ‹Ή HTML μš”μ†Œμ™€ μΌμΉ˜λ©λ‹ˆλ‹€. λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 엔진은 ꡬ문 λΆ„μ„λœ CSSλ₯Ό ν™œμš©ν•˜μ—¬ 각 μš”μ†Œμ— μ–΄λ–€ μŠ€νƒ€μΌμ„ μ μš©ν•΄μ•Ό ν•˜λŠ”μ§€ κ²°μ •ν•©λ‹ˆλ‹€. μŠ€νƒ€μΌμ„ μ •ν™•ν•˜κ²Œ ꡬ문 λΆ„μ„ν•˜κ³  ν•΄κ²°ν•¨μœΌλ‘œμ¨ CSS ꡬ문 뢄석은 μ›Ή νŽ˜μ΄μ§€μ˜ μ‹œκ°μ  ν‘œν˜„μ΄ μ˜λ„ν•œ λ””μžμΈκ³Ό μΌμΉ˜ν•˜λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.

2. CSS Parsing Process

1. Toknization

ToknizationλŠ” CSS ꡬ문 뢄석 ν”„λ‘œμ„ΈμŠ€μ˜ 첫 λ‹¨κ³„μž…λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” CSS μ½”λ“œλ₯Ό CSS OM의 ꡬ성 μš”μ†ŒμΈ κ°œλ³„ ν† ν°μœΌλ‘œ λ‚˜λˆ„λŠ” μž‘μ—…μ΄ ν¬ν•¨λ©λ‹ˆλ‹€. 토큰은 μ„ νƒμž(Selector), 속성(Property), κ°’(Value), 기호 및 ν‚€μ›Œλ“œμ™€ 같은 κ³ μœ ν•œ λ‹¨μœ„λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. CSS μ½”λ“œλ₯Ό ν† ν°ν™”ν•¨μœΌλ‘œμ¨ λΈŒλΌμš°μ €μ˜ ꡬ문 뢄석 엔진은 CSS κ·œμΉ™μ˜ 각 μš”μ†Œλ₯Ό μ‹λ³„ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ cssκ°€ Toknization λ˜λŠ” Token type 듀을 λͺ…μ‹œν•©λ‹ˆλ‹€.

  1. μ„ νƒμž(Selector) : p , h1 λ“±λ“±
  2. μ‹λ³„μž(Identifier) : id, class λ“±λ“±
  3. μ—¬λŠ” μ€‘κ΄„ν˜Έ (LeftCurlyBracket) : {
  4. λ‹«λŠ” μ€‘κ΄„ν˜Έ (RightCurlyBracket) : }
  5. 속성 (Property) : display, border λ“±λ“±
  6. 콜둠 (Colon) : :
  7. κ°’ (Value) : flex , 1px solid black λ“±λ“±
  8. μ„Έλ―Έμ½œλ‘  (Semicolon) : ;

κ°„λ‹¨ν•œ μ˜ˆμ‹œλ‘œ css Toknization을 마무리 ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

#main-header {
	font-size: 24px;
	color: blue;
}
  1. μ‹λ³„μž(Identifier): #main-header
  2. μ—¬λŠ” μ€‘κ΄„ν˜Έ(LeftCurlyBracket): {
  3. 속성(Property): font-size
  4. 콜둠(Colon): :
  5. κ°’(Value): 24px
  6. μ„Έλ―Έμ½œλ‘ (Semicolon): ;
  7. 속성(Property): color
  8. 콜둠(Colon): :
  9. κ°’(Value): blue
  10. μ„Έλ―Έμ½œλ‘ (Semicolon): ;
  11. λ‹«λŠ” μ€‘κ΄„ν˜Έ(RightCurlyBracket): }

아직은 각 Token듀이 λ‚˜λˆ„μ–΄μ Έ μžˆμ§€λ§Œ μ˜λ―ΈλŠ” λΆ€μ—¬λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

μ§€κΈˆκΉŒμ§€ CSS Tokenizaion에 λŒ€ν•΄μ„œ ν•™μŠ΅μ„ μ§†μ• ν–ˆμŠ΅λ‹ˆλ‹€. κΈ€λ¨Έ λ‹€μŒ 단계인 Lexical Analysis 둜 μ΄λ™ν•˜κ² μŠ΅λ‹ˆλ‹€.

2. Lexical Analysis

Lexical Analysis은 CSS parsing의 Tokenν™” μ΄ν›„μ˜ 단계 μž…λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ Token ν™” 된 결과물을 λ°”νƒ•μœΌλ‘œ 의미 μžˆλŠ” λ‹¨μœ„λ‘œ λΆ„ν•΄ν•˜κ³  μ—°κ²°ν•˜λŠ” μž‘μ—…μ„ μ²˜λ§‡λ°”λ‹ˆλ‹€.

Lexical Analysis κ³Όμ • μ€‘μ—λŠ” μƒμ„±λœ Token을 의미 μžˆλŠ” λ‹¨μœ„λ‘œ ν•©μΉ˜λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ„ νƒμž, 속성, κ°’ λ“±λ“±μ˜ 토큰은 CSS λ¬Έμ„œ λ‚΄λΆ€μ—μ„œ ν•΄λ‹Ή κΈ°λŠ₯을 μˆ˜ν–‰ν•˜μ—¬ μΈμ‹λ˜κ³  λΆ„λ₯˜λ©λ‹ˆλ‹€. μ΄λ•Œ 토큰을 의미 μžˆλŠ” λ‹¨μœ„λ‘œ λΆ„ν•΄ν•˜λŠ”κ²ƒμ€ μ°¨ν›„ CSSλ₯Ό κ΅¬μ‘°ν™”λœ ν‘œν˜„μ„ μ§„ν–‰ν• λ•Œ ν•„μˆ˜μ μž…λ‹ˆλ‹€.

body {
	background-color: #f2f2f2;
	color: #333;
}

토큰화 κ²°κ³Όλ¬Ό body, {, background-color, :, #f2f2f2, ;, color, :, #333, ;, }

Lexical Analysis κ³Όμ • 이후 κ²°κ³Ό body => μ„ νƒμž { => μ—¬λŠ” μ€‘κ΄„ν˜Έ background-color => 속성 : => 콜둠 #f2f2f2=> κ°’ ; => μ„Έλ―Έμ½œλ‘  color => 속성 : => 콜둠 #333=> κ°’ ; => μ„Έλ―Έμ½œλ‘  } => λ‹«λŠ” μ€‘κ΄„ν˜Έ

Token ν™” ν•œ 결과물을 λ°”νƒ•μœΌλ‘œ 의미λ₯Ό λΆ€μ—¬ν•˜λŠ” Lexical Analysis κΉŒμ§€ μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ Syntax Analysis μž…λ‹ˆλ‹€.

3. Syntax Analysis(ꡬ문 뢄석)

Syntax Analysis은 CSS Parsing의 3번째 단계 μž…λ‹ˆλ‹€. CSS μ½”λ“œμ˜ ꡬ쑰와 문법을 λΆ„μ„ν•˜μ—¬ μ •μ˜λœ ꡬ문 κ·œμΉ™μ„ μ€€μˆ˜ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” μž‘μ—…μ΄ ν¬ν•¨λ©λ‹ˆλ‹€. ꡬ문 뢄석은 CSS μ½”λ“œμ˜ 계측 ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚΄λŠ” parse tree을 κ΅¬μΆ•ν•˜κΈ° μœ„ν•΄ ν† ν°μ˜ λ°°μ—΄κ³Ό 관계λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.

Syntax Analysis은 Tokenization 쀑에 μƒμ„±λœ 토큰을 CSS ꡬ문 κ·œμΉ™μ— 따라 의미 μžˆλŠ” μˆœμ„œλ‘œ μ •λ ¬ν•©λ‹ˆλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” Token의 μˆœμ„œμ™€ 배치λ₯Ό κ³ λ €ν•˜μ—¬ CSS κ·œμΉ™, 속성, κ°’ 및 기타 μš”μ†Œμ˜ ꡬ쑰λ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.그리고 κ·Έ 이후 parse treeλ₯Ό κ΅¬μΆ•ν•©λ‹ˆλ‹€.

ꡬ문 뢄석 νŠΈλ¦¬λŠ” CSS μ½”λ“œμ˜ 계측 ꡬ쑰λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. ꡬ문 뢄석은 토큰을 λ…Έλ“œλ‘œ κ΅¬μ„±ν•˜κ³  λ…Έλ“œ κ°„μ˜ 관계λ₯Ό μ •μ˜ν•˜μ—¬ ꡬ문 뢄석 트리λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ ꡬ문 뢄석 νŠΈλ¦¬μ—λŠ” CSS μ½”λ“œμ˜ 계측 ꡬ쑰λ₯Ό λ°˜μ˜ν•˜λŠ” μƒμœ„-ν•˜μœ„ 관계와 ν•¨κ»˜ 선택기, 속성, κ°’ 및 선언에 λŒ€ν•œ λ…Έλ“œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ μ•„λž˜μ™€ 같은 css λ¬Έμ„œκ°€ μ‘΄μž¬ν• λ•Œ

/* CSS Comment */
h1 {
	color: #333;
	font-size: 24px;
	text-align: center;
}

p {
	font-family: Arial, sans-serif;
	font-size: 16px;
	line-height: 1.5;
}

λ‹€μŒκ³Ό 같은 parse treeλ₯Ό κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

StyleSheet
β”œβ”€ Comment: " CSS Comment "
β”œβ”€ Rule
β”‚   β”œβ”€ Selector: "h1"
β”‚   └─ DeclarationBlock
β”‚       β”œβ”€ Declaration
β”‚       β”‚   β”œβ”€ Property: "color"
β”‚       β”‚   └─ Value: "#333"
β”‚       β”œβ”€ Declaration
β”‚       β”‚   β”œβ”€ Property: "font-size"
β”‚       β”‚   └─ Value: "24px"
β”‚       └─ Declaration
β”‚           β”œβ”€ Property: "text-align"
β”‚           └─ Value: "center"
β”œβ”€ Rule
β”‚   β”œβ”€ Selector: "p"
β”‚   └─ DeclarationBlock
β”‚       β”œβ”€ Declaration
β”‚       β”‚   β”œβ”€ Property: "font-family"
β”‚       β”‚   └─ Value: "Arial, sans-serif"
β”‚       β”œβ”€ Declaration
β”‚       β”‚   β”œβ”€ Property: "font-size"
β”‚       β”‚   └─ Value: "16px"
β”‚       └─ Declaration
β”‚           β”œβ”€ Property: "line-height"
β”‚           └─ Value: "1.5"

λ˜ν•œ 이 단계 μ—μ„œ 잘λͺ»λœ κ·œμΉ™μ΄ μž‡λŠ”μ§€ ν™•μΈν•˜λŠ”λ°,

body {
    color red;
}

이 λ•Œ Syntax AnalysisλŠ” 였λ₯˜λ₯Ό κ°μ§€ν•˜κ³  였λ₯˜ 메세지λ₯Ό λ°˜ν™˜ν•˜κ±°λ‚˜ λ³΅κ΅¬ν•˜λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

4. CSS Parsing Algorithm

CSS Parsing Algorithm은 CSS κ·œμΉ™μ΄ νŒŒμ‹±λ˜κ³  ν‰κ°€λ˜μ–΄ μ›Ή νŽ˜μ΄μ§€ λ‚΄μ˜ HTML μš”μ†Œμ— μ μš©λ˜λŠ” 체계적인 과정을 μ •μ˜ν•©λ‹ˆλ‹€. μ΄λŠ” CSS μ½”λ“œλ₯Ό ν•΄μ„ν•˜κ³  각 μš”μ†Œμ— μ μš©ν•΄μ•Ό ν•  μ΅œμ’… μŠ€νƒ€μΌμ„ κ²°μ •ν•˜λŠ” μ£Όμš” 단계λ₯Ό κ°œμš”ν™”ν•©λ‹ˆλ‹€.

1. κ·œμΉ™ 선택 및 일치:

CSS Parsing Algorithm의 첫 번째 λ‹¨κ³„λŠ” κ·œμΉ™ 선택 및 μΌμΉ˜μž…λ‹ˆλ‹€. 이 과정은 CSS κ·œμΉ™μ„ μ„ νƒν•˜κ³  λ¬Έμ„œ 트리의 ν•΄λ‹Ή HTML μš”μ†Œμ™€ μΌμΉ˜ν•˜λŠ”μ§€ κ²°μ •ν•˜λŠ” 것을 ν¬ν•¨ν•©λ‹ˆλ‹€.

  • μ„ νƒμž 평가: μ•Œκ³ λ¦¬μ¦˜μ€ 각 CSS κ·œμΉ™ λ‚΄μ˜ μ„ νƒμžλ₯Ό ν‰κ°€ν•˜μ—¬ λŒ€μƒ μš”μ†Œλ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€.
  • μ„ νƒμž 일치: μ„ νƒμžκ°€ ν‰κ°€λ˜λ©΄ μ•Œκ³ λ¦¬μ¦˜μ€ λ¬Έμ„œ 트리의 HTML μš”μ†Œμ™€ μΌμΉ˜μ‹œν‚΅λ‹ˆλ‹€.
  • κ·œμΉ™ μˆœμ„œ: μ•Œκ³ λ¦¬μ¦˜μ€ μ—¬λŸ¬ κ·œμΉ™μ΄ λ™μΌν•œ μš”μ†Œμ™€ μΌμΉ˜ν•  λ•Œ CSS κ·œμΉ™μ˜ μˆœμ„œλ₯Ό κ³ λ €ν•©λ‹ˆλ‹€.

2. μŠ€νƒ€μΌ 상속 및 연속:

CSS νŒŒμ‹± μ•Œκ³ λ¦¬μ¦˜μ˜ 두 번째 λ‹¨κ³„λŠ” μŠ€νƒ€μΌ 상속 및 μ—°μ†μž…λ‹ˆλ‹€.

  • μŠ€νƒ€μΌ 상속: CSSμ—μ„œ 일뢀 속성은 기본적으둜 λΆ€λͺ¨ μš”μ†Œμ—μ„œ μžμ‹ μš”μ†Œλ‘œ μƒμ†λ©λ‹ˆλ‹€.
  • 연속 μˆœμ„œ: CSS 연속은 μ—¬λŸ¬ κ·œμΉ™μ΄ λ™μΌν•œ μš”μ†Œλ₯Ό λŒ€μƒμœΌλ‘œ ν•  λ•Œ μΆ©λŒμ„ ν•΄κ²°ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€.

3. μ΅œμ’… 속성 κ°’ 계산:

CSS νŒŒμ‹± μ•Œκ³ λ¦¬μ¦˜μ˜ μ„Έ 번째 및 λ§ˆμ§€λ§‰ λ‹¨κ³„λŠ” 각 CSS 속성에 λŒ€ν•œ μ΅œμ’… 속성 값을 κ³„μ‚°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

  • μƒλŒ€ λ‹¨μœ„ ν•΄κ²°: μ•Œκ³ λ¦¬μ¦˜μ€ μƒλŒ€ λ‹¨μœ„λ₯Ό μ²˜λ¦¬ν•˜μ—¬ ν•΄λ‹Ή μ ˆλŒ€ κ°’μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
  • 상속 처리: 계산 κ³Όμ •μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ€ λΆ€λͺ¨ μš”μ†Œμ—μ„œ μƒμ†λœ 값을 κ³ λ €ν•©λ‹ˆλ‹€. CSS νŒŒμ‹± μ•Œκ³ λ¦¬μ¦˜μ€ CSS μ½”λ“œμ˜ λ³΅μž‘μ„±μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 체계적인 방법을 μ œκ³΅ν•˜λ©°, 각 μš”μ†Œμ— λŒ€ν•œ μ΅œμ’… 계산 μŠ€νƒ€μΌμ„ κ²°μ •ν•˜λŠ” κ·œμΉ™ 기반 평가 및 연속 λ©”μ»€λ‹ˆμ¦˜μ„ λ”°λ¦…λ‹ˆλ‹€.

CSSOM tree Example

μ§€κΈˆκΉŒμ§€ ν•™μŠ΅ν•œ CSS parser 방식을 톡해 CSSλ¬Έμ„œλ‘œ CSSOM λ¬Έμ„œλ₯Ό μƒμ„±ν•˜λŠ” μ˜ˆμ‹œλ₯Ό 진행해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

body {
	background-color: #f5f5f5;
}

h1 {
	font-size: 24px;
	color: #333;
}

p {
	font-size: 16px;
	color: #666;
}

μ˜ˆμ‹œλ‘œ μ‚¬μš©ν•  css κ΅¬λ¬Έμž…λ‹ˆλ‹€.

1. 토큰화

토큰화 결과물은 λ‹€μŒκ³Ό κ°™γ……λΈŒλ‹ˆλ‹€.

  • body, {, background-color, :, #f5f5f5, ;, }
  • h1, {, font-size, :, 24px, ;, color, :, #333, ;, }
  • p, {, font-size, :, 16px, ;, color, :, #666, ;,}

2. ꡬ문뢄석을 ν†΅ν•œ parse tree 생성

- STYLESHEET
  - RULESET1
    - SELECTOR: body
    - DECLARATION BLOCK
      - PROPERTY: background-color
      - VALUE: #f5f5f5
  - RULESET2
    - SELECTOR: h1
    - DECLARATION BLOCK
      - PROPERTY: font-size
      - VALUE: 24px
      - PROPERTY: color
      - VALUE: #333
  - RULESET3
    - SELECTOR: p
    - DECLARATION BLOCK
      - PROPERTY: font-size
      - VALUE: 16px
      - PROPERTY: color
      - VALUE: #666

3. CSSOM Tree

μ΅œμ’…μ μœΌλ‘œ μƒμ„±ν•œ CSSOM Tree μž…λ‹ˆλ‹€!

4. DOM and CSSOM

λ§ˆμ§€λ§‰μœΌλ‘œ DOM κ³Ό CSSOM 을 μ •λ¦¬ν•˜κ³  마무리 ν•˜κ² μŠ΅λ‹ˆλ‹€ κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ 정말 κ°μ‚¬ν•©λ‹ˆλ‹€.

about DOM

  1. κ΅¬μ‘°ν™”λœ 객체 λͺ¨λΈ: DOM은 HTML λ¬Έμ„œμ˜ ꡬ쑰와 λ‚΄μš©μ„ 트리 ν˜•νƒœλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  2. API와 μΈν„°νŽ˜μ΄μŠ€: HTML λ¬Έμ„œμ˜ μš”μ†Œμ™€ λ‚΄μš©μ„ μ ‘κ·Ό, μˆ˜μ •, 탐색할 수 μžˆλŠ” API와 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  3. 동적 μˆ˜μ • κ°€λŠ₯: DOM을 톡해 κ°œλ°œμžλŠ” ꡬ쑰, λ‚΄μš©, 속성 등을 λ™μ μœΌλ‘œ μˆ˜μ •ν•  수 있으며, 이λ₯Ό 톡해 동적이고 λ°˜μ‘μ μΈ μ›Ή κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  4. 객체둜의 ν‘œν˜„: HTML μš”μ†Œ, ν…μŠ€νŠΈ λ…Έλ“œ, 속성, 그리고 λ‹€λ₯Έ λ¬Έμ„œ ꡬ성 μš”μ†Œλ“€μ„ 객체둜 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  5. CSSOM과의 μƒν˜Έμž‘μš©: DOM은 각 μš”μ†Œμ— λŒ€ν•œ μ—°κ΄€λœ CSS μŠ€νƒ€μΌμ— μ ‘κ·Όν•  수 μžˆλ„λ‘ CSSOM을 톡해 μ œκ³΅ν•©λ‹ˆλ‹€.
  6. CSSOM을 ν†΅ν•œ μŠ€νƒ€μΌ μ—…λ°μ΄νŠΈ: DOM에 변경이 생기면, 예λ₯Ό λ“€μ–΄ μš”μ†Œμ˜ κ΅¬μ‘°λ‚˜ λ‚΄μš©μ„ μˆ˜μ •ν•˜λŠ” 경우, μ΄λŸ¬ν•œ 변경은 CSSOM을 톡해 μ—°κ΄€λœ CSS μŠ€νƒ€μΌμ— μ—…λ°μ΄νŠΈλ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  7. λ Œλ”λ§ μ—”μ§„κ³Όμ˜ ν˜‘λ ₯: CSSOM은 λ Œλ”λ§ 엔진에 ν•„μš”ν•œ μŠ€νƒ€μΌ 정보λ₯Ό μ œκ³΅ν•˜λ©°, 이 μ •λ³΄λŠ” DOM ꡬ쑰λ₯Ό 기반으둜 μš”μ†Œμ˜ μ‹œκ°μ  λ Œλ”λ§μ— μ μš©λ©λ‹ˆλ‹€.

about CSSOM

  1. κ΅¬μ‘°ν™”λœ 객체 λͺ¨λΈ: CSSOM은 μ›Ή νŽ˜μ΄μ§€μ˜ CSS μŠ€νƒ€μΌμ‹œνŠΈλ₯Ό κ΅¬μ‘°ν™”λœ 객체 λͺ¨λΈλ‘œ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  2. API와 μΈν„°νŽ˜μ΄μŠ€: ν”„λ‘œκ·Έλž˜λ°μ μœΌλ‘œ CSS μŠ€νƒ€μΌμ„ μ ‘κ·Ό, μ‘°μž‘, μ μš©ν•  수 μžˆλŠ” API와 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  3. 동적 μˆ˜μ • κ°€λŠ₯: κ°œλ°œμžλŠ” CSSOM을 톡해 CSS μŠ€νƒ€μΌμ„ λ™μ μœΌλ‘œ μˆ˜μ •, μΆ”κ°€, μ œκ±°ν•  수 있으며, 이λ₯Ό 톡해 μ›Ή νŽ˜μ΄μ§€μ˜ μ‹œκ°μ  ν‘œν˜„κ³Ό λ™μž‘μ— λŒ€ν•œ κ°•λ ₯ν•œ μ œμ–΄κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.
  4. 객체둜의 ν‘œν˜„: CSS κ·œμΉ™, μ„ νƒμž, μ„ μ–Έ, 그리고 λ‹€λ₯Έ μŠ€νƒ€μΌλ§ 속성듀을 객체둜 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  5. DOM과의 μƒν˜Έμž‘μš©: CSSOM은 νŠΉμ • DOM μš”μ†Œμ™€ μ—°κ²°λœ CSS κ·œμΉ™μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  6. λ Œλ” νŠΈλ¦¬μ— 반영: CSSOM에 변경이 생기면, 예λ₯Ό λ“€μ–΄ CSS κ·œμΉ™μ„ μˆ˜μ •ν•˜κ±°λ‚˜ μΆ”κ°€ν•˜λŠ” 경우, μ΄λŸ¬ν•œ 변경은 λ Œλ” νŠΈλ¦¬μ— λ°˜μ˜λ˜μ–΄ 영ν–₯을 λ°›λŠ” μš”μ†Œμ˜ μ‹œκ°μ  λ Œλ”λ§μ΄ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.
  7. λ Œλ”λ§ κ³Όμ •μ—μ„œμ˜ μ—­ν• : CSSOMκ³Ό DOM은 λ Œλ”λ§ κ³Όμ •μ—μ„œ ν˜‘λ ₯ν•˜μ—¬ μ›Ή νŽ˜μ΄μ§€μ˜ μš”μ†Œλ“€μ˜ 크기, μœ„μΉ˜, μ™Έκ΄€, λ™μž‘μ„ κ²°μ •ν•©λ‹ˆλ‹€.

Reference

Β© 2023 Adultlee. All rights reserved.Made with ❀ by 이성인