CS

[CS] : λΈŒλΌμš°μ €μ˜ μž‘λ™ 원리

κΆŒμŠΎν–„ 2023. 8. 24. 22:23

 

λΈŒλΌμš°μ € ?

μ›Ή λΈŒλΌμš°μ €λŠ” λ™κΈ°μ μœΌλ‘œ HTML CSS JS μ–Έμ–΄λ₯Ό "해석"ν•΄μ„œ 화면에 λ‚΄μš©μ„ λ³΄μ—¬μ£ΌλŠ” "μ‘μš© μ†Œν”„νŠΈμ›¨μ–΄" μž…λ‹ˆλ‹€.

λΈŒλΌμš°μ €κ°€ μ„œλ²„μ— μžμ›μ„ μš”μ²­ν•˜λ©΄ ? μ„œλ²„λŠ” κ·Έ μš”μ²­μ— "응닡"을 ν•˜κ³  μ›Ή λΈŒλΌμš°μ €λŠ” κ·Έ "응닡"을 "해석"ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ€λ‹ˆλ‹€.
μžμ›μ€ HTML PDF 이미지 λ“± λ‹€μ–‘ν•œ μ’…λ₯˜κ°€ 있고,
크둬 / μ‚¬νŒŒλ¦¬ / νŒŒμ΄μ–΄ν­μŠ€ 등을 "μ›Ή λΈŒλΌμš°μ €μ˜ μ’…λ₯˜"라고 ν•©λ‹ˆλ‹€.

 

λΈŒλΌμš°μ €μ˜ ꡬ쑰

λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1. μœ μ € μΈν„°νŽ˜μ΄μŠ€

μœ μ € μΈν„°νŽ˜μ΄μŠ€λŠ” μ‚¬μš©μžκ°€ μ ‘κ·Όν•  수 μžˆλŠ” "μ˜μ—­"μž…λ‹ˆλ‹€.

보톡 HTML의 HEAD 뢀뢄에 μ‘΄μž¬ν•˜λŠ” μ£Όμ†Œ ν‘œμ‹œμ€„ / 이전 λ‹€μŒλ²„νŠΌ / μƒˆλ‘œκ³ μΉ¨ / ν™ˆ λ²„νŠΌ / λ“±λ“± μ„œλ²„μ— μš”μ²­ν•œ νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 창을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€μ˜ λͺ¨λ“  뢀뢄에 μ†ν•©λ‹ˆλ‹€.

 

2. λΈŒλΌμš°μ € μ—”μ§„

μœ μ € μΈν„°νŽ˜μ΄μŠ€μ™€ λ Œλ”λ§ μ—”μ§„ μ‚¬μ΄μ—μ„œ λ™μž‘μ„ μ œμ–΄ν•©λ‹ˆλ‹€.

Data Storage λ₯Ό μ°Έμ‘°ν•˜λ©΄μ„œ λ‘œμ»¬ν™˜κ²½μ— 데이터λ₯Ό μ“°κ³ , μ½μœΌλ©΄μ„œ λ‹€μ–‘ν•œ μž‘μ—…μ„ μ§„ν–‰ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

 

3. λ Œλ”λ§ μ—”μ§„

μ›Ή μ„œλ²„λ‘œλΆ€ν„° 응닡받은 μžμ›μ„ μ›Ή λΈŒλΌμš°μ € 상에 λ‚˜νƒ€λ‚΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

예둜 HTML λ¬Έμ„œμ˜ HTML/CSS λ₯Ό νŒŒμ‹±ν•˜μ—¬ 화면에 ν‘œμ‹œν•΄μ€λ‹ˆλ‹€.
λΈŒλΌμš°μ €μ˜ λ™μž‘ 원리λ₯Ό 이해함에 μžˆμ–΄μ„œλŠ” λ Œλ”λ§ μ—”μ§„μ˜ 이해가 μ€‘μš”ν•˜λ‹€.

