🎨 λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ κ³Όμ •

thumb_hyeokΒ·2022λ…„ 7μ›” 31일
0

🟑 JavaScript

λͺ©λ‘ 보기
13/15
post-thumbnail

πŸ€” λΈŒλΌμš°μ € λ Œλ”λ§ 과정에 λŒ€ν•΄μ„œ

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ AJAXμ—μ„œ μ‚΄νŽ΄λ³Έ λ‚΄μš©μ— μ˜ν•˜λ©΄ AJAXλ₯Ό 톡해 λΈŒλΌμš°μ €λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„μ—κ²Œ λΉ„λ™κΈ°λ‘œ 데이터λ₯Ό μš”μ²­ν•˜κ³ , μ„œλ²„μ˜ 응닡을 λ°›μ•„, 받은 λ°μ΄ν„°λ‘œ μ›ΉνŽ˜μ΄μ§€λ₯Ό λ™μ μœΌλ‘œ κ°±μ‹ ν•˜κ²Œ λœλ‹€λŠ” 것을 μ•Œκ²Œλ˜μ—ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” μ–΄λ–€ λ°©μ‹μœΌλ‘œ 응닡을 μ£Όκ³  λ°›λŠ” 것인지, λ°›μ•„μ˜¨ 데이터λ₯Ό μ–΄λ–»κ²Œ λΈŒλΌμš°μ €κ°€ μ›Ή νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•˜λŠ” 것인지λ₯Ό μ€‘μ μ μœΌλ‘œ μ‚΄νŽ΄λ³΄μž.


🎨 κ°„λž΅ν•œ λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ •

  • Parsing
    λΈŒλΌμš°μ €μ˜ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ (μ£Όμ†Œμ°½, 뢁마크, μƒˆλ‘œκ³ μΉ¨λ²„νŠΌ λ“±λ“±)을 톡해 μ„œλ²„μ— ν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜κ³  μš”μ²­μ— 따라 ν•„μš”ν•œ html, css, javascript λ“±λ“±μ˜ νŒŒμΌμ„ λ°”μ΄νŠΈ ν˜•νƒœμ˜ μ‘λ‹΅μœΌλ‘œ λ°›λŠ”λ‹€.
    μ—¬κΈ°μ„œ html, cssλ₯Ό 각각 νŒŒμ‹±ν•΄ DOM, CSSOM을 μƒμ„±ν•œλ‹€.

νŒŒμ‹±λœ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—μ„œ DOM API λ₯Ό μ΄μš©ν•΄ DOM 을 μ‘°μž‘ν•  경우 λ Œλ” 트리λ₯Ό μž¬κ΅¬μ„±ν•˜λ©΄μ„œ μ•„λž˜μ˜ 과정듀이 λ‹€μ‹œ λ°œμƒν•  수 μžˆλ‹€.

  • Style
    λΈŒλΌμš°μ € λ Œλ”λ§ 엔진이 DOM, CSSOM 을 κ²°ν•©ν•΄ 화면에 ν‘œμ‹œλ˜μ–΄μ•Όν•  λͺ¨λ“  λ…Έλ“œμ˜ 컨텐츠, μŠ€νƒ€μΌ 정보가 ν¬ν•¨λœ λ Œλ” 트리λ₯Ό μƒμ„±ν•œλ‹€.

  • Layout (Reflow)
    μ™„μ„±λœ λ Œλ”νŠΈλ¦¬λ₯Ό 톡해 Layout 과정을 톡해 μŒ“μž„ λ§₯락의 μ•„λž˜μ— μžˆλŠ” μˆœμ„œλŒ€λ‘œ μž¬κ·€μ μœΌλ‘œ 각 λ…Έλ“œμ˜ μœ„μΉ˜μ™€ 크기λ₯Ό μΈ‘μ • κ°€λŠ₯ν•œ ν”½μ…€ λ‹¨μœ„λ‘œ κ³„μ‚°ν•œλ‹€.

  • Paint (Repaint)
    Layout κ³Όμ •μ—μ„œ κ³„μ‚°λœ 값을 μ΄μš©ν•΄ Paint 과정을 톡해 각 λ…Έλ“œλ₯Ό μŒ“μž„ λ§₯락의 μ•„λž˜μ— μžˆλŠ” μˆœμ„œλŒ€λ‘œ μž¬κ·€μ μœΌλ‘œ ν™”λ©΄μƒμ˜ μ‹€μ œ ν”½μ…€λ‘œ λ³€ν™˜ν•˜κ³  λ ˆμ΄μ•„μ›ƒκ³Ό μƒκ΄€μ—†λŠ” CSS 속성듀을 μ μš©ν•΄ μ—¬λŸ¬κ°œμ˜ λ ˆμ΄μ–΄λ“€μ„ μƒμ„±ν•œλ‹€.

  • Composite & Render

    λ ˆμ΄μ–΄λ₯Ό ν•©μ„±ν•˜μ—¬ μ‹€μ œ 화면에 λ‚˜νƒ€λ‚Έλ‹€.


