🧐 νŒŒμ‹±(parsing)

νŒŒμ‹±(ꡬ문 뢄석)은 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ 문법에 맞게 μž‘μ„±λœ ν…μŠ€νŠΈ λ¬Έμ„œλ₯Ό 읽어 λ“€μ—¬ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ ν…μŠ€νŠΈ λ¬Έμ„œμ˜ λ¬Έμžμ—΄μ„ ν† ν°μœΌλ‘œ λΆ„ν•΄(μ–΄νœ˜ 뢄석)ν•˜κ³ , 토큰에 문법적 μ˜λ―Έμ™€ ꡬ쑰λ₯Ό λ°˜μ˜ν•˜μ—¬ 트리 ꡬ쑰의 자료ꡬ쑰인 파슀 트리λ₯Ό μƒμ„±ν•˜λŠ” 일련의 과정을 λ§ν•œλ‹€. 일반적으둜 νŒŒμ‹±μ΄ μ™„λ£Œλœ μ΄ν›„μ—λŠ” 파슀 트리λ₯Ό 기반으둜 쀑간 언어인 λ°”μ΄νŠΈμ½”λ“œλ₯Ό μƒμ„±ν•˜κ³  μ‹€ν–‰ν•œλ‹€.

🧐 λ Œλ”λ§(rendering)

λ Œλ”λ§μ€ HTML, CSS, μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μž‘μ„±λœ λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•˜μ—¬ λΈŒλΌμš°μ €μ— μ‹œκ°μ μœΌλ‘œ 좜λ ₯ν•˜λŠ” 것을 λ§ν•œλ‹€.

λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 과정은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. λΈŒλΌμš°μ €λŠ” HTML, CSS, μžλ°”μŠ€ν¬λ¦½νŠΈ, 이미지, 폰트 파일 λ“± λ Œλ”λ§μ— ν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜κ³  μ„œλ²„λ‘œλΆ€ν„° 응닡 λ°›λŠ”λ‹€.
  2. λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 엔진은 μ„œλ²„λ‘œλΆ€ν„° μ‘λ‹΅λœ HTMLκ³Ό CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ DOMκ³Ό CSSOM을 μƒμ„±ν•˜κ³  이듀을 κ²°ν•©ν•˜μ—¬ λ Œλ” 트리λ₯Ό μƒμ„±ν•œλ‹€.
  3. λΈŒλΌμš°μ €μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μ„œλ²„λ‘œλΆ€ν„° μ‘λ‹΅λœ μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό νŒŒμ‹±ν•˜μ—¬ AST(Abstrcat Syntax Tree)λ₯Ό μƒμ„±ν•˜κ³  λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€. μ΄λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” DOM APIλ₯Ό 톡해 DOMμ΄λ‚˜ CSSOM을 λ³€κ²½ν•  수 μžˆλ‹€. λ³€κ²½λœ DOMκ³Ό CSSOM은 λ‹€μ‹œ λ Œλ” 트리둜 κ²°ν•©λœλ‹€.
  4. λ Œλ” 트리λ₯Ό 기반으둜 HTML μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒ(μœ„μΉ˜μ™€ 크기)을 κ³„μ‚°ν•˜κ³  λΈŒλΌμš°μ € 화면에 HTML μš”μ†Œλ₯Ό νŽ˜μΈνŒ…ν•œλ‹€.

🌏 38.1 μš”μ²­κ³Ό 응닡

λΈŒλΌμš°μ €λŠ” ν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό μ„œλ²„μ— μš”μ²­ν•˜κ³  μ„œλ²„κ°€ μ‘λ‹΅ν•œ λ¦¬μ†ŒμŠ€λ₯Ό νŒŒμ‹±ν•˜μ—¬ λ Œλ”λ§ν•œλ‹€.