"λΈŒλΌμš°μ €λŠ” μ„œλ²„λ‘œλΆ€ν„° HTML 응닡을 λ°›κ²Œλ˜λ©΄ λ Œλ”λ§ μ—”μ§„μ˜ HTML νŒŒμ„œ / CSS νŒŒμ„œμ— μ˜ν•΄μ„œ νŒŒμ‹±λ˜μ–΄ DOM / CSSOM 트리둜 λ³€ν™˜λ˜κ³ , λ Œλ”νŠΈλ¦¬λ‘œ κ²°ν•©ν•˜κ²Œ λ©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μƒμ„±λœ λ Œλ”νŠΈλ¦¬λ‘œ μΈν•΄μ„œ λΈŒλΌμš°μ €λŠ” μ›Ή νŽ˜μ΄μ§€λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

4. λ„€νŠΈμ›Œν‚Ή(톡신)

HTTP μš”μ²­κ³Ό 같은 μ„œλ²„μ™€ 톡신이 κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” λ„€νŠΈμ›Œν¬ ν˜ΈμΆœμ— μ‚¬μš©λœλ‹€.

 

5. JS μ—”μ§„

JS μ½”λ“œλ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ (크둬같은 κ²½μš°λŠ” V8 엔진이 동적언어인 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν•œμ€„ν•œμ€„ ν•΄μ„ν•˜μ—¬ λΏŒλ €μ€€λ‹Ή.)

 

6. UI/λ°±μ—”λ“œ

기본적인 μœ„μ ―μ„ κ·Έλ¦¬λŠ” μΈν„°νŽ˜μ΄μŠ€

 

7. 데이터 μ €μž₯μ†Œ

Cookie / Local-Storage / Indexed DB λ“±λ“± λΈŒλΌμš°μ € λ©”λͺ¨λ¦¬λ₯Ό ν™œμš©ν•΄μ„œ μ €μž₯ν•˜λŠ” μ˜μ—­μ΄λ‹€.

 

λ Œλ”λ§ μ—”μ§„

μš”μ²­λ°›μ€ λ‚΄μš©μ„ λΈŒλΌμš°μ € 화면에 ν‘œμ‹œν•˜λŠ” 녀석
(각 λΈŒλΌμš°μ €λ§ˆλ‹€ λ Œλ”λ§ 엔진이 μ‘°κΈˆμ”© λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 같은 νŽ˜μ΄μ§€λΌλ„ μ‘°κΈˆμ”© λ‹€λ₯΄κ²Œ 보일 수 μžˆμŠ΅λ‹ˆλ‹€.)

 

λ Œλ”λ§ μ—”μ§„μ˜ μ’…λ₯˜

  • Blink - 크둬 / 였페라
  • Webkit - μ‚¬νŒŒλ¦¬
  • Trident - μ΅μŠ€ν”Œλ‘œμ–΄
  • EdgeHTML - λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈ μ—£μ§€

λ Œλ”λ§ 엔진은 더 λ‚˜μ€ UXλ₯Ό μœ„ν•΄μ„œ μ΅œλŒ€ν•œ λΉ λ₯΄κ²Œ λ‚΄μš©μ„ ν‘œμ‹œν•˜λ €κ³  ν•œλ‹€.
λ”°λΌμ„œ λ Œλ”λ§ 엔진은 λ™κΈ°μ μœΌλ‘œ μ²˜λ¦¬λ˜μ§€ μ•ŠλŠ”λ‹€.

HTML 을 νŒŒμ‹±ν• λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬λŠ” 것이 μ•„λ‹ˆλΌ λ Œλ”νŠΈλ¦¬ 배치 및 그리기 과정을 μ‹œμž‘ν•œλ‹€λŠ” λœ»μ΄λ‹€.

 

λ Œλ”λ§ μ—”μ§„ λ™μž‘ κ³Όμ •

λ Œλ”λ§ μ—”μ§„ λ™μž‘μ˜ "μ‹œμž‘"은 μ„œλ²„λ‘œλΆ€ν„° 응닡받은 HTML λ¬Έμ„œλ₯Ό "μ–»λŠ”κ²ƒ"으둜 λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.
(λ¬Έμ„œμ˜ λ‚΄μš©μ€ 보톡 8KB λ‹¨μœ„λ‘œ μ „μ†‘λœλ‹€κ³  ν•©λ‹ˆλ‹€.)

λ Œλ”λ§ μ—”μ§„μ˜ λ™μž‘κ³Όμ •μ„ 예둜 λ‚˜νƒ€λ‚Έ μ‚¬μ§„μž…λ‹ˆλ‹€.