🌐 μš”μ²­κ³Ό 응닡

λΈŒλΌμš°μ €μ˜ 핡심 κΈ°λŠ₯은 ν•„μš”ν•œ λ¦¬μ†ŒμŠ€(HTML, CSS, μžλ°”μŠ€ν¬λ¦½νŠΈ, 이미지. 폰트 λ“±μ˜ 정적 파일 λ˜λŠ” μ„œλ²„κ°€ λ™μ μœΌλ‘œ μƒμ„±ν•œ 데이터)λ₯Ό μ„œλ²„μ— μš”μ²­(request)ν•˜κ³  μ„œλ²„λ‘œλΆ€ν„° 응닡(response)λ°›μ•„ λΈŒλΌμš°μ €μ— μ‹œκ°μ μœΌλ‘œ λ Œλ”λ§ν•˜λŠ” 것이닀. μ„œλ²„μ— μš”μ²­μ„ 보낼 수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€ 쀑 ν•˜λ‚˜μΈ μ£Όμ†Œμ°½μ„ 톡해 μš”μ²­κ³Ό 응닡을 μ‚΄νŽ΄λ³΄μž.

λΈŒλΌμš°μ €μ˜ μ£Όμ†Œμ°½μ— URL 을 μž…λ ₯ν•˜κ³  μ—”ν„° ν‚€λ₯Ό λˆ„λ₯΄λ©΄ URL 의 호슀트 이름이 DNS λ₯Ό 톡해 IP μ£Όμ†Œλ‘œ λ³€ν™˜λ˜κ³  이 IP μ£Όμ†Œλ₯Ό κ°–λŠ” μ„œλ²„μ—κ²Œ μš”μ²­μ„ μ „μ†‘ν•œλ‹€. μ•„λž˜λŠ” URI ꡬ쑰에 κ΄€ν•œ 사진이닀.

μš”μ²­

λΈŒλΌμš°μ €μ˜ μ£Όμ†Œμ°½μ— https://naver.com λ₯Ό μž…λ ₯ν•˜κ³  μ—”ν„° ν‚€λ₯Ό λˆ„λ₯΄λ©΄ 루트 μš”μ²­(/ , μŠ€ν‚΄(scheme) , 호슀트(host) 만으둜 κ΅¬μ„±λœ URI에 μ˜ν•œ μš”μ²­)이 naver.com μ„œλ²„λ‘œ μ „μ†‘λœλ‹€. 루트 μš”μ²­μ—λŠ” λͺ…ν™•νžˆ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜λŠ” λ‚΄μš©μ΄ μ—†μ§€λ§Œ 일반적으둜 μ„œλ²„λŠ” 루트 μš”μ²­μ— λŒ€ν•΄ μ•”λ¬΅μ μœΌλ‘œ index.html을 μ‘λ‹΅ν•˜λ„λ‘ κΈ°λ³Έ μ„€μ •λ˜μ–΄μžˆλ‹€.