μ„œλ²„μ— μš”μ²­μ„ μ „μ†‘ν•˜κΈ° μœ„ν•΄ λΈŒλΌμš°μ €λŠ” μ£Όμ†Œμ°½μ„ μ œκ³΅ν•œλ‹€. μ£Όμ†Œμ°½μ— URL을 μž…λ ₯ν•˜κ³  μ—”ν„°ν‚€λ₯Ό λˆ„λ₯΄λ©΄ URL의 호슀트 이름이 DNSλ₯Ό 톡해 IPμ£Όμ†Œλ‘œ λ³€ν™˜λ˜κ³  이 IP μ£Όμ†Œλ₯Ό κ°–λŠ” μ„œλ²„μ—κ²Œ μš”μ²­μ„ μ „μ†‘ν•œλ‹€. μ„œλ²„λŠ” 루트 μš”μ²­μ— ν•΄λ‹Ήν•˜λŠ” νŒŒμΌμ„ μ‘λ‹΅ν•œλ‹€. λͺ…ν™•ν•œ λ¦¬μ†ŒμŠ€λ₯Ό μš”μ²­ν•˜λŠ” λ‚΄μš©μ΄ 없어도 μ„œλ²„λŠ” μ•”λ¬΅μ μœΌλ‘œ index.html νŒŒμΌμ„ μ‘λ‹΅ν•˜λ„λ‘ μ„€μ •λ˜μ–΄μžˆλ‹€.

🌏 38.2 HTTP 1.1과 HTTP 2.0

HTTP λŠ” HyperText Transfer Protocol의 μ•½μžλ‘œ μ›Ήμ—μ„œ λΈŒλΌμš°μ €μ™€ μ„œλ²„κ°€ ν†΅μ‹ ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œ(κ·œμ•½)이닀. HTTP/1.1은 기본적으둜 컀λ„₯μ…˜ ν•˜λ‚˜λ‹Ή ν•˜λ‚˜μ˜ μš”μ²­κ³Ό 응닡을 μ²˜λ¦¬ν•˜μ§€λ§Œ HTTP/2λŠ” λ‹€μ€‘μš”μ²­/응닡이 κ°€λŠ₯ν•΄ νŽ˜μ΄μ§€ λ‘œλ“œ 속도가 50%정도 λΉ λ₯΄λ‹€.

🌏 38.3 HTML νŒŒμ‹±κ³Ό DOM 생성

