diff --git "a/docs/38_\353\270\214\353\235\274\354\232\260\354\240\200\354\235\230 \353\240\214\353\215\224\353\247\201 \352\263\274\354\240\225/\354\235\264\353\202\230\353\246\260.md" "b/docs/38_\353\270\214\353\235\274\354\232\260\354\240\200\354\235\230 \353\240\214\353\215\224\353\247\201 \352\263\274\354\240\225/\354\235\264\353\202\230\353\246\260.md" index a6b5a7a4..ee3ee925 100644 --- "a/docs/38_\353\270\214\353\235\274\354\232\260\354\240\200\354\235\230 \353\240\214\353\215\224\353\247\201 \352\263\274\354\240\225/\354\235\264\353\202\230\353\246\260.md" +++ "b/docs/38_\353\270\214\353\235\274\354\232\260\354\240\200\354\235\230 \353\240\214\353\215\224\353\247\201 \352\263\274\354\240\225/\354\235\264\353\202\230\353\246\260.md" @@ -1,8 +1,11 @@ # 🎯 38 λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ κ³Όμ • [38.1 μš”μ²­κ³Ό 응닡](#1-μš”μ²­κ³Ό-응닡) -[38.2 HTTP 1.1κ³Ό HTTP 2.0](#2-http-11κ³Ό-http-20) -[38.3 HTML νŒŒμ‹±κ³Ό DOM 생성](#3-html-νŒŒμ‹±κ³Ό-dom-생성) +[38.2 HTTP 1.1κ³Ό HTTP 2.0](#2-http-11κ³Ό-http-20) +[38.3 HTML νŒŒμ‹±κ³Ό DOM 생성](#3-html-νŒŒμ‹±κ³Ό-dom-생성) +[38.4 CSS νŒŒμ‹±κ³Ό CSSOM 생성](#4-css-νŒŒμ‹±κ³Ό-cssom-생성) +[38.5 λ Œλ” 트리 생성](#5-λ Œλ”-트리-생성) +[38.6 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±κ³Ό μ‹€ν–‰](#6-μžλ°”μŠ€ν¬λ¦½νŠΈ-νŒŒμ‹±κ³Ό-μ‹€ν–‰) ## 0. λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ κ³Όμ • @@ -54,3 +57,72 @@ λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 엔진은 HTML νŒŒμ‹± 과정을 거쳐 λΈŒλΌμš°μ €κ°€ 이해할 수 μžˆλŠ” 자료ꡬ쑰인 DOM을 μƒμ„±ν•œλ‹€. **DOM은 HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•œ 결과물이닀.** + +## 4. CSS νŒŒμ‹±κ³Ό CSSOM 생성 + +λ Œλ”λ§ 엔진은 HTML을 μ²˜μŒλΆ€ν„° ν•œ 쀄씩 νŒŒμ‹±ν•˜μ—¬ DOM을 생성해 λ‚˜κ°„λ‹€. DOM을 생성해 λ‚˜κ°€λ‹€κ°€ CSSλ₯Ό λ‘œλ“œν•˜λŠ” link νƒœκ·Έλ‚˜ style νƒœκ·Έλ₯Ό λ§Œλ‚˜λ©΄ DOM 생성을 μΌμ‹œ μ€‘λ‹¨ν•œλ‹€. κ·Έ ν›„ link νƒœκ·Έμ˜ href μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ§€μ •λœ CSS νŒŒμΌμ„ μ„œλ²„μ— μš”μ²­ν•˜μ—¬ λ‘œλ“œν•œ CSS νŒŒμΌμ΄λ‚˜ style νƒœκ·Έ λ‚΄μ˜ CSSλ₯Ό HTMLκ³Ό λ™μΌν•œ νŒŒμ‹± 과정을 거치며 ν•΄μ„ν•˜μ—¬ CSSOM(CSS Object Model)을 μƒμ„±ν•œλ‹€. CSS νŒŒμ‹±μ„ μ™„λ£Œν•˜λ©΄ HTML νŒŒμ‹±μ΄ μ€‘λ‹¨λœ 지점뢀터 λ‹€μ‹œ νŒŒμ‹±ν•˜κΈ° μ‹œμž‘ν•΄ DOM 생성을 μž¬κ°œν•œλ‹€. + +```html + + + + + + ... + + +``` + +λ Œλ”λ§ 엔진은 meta νƒœκ·ΈκΉŒμ§€ 순차적으둜 ν•΄μ„ν•œ λ‹€μŒ, link νƒœκ·Έλ₯Ό λ§Œλ‚˜λ©΄ CSS νŒŒμΌμ„ μ„œλ²„μ— μš”μ²­ν•œλ‹€. + +μ„œλ²„λ‘œλΆ€ν„° CSS 파일이 μ‘λ‹΅λ˜λ©΄ λ Œλ”λ§ 엔진은 HTMLκ³Ό λ™μΌν•œ 해석 과정을 거쳐 CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ CSSOM을 μƒμ„±ν•œλ‹€. + +CSSOM은 CSS 상속을 λ°˜μ˜ν•˜μ—¬ μƒμ„±λœλ‹€. + +```css +body { + font-size: 18px; +} + +ul { + list-style-type: none; +} +``` + +πŸ‘‰πŸ» body μš”μ†Œμ— μ μš©ν•œ font-size ν”„λ‘œνΌν‹°μ™€ ul μš”μ†Œμ— μ μš©ν•œ list-style-type ν”„λ‘œνΌν‹°λŠ” λͺ¨λ“  li μš”μ†Œμ— μƒμ†λ˜κ³ , μ΄λŸ¬ν•œ 상속 관계가 λ°˜μ˜λ˜μ–΄ CSSOM이 μƒμ„±λœλ‹€. + +## 5. λ Œλ” 트리 생성 + +νŒŒμ‹±μ„ 거쳐 μƒμ„±λœ DOMκ³Ό CSSOM은 λ Œλ”λ§μ„ μœ„ν•΄ λ Œλ” 트리둜 κ²°ν•©λœλ‹€. + +λ Œλ” νŠΈλ¦¬λŠ” λ Œλ”λ§μ„ μœ„ν•œ 트리 ꡬ쑰의 자료ꡬ쑰둜, λΈŒλΌμš°μ € 화면에 λ Œλ”λ§λ˜μ§€ μ•ŠλŠ” λ…Έλ“œμ™€ CSS에 μ˜ν•΄ λΉ„ν‘œμ‹œλ˜λŠ” λ…Έλ“œλ“€μ„ μ œμ™Έν•˜κ³  λΈŒλΌμš°μ € 화면에 λ Œλ”λ§λ˜λŠ” λ…Έλ“œλ§ŒμœΌλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. + +μ™„μ„±λœ λ Œλ” νŠΈλ¦¬λŠ” 각 HTML μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒμ„ κ³„μ‚°ν•˜λŠ”λ° μ‚¬μš©λ˜λ©° λΈŒλΌμš°μ € 화면에 픽셀을 λ Œλ”λ§ν•˜λŠ” νŽ˜μΈνŒ… μ²˜λ¦¬μ— μž…λ ₯λœλ‹€. + +μ•„λž˜μ™€ 같은 경우, λ ˆμ΄μ•„μ›ƒ 계산과 νŽ˜μΈνŒ…μ΄ 재차 μ‹€ν–‰λ˜λ©° λ Œλ”λ§ 과정이 λ°˜λ³΅ν•΄μ„œ 싀행될 수 μžˆλ‹€. + +- μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ˜ν•œ λ…Έλ“œ μΆ”κ°€ λ˜λŠ” μ‚­μ œ +- λΈŒλΌμš°μ € 창의 리사이징에 μ˜ν•œ 뷰포트 크기 λ³€κ²½ +- HTML μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒμ— 변경을 λ°œμƒμ‹œν‚€λŠ” μŠ€νƒ€μΌ λ³€κ²½ + +πŸ‘‰πŸ» λ¦¬λ Œλ”λ§μ€ λΉ„μš©μ΄ λ§Žμ΄λ“€μ–΄ μ„±λŠ₯에 μ•…μ˜ν–₯을 μ£ΌλŠ” μž‘μ—…μ΄λ―€λ‘œ, 가급적 λΉˆλ²ˆν•˜κ²Œ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€. + +## 6. μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±κ³Ό μ‹€ν–‰ + +HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•΄ μƒμ„±λœ DOM은 HTML λ¬Έμ„œμ˜ ꡬ쑰와 μ •λ³΄λ§Œμ΄ μ•„λ‹ˆλΌ μš”μ†Œμ™€ μŠ€νƒ€μΌ 등을 λ³€κ²½ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€λ‘œμ„œ DOM APIλ₯Ό μ œκ³΅ν•œλ‹€. (39μž₯μ—μ„œ 계속) + +CSS νŒŒμ‹± κ³Όμ •κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ Œλ”λ§ 엔진은 HTML을 순차적으둜 νŒŒμ‹±ν•˜λ©° DOM을 μƒμ„±ν•΄λ‚˜κ°€λ‹€ script νƒœκ·Έλ₯Ό λ§Œλ‚˜λ©΄ DOM 생성을 μΌμ‹œ μ€‘λ‹¨ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ„œλ²„μ— μš”μ²­ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔지에 μ œμ–΄κΆŒμ„ λ„˜κΈ΄λ‹€. 이후 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±κ³Ό 싀행이 μ’…λ£Œλ˜λ©΄ HTML νŒŒμ‹±μ΄ μ€‘λ‹¨λœ 지점뢀터 λ‹€μ‹œ νŒŒμ‹±μ„ μ‹œμž‘ν•΄ DOM 생성을 μž¬κ°œν•œλ‹€. (CSS νŒŒμ‹± κ³Όμ •κ³Ό κ°™λ‹€.) + +μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν•΄μ„ν•˜μ—¬ AST(좔상적 ꡬ문 트리, Abstract Syntax Tree)λ₯Ό μƒμ„±ν•œλ‹€. 그리고 ASTλ₯Ό 기반으둜 인터프리터가 μ‹€ν–‰ν•  수 μžˆλŠ” 쀑간 μ½”λ“œμΈ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μƒμ„±ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€. + +**ν† ν¬λ‚˜μ΄μ§• (Tokenizing)** + +λ‹¨μˆœ λ¬Έμžμ—΄μΈ μžλ°”μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€μ½”λ“œλ₯Ό μ–΄νœ˜ 뢄석해 문법적 의미λ₯Ό κ°–λŠ” μ½”λ“œμ˜ μ΅œμ†Œ λ‹¨μœ„μΈ ν† ν°λ“€λ‘œ λΆ„ν•΄ν•œλ‹€. + +**νŒŒμ‹± (Parsing)** + +ν† ν°λ“€μ˜ 집합을 ꡬ문 λΆ„μ„ν•˜μ—¬ ASTλ₯Ό μƒμ„±ν•œλ‹€. + +**λ°”μ΄νŠΈμ½”λ“œ 생성과 μ‹€ν–‰** + +νŒŒμ‹±μ˜ κ²°κ³Όλ¬Όλ‘œμ„œ μƒμ„±λœ ASTλŠ” 인터프리터가 μ‹€ν–‰ν•  수 μžˆλŠ” 쀑간 μ½”λ“œμΈ λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜λ˜κ³  인터프리터에 μ˜ν•΄ μ‹€ν–‰λœλ‹€.