λ§Œμ•½ index.html 이 μ•„λ‹Œ λ‹€λ₯Έ 정적 νŒŒμΌμ„ μ„œλ²„μ— μš”μ²­ν•˜λ €λ©΄ λΈŒλΌμš°μ € μ£Όμ†Œμ°½μ— https://naver.com/assets/data/data.json 처럼 μš”μ²­ν•  정적 파일의 κ²½λ‘œμ™€ 파일 이름을 URI의 호슀트 뒀에 패슀(path)에 κΈ°μˆ ν•˜μ—¬ μ„œλ²„μ— μš”μ²­ν•œλ‹€. 그러면 μ„œλ²„λŠ” 루트 ν΄λ”μ˜ asset/data 폴더 내에 μžˆλŠ” 정적 파일 data.json 을 응닡할 것이닀.

(λ¬Όλ‘  μš°λ¦¬κ°€ μ ‘κ·Όν•  수 μžˆλŠ” μ˜¬λ°”λ₯Έ URIκ°€ λ§žλ‹€λŠ” κ°€μ •ν•˜μ—μ„œ...)


응닡

μš”μ²­κ³Ό 응닡은 개발자 λ„κ΅¬μ˜ Network νŒ¨λ„μ—μ„œ 확인할 수 μžˆλ‹€.
μœ„μ—μ„œ 보낸 루트 μš”μ²­μ— λŒ€ν•œ 정보과 μ„œλ²„μ˜ 응닡을 개발자 λ„κ΅¬μ˜ Network νŒ¨λ„μ—μ„œ μ‚΄νŽ΄λ³΄μž.

μœ„ 그림을 μ‚΄νŽ΄λ³΄λ©΄ index.html(www.naver.com) 뿐만 μ•„λ‹ˆλΌ CSS, μžλ°”μŠ€ν¬λ¦½νŠΈ, 이미지, 폰트 νŒŒμΌλ“€λ„ μ‘λ‹΅λ˜μ—ˆλ‹€. μš”μ²­λ„ ν•˜μ§€ μ•Šμ€ 이 λ¦¬μ†ŒμŠ€λ“€μ€ μ™œ μ‘λ‹΅λ˜μ—ˆμ„κΉŒ?

μ΄λŠ” λΈŒλΌμš°μ € λ Œλ”λ§ 엔진이 HTML을 νŒŒμ‹±ν•˜λŠ” 도쀑에 μ™ΈλΆ€ λ¦¬μ†ŒμŠ€λ₯Ό λ‘œλ“œν•˜λŠ” νƒœκ·Έ, 즉 CSS νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” link νƒœκ·Έ, 이미지 νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” img νƒœκ·Έ, μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό λ‘œλ“œν•˜λŠ” script νƒœκ·Έ 등을 λ§Œλ‚˜λ©΄ HTML의 νŒŒμ‹±μ„ μΌμ‹œ μ€‘λ‹¨ν•˜κ³  ν•΄λ‹Ή λ¦¬μ†ŒμŠ€ νŒŒμΌμ„ μ„œλ²„λ‘œ μš”μ²­ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.


🏷️ Parsing (HTML νŒŒμ‹±κ³Ό DOM 생성)

λΈŒλΌμš°μ € μš”μ²­μ— μ˜ν•΄ μ„œλ²„κ°€ μ‘λ‹΅ν•œ HTML λ¬Έμ„œλŠ” λ¬Έμžμ—΄λ‘œ 이루어진 μˆœμˆ˜ν•œ ν…μŠ€νŠΈλ‹€. μˆœμˆ˜ν•œ ν…μŠ€νŠΈμΈ HTML λ¬Έμ„œλ₯Ό λΈŒλΌμš°μ €μ— μ‹œκ°μ μΈ ν”½μ…€λ‘œ λ Œλ”λ§ν•˜λ €λ©΄ HTML λ¬Έμ„œλ₯Ό λΈŒλΌμš°μ €κ°€ 이해할 수 μžˆλŠ” 자료ꡬ쑰(객체)둜 λ³€ν™˜ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•΄μ•Ό ν•œλ‹€.