λΈŒλΌμš°μ € μš”μ²­μ— μ˜ν•΄ μ„œλ²„κ°€ μ‘λ‹΅ν•œ HTML λ¬Έμ„œλŠ” λ¬Έμžμ—΄λ‘œ 이루어진 순수 ν…μŠ€νŠΈμΈλ° 이λ₯Ό λΈŒλΌμš°μ €μ— λ Œλ”λ§ ν•˜κΈ° μœ„ν•΄ λΈŒλΌμš°μ €κ°€ 이해할 수 μžˆλŠ” 자료ꡬ쑰(객체)둜 λ³€ν™˜ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•΄μ•Όν•œλ‹€. λΈŒλΌμš°μ € 엔진은 μ•„λž˜μ™€ 같은 과정을 톡해 응닡받은 HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•˜μ—¬ λΈŒλΌμš°μ €κ°€ 이해할 수 μžˆλŠ” 자료ꡬ쑰인 DOM(Document Object Model)을 μƒμ„±ν•œλ‹€.

  1. μ„œλ²„μ— μ‘΄μž¬ν•˜λ˜ HTML 파일이 λΈŒλΌμš°μ €μ˜ μš”μ²­μ— μ˜ν•΄ μ‘λ‹΅λœλ‹€. μ΄λ•Œ μ„œλ²„λŠ” λΈŒλΌμš°μ €κ°€ μš”μ²­ν•œ HTML νŒŒμΌμ„ 읽어 λ“€μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯ν•œ λ‹€μŒ λ©”λͺ¨λ¦¬μ— μ €μž₯된 λ°”μ΄νŠΈ(2μ§„μˆ˜)λ₯Ό 인터넷을 κ²½μœ ν•˜μ—¬ μ‘λ‹΅ν•œλ‹€.
  2. λΈŒλΌμš°μ €λŠ” μ„œλ²„κ°€ μ‘λ‹΅ν•œ HTML λ¬Έμ„œλ₯Ό λ°”μ΄νŠΈ(2μ§„μˆ˜) ν˜•νƒœλ‘œ μ‘λ‹΅λ°›λŠ”λ‹€. 그리고 μ‘λ‹΅λœ λ°”μ΄νŠΈ ν˜•νƒœμ˜ HTML λ¬Έμ„œλŠ” meta νƒœκ·Έμ˜ charset μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ˜ν•΄ μ§€μ •λœ 인코딩 방식(ex : UTF-8)을 κΈ°μ€€μœΌλ‘œ λ¬Έμžμ—΄λ‘œ λ³€ν™˜λœλ‹€. 참고둜 meta νƒœκ·Έμ˜ charset μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ„ μ–Έλœ 인코딩 방식(ex : UTF-8)은 content-type : text/html; charset=utf-8κ³Ό 같이 응닡 헀더에 담겨 μ‘λ‹΅λœλ‹€. λΈŒλΌμš°μ €λŠ” 이λ₯Ό ν™•μΈν•˜κ³  λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•œλ‹€.
  3. λ¬Έμžμ—΄λ‘œ λ³€ν™˜λœ HTML λ¬Έμ„œλ₯Ό 읽어듀여 문법적 의미λ₯Ό κ°–λŠ” μ½”λ“œμ˜ μ΅œμ†Œ λ‹¨μœ„μΈ 토큰(token)λ“€λ‘œ λΆ„ν•΄ν•œλ‹€.
  4. 각 토큰듀을 객체둜 λ³€ν™˜ν•˜μ—¬ λ…Έλ“œ(node)λ₯Ό μƒμ„±ν•œλ‹€. ν† ν°μ˜ λ‚΄μš©μ— 따라 λ¬Έμ„œ λ…Έλ“œ, μš”μ†Œ λ…Έλ“œ, μ–΄νŠΈλ¦¬λ·°νŠΈ λ…Έλ“œ, ν…μŠ€νŠΈ λ…Έλ“œκ°€ μƒμ„±λœλ‹€. λ…Έλ“œλŠ” 이후 DOM을 κ΅¬μ„±ν•˜λŠ” κΈ°λ³Έ μš”μ†Œκ°€ λœλ‹€.
  5. HTML λ¬Έμ„œλŠ” HTML μš”μ†Œλ“€μ˜ μ§‘ν•©μœΌλ‘œ 이루어지며 HTML μš”μ†ŒλŠ” 쀑첩 관계λ₯Ό κ°–λŠ”λ‹€. 즉, HTML μš”μ†Œμ˜ μ½˜ν…μΈ  μ˜μ—­(μ‹œμž‘ νƒœκ·Έμ™€ μ’…λ£Œ νƒœκ·Έ 사이)μ—λŠ” ν…μŠ€νŠΈλΏλ§Œ μ•„λ‹ˆλΌ λ‹€λ₯Έ HTML μš”μ†Œλ„ 포함될 수 μžˆλ‹€. μ΄λ•Œ HTML μš”μ†Œ κ°„μ—λŠ” 쀑첩 관계에 μ˜ν•΄ λΆ€μž 관계가 ν˜•μ„±λœλ‹€. μ΄λŸ¬ν•œ HTML μš”μ†Œ κ°„μ˜ λΆ€μž 관계λ₯Ό λ°˜μ˜ν•˜μ—¬ λͺ¨λ“  λ…Έλ“œλ“€μ„ 트리 자료ꡬ쑰둜 κ΅¬μ„±ν•œλ‹€. 이 λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λœ 트리 자료ꡬ쑰λ₯Ό DOM이라고 ν•œλ‹€.

즉, DOM은 HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•œ 결과물이닀.

🌏 38.4 CSS νŒŒμ‹±κ³Ό CSSOM 생성