1. HTML λ¬Έμ„œ νŒŒμ‹±ν•΄μ„œ DOM 트리 생성

2. μ™ΈλΆ€ CSS 파일과 ν•¨κ»˜ ν¬ν•¨λœ μŠ€νƒ€μΌ μš”μ†Œ νŒŒμ‹±ν•΄μ„œ CSSOM 트리 생성

3. 두 결과물을 ν•©μ³μ„œ Render 트리 생성

4. λ Œλ”νŠΈλ¦¬ μ•ˆμ˜ 각각의 λ…Έλ“œμ— λŒ€ν•΄μ„œ 화면상에 어디에 λ°°μΉ˜ν• μ§€ κ²°μ •

5. UI/λ°±μ—”λ“œ μ—μ„œ 각각의 λ…Έλ“œλ₯Ό κ·Έλ €λ‚Έλ‹€.

 

HTML λ¬Έμ„œ νŒŒμ‹± -> DOM 트리 생성

DOM 은 각각의 λ§ˆν¬μ—…κ³Ό 1 : 1 관계λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

 <html>
  <body>
   <p>Hello World</p>
   <div><img src="example.png" /></div>
  </body>
</html>

μœ„μ˜ μ½”λ“œλŠ” μ•„λž˜μ˜ 사진과 같이 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

 

JS 의 처리

JS도 λ Œλ”λ§ μ—”μ§„μ—μ„œ μ²˜λ¦¬κ°€ 이루어 μ§€λŠλƒ ??
닡은 놉이닀.

JS λŠ” JS 의 엔진이 μ²˜λ¦¬ν•œλ‹€.

HTMLνŒŒμ„œκ°€ λ¬Έμ„œλ₯Ό μ²˜λ¦¬ν•˜λŠ” 쀑간에 <script> νƒœκ·Έλ₯Ό λ§Œλ‚œλ‹€λ©΄ DOM 생성과정을 μ€‘μ§€ν•˜κ³  JS μ—”μ§„μœΌλ‘œ κΆŒν•œμ„ λ„˜κΈ΄λ‹€.
JS 엔진은 받은 HTML 파일의 jsμ½”λ“œ / src 속성에 μ •μ˜λœ JS νŒŒμΌμ„ λ‘œλ“œν•˜κ³  νŒŒμ‹±ν•΄μ„œ μ‹€ν–‰ν•œλ‹€.
μ΄λ ‡κ²Œ JS의 μ²˜λ¦¬κ°€ λλ‚˜λ©΄ 전달받은 κΆŒν•œμ„ λ‹€μ‹œ HTML νŒŒμ„œλ‘œ λ„˜κΈ°λ©΄μ„œ DOM 트리λ₯Ό λ‹€μ‹œ ꡬ좕해 λ‚˜κ°„λ‹€.

 

이렇기 λ•Œλ¬Έμ— λΈŒλΌμš°μ €μ˜ λ™μž‘μ€ "동기적"으둜 이루어진닀고 말할 수 μžˆλŠ” 것이닀.
그리고 좔가적인 λΆ€λΆ„μœΌλ‘œ 이 뢀뢄이 μžˆλ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ œμ–΄ κΆŒν•œμ΄ μžˆμ„ λ•Œ Javascript μ½”λ“œκ°€ μ™„μ„±λ˜μ§€ μ•Šμ€ DOM을 μ‘°μž‘ν•˜κ²Œ λœλ‹€λ©΄ ??

λ‹Ήμ—°ν•˜κ²Œλ„ μ—λŸ¬κ°€ λ°œμƒν•˜κ³ 

μš°λ¦¬λŠ” 이것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ μ—¬νƒœ "defer"λ₯Ό λ‹¬μ•„μ„œ μ‚¬μš©μ„ ν•˜λ˜μ§€ λ˜λŠ”,

HTML νŒŒμΌμ—μ„œ Javascript μ½”λ“œλ₯Ό <body>νƒœκ·Έ ν•˜λ‹¨μ— μœ„μΉ˜μ‹œμΌœμ„œ μ‚¬μš©ν–ˆλ˜ 근본적인 μ΄μœ μ΄λ‹€.