μ•„λž˜λŠ” λΈŒλΌμš°μ € λ Œλ”λ§ 엔진이 응닡받은 HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•˜μ—¬ DOM을 μƒμ„±ν•˜λŠ” 과정이닀.

1. μ„œλ²„μ— μ‘΄μž¬ν•˜λ˜ HTML 파일이 λΈŒλΌμš°μ €μ˜ μš”μ²­μ— μ˜ν•΄ μ‘λ‹΅λœλ‹€.

  • μ΄λ•Œ μ„œλ²„λŠ” λΈŒλΌμš°μ €κ°€ μš”μ²­ν•œ HTML νŒŒμΌμ„ 읽어 λ“€μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•œ λ‹€μŒ λ©”λͺ¨λ¦¬μ— μ €μž₯된 λ°”μ΄νŠΈ(2μ§„μˆ˜)λ₯Ό 인터넷을 κ²½μœ ν•˜μ—¬ μ‘λ‹΅ν•œλ‹€.

2. λΈŒλΌμš°μ €λŠ” μ„œλ²„κ°€ μ‘λ‹΅ν•œ HTML λ¬Έμ„œλ₯Ό λ°”μ΄νŠΈ(2μ§„μˆ˜) ν˜•νƒœλ‘œ μ‘λ‹΅λ°›λŠ”λ‹€.

  • μ‘λ‹΅λœ λ°”μ΄νŠΈ ν˜•νƒœμ˜ HTML λ¬Έμ„œλŠ” meta νƒœκ·Έμ˜ charset μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ˜ν•΄ μ§€μ •λœ 인코딩 방식(예: UTF-8)을 κΈ°μ€€μœΌλ‘œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜λœλ‹€.
  • meta νƒœκ·Έμ˜ charset μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ„ μ–Έλœ 인코딩 방식은 content-type: text/html; charset=utf-8 κ³Ό 같이 응닡 헀더에 담겨 μ‘λ‹΅λœλ‹€.

3. λ¬Έμžμ—΄λ‘œ λ³€ν™˜λœ HTML λ¬Έμ„œλ₯Ό 읽어 λ“€μ—¬ 문법적 의미λ₯Ό κ°–λŠ” μ½”λ“œμ˜ μ΅œμ†Œ λ‹¨μœ„μΈ 토큰(token) λ“€λ‘œ λΆ„ν•΄ν•œλ‹€.

4. 각 토큰듀을 객체둜 λ³€ν™˜ν•˜μ—¬ λ…Έλ“œ(node) 듀을 μƒμ„±ν•œλ‹€.

  • λ…Έλ“œλŠ” 이후 DOM을 κ΅¬μ„±ν•˜λŠ” κΈ°λ³Έ μš”μ†Œκ°€ λœλ‹€. ν† ν°μ˜ λ‚΄μš©μ— 따라 λ¬Έμ„œ λ…Έλ“œ, μš”μ†Œ λ…Έλ“œ, μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œ, ν…μŠ€νŠΈ λ…Έλ“œκ°€ μƒμ„±λœλ‹€.