λ Œλ”λ§ 엔진은 HTML을 μ²˜μŒλΆ€ν„° ν•œ 쀄씩 순차적으둜 νŒŒμ‹±ν•˜μ—¬ DOM을 생성해 λ‚˜κ°„λ‹€. 이처럼 λ Œλ”λ§ 엔진은 DOM을 생성해 λ‚˜κ°€λ‹€κ°€ CSSλ₯Ό λ‘œλ“œν•˜λŠ” link νƒœκ·Έλ‚˜ style νƒœκ·Έλ₯Ό λ§Œλ‚˜λ©΄ DOM 생성을 μΌμ‹œ μ€‘λ‹¨ν•œλ‹€. 그리고 link νƒœκ·Έμ˜ href μ–΄νŠΈλ¦¬λ·°νŠΈμ— μ§€μ •λœ CSS νŒŒμΌμ„ μ„œλ²„μ— μš”μ²­ν•˜μ—¬ λ‘œλ“œν•œ CSS νŒŒμΌμ΄λ‚˜ style νƒœκ·Έ λ‚΄μ˜ CSSλ₯Ό HTMLκ³Ό λ™μΌν•œ νŒŒμ‹± κ³Όμ •(λ°”μ΄νŠΈ β†’ 문자 β†’ 토큰 β†’ λ…Έλ“œ β†’ CSSOM)을 거치며 ν•΄μ„ν•˜μ—¬ CSSOM을 μƒμ„±ν•œλ‹€. 이후 CSS νŒŒμ‹±μ„ μ™„λ£Œν•˜λ©΄ HTML νŒŒμ‹±μ΄ μ€‘λ‹¨λœ 지점뢀터 λ‹€μ‹œ HTML을 νŒŒμ‹±ν•˜κΈ° μ‹œμž‘ν•˜μ—¬ DOM 생성을 μž¬κ°œν•œλ‹€.

🌏 38.5 λ Œλ” 트리 생성

λ Œλ”λ§ 엔진은 μ„œλ²„λ‘œλΆ€ν„° μ‘λ‹΅λœ HTMLκ³Ό CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ 각각 DOMκ³Ό CSSOMλ₯Ό μƒμ„±ν•œλ‹€. 그리고 DOMκ³Ό CSSOM은 λ Œλ” 트리둜 κ²°ν•©λœλ‹€. λ Œλ” νŠΈλ¦¬λŠ” λ Œλ”λ§μ„ μœ„ν•œ νŠΈλ¦¬ν˜•νƒœμ˜ 자료ꡬ쑰이며 λΈŒλΌμš°μ € 화면에 λ Œλ”λ§λ˜λŠ” λ…Έλ“œλ“€λ‘œ κ΅¬μ„±λ˜μ–΄μžˆλ‹€. λ Œλ” νŠΈλ¦¬λŠ” 각 HTML μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒ(μœ„μΉ˜μ™€ 크기)을 κ³„μ‚°ν•˜λŠ”λ° μ‚¬μš©λ˜λ©° λΈŒλΌμš°μ € 화면에 픽셀을 λ Œλ”λ§ν•˜λŠ” 페인트 μ²˜λ¦¬μ— μž…λ ₯λœλ‹€.

λΈŒλΌμš°μ €μ˜ λ Œλ”λ§ 과정은 λ‹€μŒκ³Ό 같은 경우 λ°˜λ³΅ν•΄μ„œ μ‹€ν–‰ν• μˆ˜ μžˆλ‹€.

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ— μ˜ν•œ λ…Έλ“œ μΆ”κ°€ λ˜λŠ” μ‚­μ œ
  • λΈŒλΌμš°μ € 창의 리사이징에 μ˜ν•œ 뷰포트 크기 λ³€κ²½
  • HTML μš”μ†Œμ˜ λ ˆμ΄μ•„μ›ƒ(μœ„μΉ˜, 크기)에 변경을 λ°œμƒμ‹œν‚€λŠ” width, height, margin, padding, border, display, position λ“±μ˜ μŠ€νƒ€μΌ λ³€κ²½

λ ˆμ΄μ•„μ›ƒ 계산과 νŽ˜μΈνŒ…μ„ λ‹€μ‹œ μ‹€ν–‰ν•˜λŠ” λ¦¬λ Œλ”λ§μ€ λΉ„μš©μ΄ λ§Žμ΄λ“œλŠ”, 즉 μ„±λŠ₯에 μ•…μ˜ν–₯을 μ£ΌλŠ” μž‘μ—…μ΄λ―€λ‘œ μ£Όμ˜ν•  ν•„μš”κ°€ μžˆλ‹€.

🌏 38.6 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±κ³Ό μ‹€ν–‰