5. HTML λ¬Έμ„œλŠ” HTML μš”μ†Œλ“€μ˜ μ§‘ν•©μœΌλ‘œ 이루어지며 HTML μš”μ†ŒλŠ” 쀑첩 관계λ₯Ό κ°–λŠ”λ‹€.

  • 즉, HTML μš”μ†Œμ˜ μ½˜ν…μΈ  μ˜μ—­(μ‹œμž‘ νƒœκ·Έμ™€ μ’…λ£Œ νƒœκ·Έ 사이)μ—λŠ” ν…μŠ€νŠΈλΏλ§Œ μ•„λ‹ˆλΌ λ‹€λ₯Έ HTML μš”μ†Œλ„ 포함될 수 μžˆλ‹€.
  • μ΄λ•Œ HTML μš”μ†Œ κ°„μ—λŠ” 쀑첩 관계에 μ˜ν•΄ λΆ€μž 관계가 ν˜•μ„±λœλ‹€.
  • μ΄λŸ¬ν•œ HTML μš”μ†Œ κ°„μ˜ λΆ€μž 관계λ₯Ό λ°˜μ˜ν•˜μ—¬ λͺ¨λ“  λ…Έλ“œλ“€μ„ 트리 자료ꡬ쑰둜 κ΅¬μ„±ν•œλ‹€.

이 λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λœ 트리 자료ꡬ쑰λ₯Ό DOM(Document Object Model) 이라 λΆ€λ₯Έλ‹€.


πŸ–ΌοΈ Parsing (CSS νŒŒμ‹±κ³Ό CSSOM 생성)

λ Œλ”λ§ 엔진은 μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ 과정을 톡해 HTML 을 μ²˜μŒλΆ€ν„° ν•œ 쀄씩 순차적으둜 νŒŒμ‹±ν•˜μ—¬ DOM 을 생성해 λ‚˜κ°„λ‹€. 이처럼 λ Œλ”λ§ 엔진은 DOM 을 생성해 λ‚˜κ°€λ‹€κ°€ CSSλ₯Ό λ‘œλ“œν•˜λŠ” link νƒœκ·Έλ‚˜ style νƒœκ·Έλ₯Ό λ§Œλ‚˜λ©΄ DOM 생성을 μΌμ‹œ μ€‘λ‹¨ν•œλ‹€.

그리고 link νƒœκ·Έμ˜ href μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ§€μ •λœ CSS νŒŒμΌμ„ μ„œλ²„μ— μš”μ²­ν•˜μ—¬ λ‘œλ“œν•œ CSS νŒŒμΌμ΄λ‚˜ style νƒœκ·Έ λ‚΄μ˜ CSSλ₯Ό HTMLκ³Ό λ™μΌν•œ νŒŒμ‹± 과정을 거치며 ν•΄μ„ν•˜μ—¬ CSSOM(CSS Object Model) 을 μƒμ„±ν•œλ‹€.


🌳 Style (λ Œλ” 트리 생성)

DOM κ³Ό CSSOM 은 λ Œλ”λ§μ„ μœ„ν•΄ λ Œλ” 트리(render tree) 둜 κ²°ν•©λœλ‹€.

λ Œλ” νŠΈλ¦¬λŠ” λ Œλ”λ§μ„ μœ„ν•œ 트리 ꡬ쑰의 μžλ£Œκ΅¬μ‘°μ΄λ‹€. λ”°λΌμ„œ λΈŒλΌμš°μ € 화면에 λ Œλ”λ§λ˜μ§€ μ•ŠλŠ” λ…Έλ“œμ™€ CSS에 μ˜ν•΄ λΉ„ν‘œμ‹œλ˜λŠ” λ…Έλ“œλ“€μ€ ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

이후 μ™„μ„±λœ λ Œλ” νŠΈλ¦¬λŠ” 각 HTML μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒ(μœ„μΉ˜μ™€ 크기)을 κ³„μ‚°ν•˜λŠ” 데 μ‚¬μš©λ˜λ©° λΈŒλΌμš°μ € 화면에 픽셀을 λ Œλ”λ§ν•˜λŠ” νŽ˜μΈνŒ…(painting) μ²˜λ¦¬μ— μž…λ ₯λœλ‹€.

μ§€κΈˆκΉŒμ§€ μ‚΄νŽ΄λ³Έ λΈŒλΌμš°μ € λ Œλ”λ§ 과정은 λ°˜λ³΅ν•΄μ„œ 싀행될 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜, λ ˆμ΄μ•„μ›ƒ 계산과 νŽ˜μΈνŒ…μ„ λ‹€μ‹œ μ‹€ν–‰ν•˜λŠ” λ¦¬λ Œλ”λ§μ€ λΉ„μš©μ΄ 많이 λ“œλŠ”, μ„±λŠ₯에 μ•…μ˜ν–₯을 μ£ΌλŠ” μž‘μ—…μ΄λ‹€.


πŸͺ„ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŒŒμ‹±κ³Ό μ‹€ν–‰

HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•œ κ²°κ³Όλ¬Όλ‘œμ„œ μƒμ„±λœ DOM 은 HTML λ¬Έμ„œμ˜ ꡬ쑰와 μ •λ³΄λΏλ§Œ μ•„λ‹ˆλΌ HTML μš”μ†Œμ™€ μŠ€νƒ€μΌ 등을 λ³€κ²½ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€λ‘œμ„œ DOM API λ₯Ό μ œκ³΅ν•œλ‹€.
즉, μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ—μ„œ DOM API λ₯Ό μ‚¬μš©ν•˜λ©΄ 이미 μƒμ„±λœ DOM 을 λ™μ μœΌλ‘œ μ‘°μž‘ν•  수 μžˆλ‹€.

CSS νŒŒμ‹± κ³Όμ •κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ λ Œλ”λ§ 엔진은 HTML 을 ν•œ 쀄씩 순차적으둜 νŒŒμ‹±ν•˜λ©° DOM 을 생성해 λ‚˜κ°€λ‹€ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” script νƒœκ·Έλ‚˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ½˜ν…μΈ λ‘œ 담은 script νƒœκ·Έλ₯Ό λ§Œλ‚˜λ©΄ DOM 생성을 μΌμ‹œ μ€‘λ‹¨ν•œλ‹€.

  1. script νƒœκ·Έμ˜ src μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ •μ˜λœ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ„œλ²„μ— μš”μ²­ν•˜μ—¬ λ‘œλ“œν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ΄λ‚˜ script νƒœκ·Έ λ‚΄μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό νŒŒμ‹±ν•˜κΈ° μœ„ν•΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ œμ–΄κΆŒμ„ λ„˜κΈ΄λ‹€.
  2. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό ν•΄μ„ν•˜μ—¬ AST(Abstract Syntax Tree(좔상적 ꡬ문 트리)) λ₯Ό μƒμ„±ν•œλ‹€. 그리고 AST λ₯Ό 기반으둜 인터프리터가 μ‹€ν–‰ν•  수 μžˆλŠ” 쀑간 μ½”λ“œμΈ λ°”μ΄νŠΈμ½”λ“œλ₯Ό μƒμ„±ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€.

✨ Layout(reflow) & Paint(repaint)

이제 μ™„μ„±λœ λ Œλ”νŠΈλ¦¬λ₯Ό μŒ“μž„ λ§₯락에 μ•„λž˜μ— μžˆλŠ” μˆœμ„œλŒ€λ‘œ μž¬κ·€μ μœΌλ‘œ 각 λ…Έλ“œμ˜ μœ„μΉ˜μ™€ 크기λ₯Ό μΈ‘μ • κ°€λŠ₯ν•œ ν”½μ…€ λ‹¨μœ„λ‘œ κ³„μ‚°ν•˜λŠ” Layout단계λ₯Ό κ±°μΉœλ‹€.

κ·Έ ν›„ Layout κ³Όμ •μ—μ„œ κ³„μ‚°λœ 값을 μ΄μš©ν•΄ Paint 과정을 톡해 각 λ…Έλ“œλ₯Ό μŒ“μž„ λ§₯락의 μ•„λž˜μ— μžˆλŠ” μˆœμ„œλŒ€λ‘œ μž¬κ·€μ μœΌλ‘œ ν™”λ©΄μƒμ˜ μ‹€μ œ ν”½μ…€λ‘œ λ³€ν™˜ν•˜κ³  λ ˆμ΄μ•„μ›ƒκ³Ό μƒκ΄€μ—†λŠ” CSS 속성듀을 μ μš©ν•΄ μ—¬λŸ¬κ°œμ˜ λ ˆμ΄μ–΄λ“€μ„ μƒμ„±ν•œλ‹€.