λ Œλ”λ§ 엔진은 DOM을 μƒμ„±ν•˜λŠ” 도쀑에 script νƒœκ·Έλ₯Ό λ§Œλ‚˜λ©΄ DOM 생성을 μ€‘λ‹¨ν•˜κ³  μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ„œλ²„μ˜ μš”μ²­ν•˜μ—¬ λ‘œλ“œν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ΄λ‚˜ script의 μ½”λ“œλ“€μ„ μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—κ²Œ μ œμ–΄κΆŒμ„ λ„˜κΈ΄λ‹€. 이후 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±κ³Ό 싀행이 μ’…λ£Œλ˜λ©΄ λ Œλ”λ§ μ—”μ§„μœΌλ‘œ λ‹€μ‹œ μ œμ–΄κΆŒμ„ λ„˜κ²¨ HTML νŒŒμ‹±μ΄ μ€‘λ‹¨λœ 지점뢀터 λ‹€μ‹œ HTML을 μ‹œμž‘ν•˜μ—¬ DOM 생성을 μž¬κ°œν•œλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μ½”λ“œλ₯Ό νŒŒμ‹±ν•˜μ—¬ CPUκ°€ 이해할 수 μžˆλŠ” μ €μˆ˜μ€€ μ–Έμ–΄λ‘œ λ³€ν™˜ν•˜κ³  μ‹€ν–‰ν•œλ‹€.

λ Œλ”λ§ 엔진이 HTMLκ³Ό CSSνŒŒμΌμ„ νŒŒμ‹±ν•˜μ—¬ DOMκ³Ό CSSOM을 μƒμ„±ν•˜λ“―μ΄ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό ν•΄μ„ν•˜μ—¬ AST(Absrcact Syntax Tree)λ₯Ό μƒμ„±ν•œλ‹€. 그리고 ASTλ₯Ό 기반으둜 μΈν„°νŒŒλ¦¬ν„°κ°€ μ‹€ν–‰ν•  수 μžˆλŠ” 쀑간 μ½”λ“œμΈ λ°”μ΄νŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€.

  • ν† ν¬λ‚˜μ΄μ§• λ‹¨μˆœν•œ λ¬Έμžμ—΄μΈ μžλ°”μŠ€ν¬λ¦½νŠΈ μ†ŒμŠ€μ½”λ“œλ₯Ό μ–΄νœ˜ λΆ„μ„ν•˜μ—¬ 문법적 의미λ₯Ό κ°–λŠ” μ½”λ“œμ˜ μ΅œμ†Œ λ‹¨μœ„μΈ ν† ν°λ“€λ‘œ λΆ„ν•΄ν•œλ‹€.
  • νŒŒμ‹± ν† ν°λ“€μ˜ 집합을 ꡬ문 λΆ„μ„ν•˜μ—¬ AST(좔상적 ꡬ문 트리)λ₯Ό μƒμ„±ν•œλ‹€. ASTλŠ” 토큰에 문법적 μ˜λ―Έμ™€ ꡬ쑰λ₯Ό λ°˜μ˜ν•œ 트리 ꡬ쑰의 μžλ£Œκ΅¬μ‘°λ‹€.
  • λ°”μ΄νŠΈμ½”λ“œ 생성과 μ‹€ν–‰ νŒŒμ‹±μ˜ κ²°κ³Όλ¬Όλ‘œμ„œ μƒμ„±λœ ASTλŠ” 인터프리터가 μ‹€ν–‰ν•  수 μžˆλŠ” μ€‘κ°„μ½”λ“œμΈ λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜λ˜κ³  인터프리터에 μ˜ν•΄ μ‹€ν–‰λœλ‹€.

🌏 38.7 λ¦¬ν”Œλ‘œμš°μ™€ 리페인트