λ§Œμ•½ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ— DOM μ΄λ‚˜ CSSOM 을 λ³€κ²½ν•˜λŠ” DOM API κ°€ μ‚¬μš©λœ 경우 DOM μ΄λ‚˜ CSSOM 이 λ³€κ²½λœλ‹€. μ΄λ•Œ λ³€κ²½λœ DOM κ³Ό CSSOM 은 λ‹€μ‹œ λ Œλ” 트리둜 κ²°ν•©λ˜κ³  λ³€κ²½λœ λ Œλ” 트리λ₯Ό 기반으둜 λ ˆμ΄μ•„μ›ƒκ³Ό 페인트 과정을 κ±°μΉœλ‹€.
이λ₯Ό Layout(reflow) & Paint(repaint)라 ν•œλ‹€.

  • Layout: λ ˆμ΄μ•„μ›ƒ 계산을 λ‹€μ‹œ ν•˜λŠ” 것. λ ˆμ΄μ•„μ›ƒμ˜ 영ν–₯을 μ£ΌλŠ” 변경이 λ°œμƒν•œ κ²½μš°μ— ν•œν•΄μ„œ μ‹€ν–‰
  • Paint: μž¬κ²°ν•©λœ λ Œλ” 트리λ₯Ό 기반으둜 λ‹€μ‹œ 페인트λ₯Ό ν•˜λŠ”κ²ƒ.

λ ˆμ΄μ•„μ›ƒμ— 영ν–₯이 μ—†λŠ” 변경은 Layout 없이 Paint만 μ‹€ν–‰λœλ‹€.
이후 Composite & Render 과정을 거쳐 λ ˆμ΄μ–΄λ₯Ό ν•©μ„±ν•˜μ—¬ μ‹€μ œ 화면에 λ‚˜νƒ€λ‚Έλ‹€.


πŸ›‘ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±μ— μ˜ν•œ HTML νŒŒμ‹± 쀑단

이처럼 λΈŒλΌμš°μ €λŠ” 동기적(synchronous)으둜, 즉 μœ„μ—μ„œ μ•„λž˜ λ°©ν–₯으둜 순차적으둜 HTML, CSS, μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό νŒŒμ‹±ν•˜κ³  μ‹€ν–‰ν•œλ‹€. 이것은 script νƒœκ·Έμ˜ μœ„μΉ˜μ— 따라 HTML νŒŒμ‹±μ΄ λΈ”λ‘œν‚Ήλ˜μ–΄ DOM 생성이 지연될 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

λ§Œμ•½, script νƒœκ·Έμ— μžˆλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ DOM API λ₯Ό ν™œμš©ν•˜μ—¬ DOM 이 μ™„μ„±λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ DOM 을 μ‘°μž‘ν•˜λ©΄ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

μ΄λŸ¬ν•œ 문제점이 λ°œμƒν•˜μ§€ μ•Šκ²Œ ν•˜κΈ°μœ„ν•΄ body μš”μ†Œμ˜ κ°€μž₯ μ•„λž˜μ— μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μœ„μΉ˜μ‹œν‚€λŠ” 것이 μ’‹λ‹€. 그러면 μœ„μ˜ 문제점이 ν•΄κ²°λ˜λ©°, μžλ°”μŠ€ν¬λ¦½νŠΈ λ‘œλ”©/νŒŒμ‹±/μ‹€ν–‰μœΌλ‘œ 인해 HTML μš”μ†Œλ“€μ˜ λ Œλ”λ§μ— 지μž₯λ°›λŠ” 일이 λ°œμƒν•˜μ§€ μ•Šμ•„ νŽ˜μ΄μ§€ λ‘œλ”© μ‹œκ°„μ΄ λ‹¨μΆ•λœλ‹€.


πŸƒ script νƒœκ·Έμ˜ async/defer μ–΄νŠΈλ¦¬λ·°νŠΈ

μ•žμ—μ„œ μ‚΄νŽ΄λ³Έ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±μ— μ˜ν•œ DOM 생성이 μ€‘λ‹¨λ˜λŠ” 문제λ₯Ό 근본적으둜 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ HTML5 λΆ€ν„° script νƒœκ·Έμ— async 와 defer μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ μΆ”κ°€λ˜μ—ˆλ‹€.

async와 defer μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ HTML νŒŒμ‹±κ³Ό μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 λ‘œλ“œκ°€ 비동기적(asynchronous)으둜 λ™μ‹œμ— μ§„ν–‰λœλ‹€. ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ‹€ν–‰ μ‹œμ μ— 차이가 μžˆλ‹€.

async μ–΄νŠΈλ¦¬λ·°νŠΈ

HTML νŒŒμ‹±κ³Ό μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 ν¬λ“œκ°€ λΉ„λ™κΈ°μ μœΌλ‘œ λ™μ‹œμ— μ§„ν–‰λœλ‹€. 단, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŒŒμ‹±κ³Ό 싀행은 μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 λ‘œλ“œκ°€ μ™„λ£Œλœ 직후 μ§„ν–‰λ˜λ©°, μ΄λ•Œ HTML νŒŒμ‹±μ΄ μ€‘λ‹¨λœλ‹€.
μ—¬λŸ¬κ°œμ˜ script νƒœκ·Έμ— async μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό μ§€μ •ν•˜λ©΄ script νƒœκ·Έμ˜ μˆœμ„œμ™€λŠ” 상관없이 λ‘œλ“œκ°€ μ™„λ£Œλœ μžλ°”μŠ€ν¬λ¦½νŠΈλΆ€ν„° λ¨Όμ € μ‹€ν–‰λ˜λ―€λ‘œ μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠλŠ”λ‹€.

defer μ–΄νŠΈλ¦¬λ·°νŠΈ

μœ„μ˜ async μ–΄νŠΈλ¦¬λ·°νŠΈμ™€ κ°™μœΌλ‚˜, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŒŒμ‹±κ³Ό 싀행은 HTML νŒŒμ‹±μ΄ μ™„λ£Œλœ 직후, 즉 DOM 생성이 μ™„λ£Œλœ 직후 μ§„ν–‰λœλ‹€. (μ΄λ•Œ DOMContentLoaded 이벀트 λ°œμƒ.)
λ”°λΌμ„œ DOM 생성이 μ™„λ£Œλœ 이후 μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μžλ°”μŠ€ν¬λ¦½νŠΈμ— μœ μš©ν•˜λ‹€.


🧐 정리

  • λΈŒλΌμš°μ € λ Œλ”λ§ 과정은 크게 5λ‹¨κ³„λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

    • Parsing
    • Style
    • Layout (Reflow)
    • Paint (Repaint)
    • Composite & Render
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ DOM APIλ₯Ό 톡해 DOMμ΄λ‚˜ CSSOM을 λ³€κ²½ν•  수 μžˆλ‹€.

  • 이 κ³Όμ •μ—μ„œ λ Œλ” 트리λ₯Ό μž¬μ„±μ„±ν•˜λ©° *Layout, Paintκ°€ λ°œμƒν•˜κ³  μ΄λŠ” μ„±λŠ₯에 μ•…μ˜ν–₯을 쀄 수 μžˆλ‹€.


πŸ“– 참고자료

profile
μš°μ•„ν•œν…Œν¬μ½”μŠ€ 4κΈ° μ›Ή ν”„λ‘ νŠΈμ—”λ“œ

0개의 λŒ“κΈ€