λ§Œμ•½ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ— DOMμ΄λ‚˜ CSSOM을 λ³€κ²½ν•˜λŠ” DOM APIκ°€ μ‚¬μš©λœ 경우 DOMμ΄λ‚˜ CSSOM이 λ³€κ²½λœλ‹€. μ΄λ•Œ λ³€κ²½λœ DOMκ³Ό CSSOM은 λ‹€μ‹œ λ Œλ” 트리둜 κ²°ν•©λ˜κ³  λ³€κ²½λœ λ Œλ” 트리λ₯Ό 기반으둜 λ ˆμ΄μ•„μ›ƒκ³Ό 페인트 과정을 거쳐 λΈŒλΌμš°μ €μ˜ 화면에 λ‹€μ‹œ λ Œλ”λ§ν•œλ‹€. 이λ₯Ό λ¦¬ν”Œλ‘œμš°, 리페인트라 ν•œλ‹€.

λ¦¬ν”Œλ‘œμš°λŠ” λ ˆμ΄μ•„μ›ƒ 계산을 λ‹€μ‹œ ν•˜λŠ”κ²ƒμ„ λ§ν•˜λ©°, λ¦¬νŽ˜μΈνŠΈλŠ” μž¬κ²°ν•©λœ λ Œλ” 트리λ₯Ό 기반으둜 λ‹€μ‹œ 페인트λ₯Ό ν•˜λŠ”κ²ƒμ„ λ§ν•œλ‹€.

λ”°λΌμ„œ λ¦¬ν”Œλ‘œμš°μ™€ λ¦¬νŽ˜μΈνŠΈκ°€ λ°˜λ“œμ‹œ 순차적으둜 λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것은 μ•„λ‹ˆλ©° λ ˆμ΄μ•„μ›ƒμ— 영ν–₯이 μ—†λŠ” 변경은 λ¦¬ν”Œλ‘œμš° 없이 리페인트만 μ‹€ν–‰λœλ‹€.

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

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

DOM이 μ™„μ„±λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ DOM을 μ‘°μž‘ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•  수 있으며, μžλ°”μŠ€ν¬λ¦½νŠΈ λ‘œλ”©/νŒŒμ‹±/μ‹€ν–‰μœΌλ‘œ 인해 HTML μš”μ†Œλ“€μ˜ λ Œλ”λ§μ— 지μž₯받지 μ•Šκ²Œ ν•˜κΈ° μœ„ν•΄ body μš”μ†Œμ˜ κ°€μž₯ μ•„λž˜μ— μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό μœ„μΉ˜μ‹œν‚€λŠ”κ²ƒμ΄ μ’‹λ‹€.

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

μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμ‹±μ— μ˜ν•œ DOM 생성이 쀑단(blocking)λ˜λŠ” 문제λ₯Ό 근본적으둜 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ HTML5λΆ€ν„° script νƒœκ·Έμ— async와 defer μ–΄νŠΈλ¦¬λ·°νŠΈκ°€ μΆ”κ°€λ˜μ—ˆλ‹€. async와 defer μ–΄νŠΈλ¦¬λ·°νŠΈλŠ” μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λ‘œλ“œν•˜λŠ” κ²½μš°μ—λ§Œ μ‚¬μš©ν•  수 있고, μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 μ½”λ“œκ°€ λΉ„λ™κΈ°μ μœΌλ‘œ μ§„ν–‰λ˜λ„λ‘ ν•œλ‹€. ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‹€ν–‰ μ‹œμ μ— 차이가 μžˆλ‹€.

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

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

    async μ–΄νŠΈλ¦¬λ·°νŠΈμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ HTML νŒŒμ‹±κ³Ό μ™ΈλΆ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 파일의 λ‘œλ“œκ°€ λΉ„λ™κΈ°μ μœΌλ‘œ λ™μ‹œμ— μ§„ν–‰λœλ‹€. 단, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ νŒŒμ‹±κ³Ό 싀행은 HTML νŒŒμ‹±μ΄ μ™„λ£Œλœ 직후, 즉 DOM 생성이 μ™„λ£Œλœ 직후(μ΄λ•Œ DOMContentLoaded μ΄λ²€νŠΈκ°€ λ°œμƒν•œλ‹€.) μ§„ν–‰λœλ‹€. λ”°λΌμ„œ DOM 생성이 μ™„λ£Œλœ 직후 μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μžλ°”μŠ€ν¬λ¦½νŠΈμ— μœ μš©ν•˜λ‹€.
profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보