🌐 μ›ΉνŽ˜μ΄μ§€λ₯Ό ν‘œμ‹œν•œλ‹€λŠ” 것: λΈŒλΌμš°μ €λŠ” μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”κ°€

두선아 DusunaΒ·2025λ…„ 4μ›” 15일

🐢 κ°œμš”

λΈŒλΌμš°μ €λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ!

  • UI λ Œλ”λ§, 이벀트 처리, JS μ‹€ν–‰ 등이 λͺ¨λ‘ 메인 μŠ€λ ˆλ“œμ—μ„œ 처리됨.
  • 무거운 μž‘μ—…μ΄ 메인 μŠ€λ ˆλ“œλ₯Ό μ μœ ν•˜λ©΄ μ‚¬μš©μž μƒν˜Έμž‘μš©μ΄ 지연됨. (μ§€μ—° Latency λ°œμƒ)

πŸ’‘ κ°œμ„  아이디어

  • μƒν˜Έμž‘μš© 보μž₯: 큰 μš”μ²­μ€ λ‚˜λˆ μ„œ, ν•„μˆ˜ λ¦¬μ†ŒμŠ€λ₯Ό λ¨Όμ € νŒ¨μΉ­ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” λ‘œλ”© UI와 ν•¨κ»˜ 보여쀄 수 μžˆλ‹€.
  • 메인 μŠ€λ ˆλ“œμ˜ μ±…μž„ 쀄이기: λžœλ”λ§μ΄ μ§€μ—°λ˜λŠ” ν˜„μƒμ΄ λ°œμƒν•œλ‹€λ©΄? λΈŒλΌμš°μ €κ°€ μ‹±κΈ€ μ“°λ ˆλ“œμΈ 점을 μƒκ°ν•˜μ—¬ ν”„λ‘œνŒŒμΌλŸ¬μ—μ„œ μ μœ ν•˜κ³  μžˆλŠ” νŠΉμ • 슀크립트의 이름을 ν™•μΈν•˜κ³  이λ₯Ό 디버깅할 수 μžˆλ‹€.

λΉ λ₯΄κ²Œ λ‘œλ”©ν•˜κΈ° μœ„ν•œ μ „λž΅

1. λΉ λ₯΄κ²Œ μš”μ²­ν•˜κΈ°

  • HTML νŒŒμ‹± 쀑 <link>, <script>(defer와 asyncκ°€ μžˆλŠ” 경우) 와 같은 λ¦¬μ†ŒμŠ€λ₯Ό λ§Œλ‚˜λ©΄ νŒŒμ‹± 도쀑에 μš”μ²­λ¨
  • μ€‘μš”ν•œ λ¦¬μ†ŒμŠ€λŠ” μš°μ„ μˆœμœ„(priority) λ˜λŠ” ν”„λ¦¬νŽ˜μΉ˜(prefetch)λ₯Ό ν™œμš©

2. μ€‘μš”ν•œ λ¦¬μ†ŒμŠ€λŠ” 미리/λ¨Όμ € μš”μ²­

  • rel="preload": λͺ…μ‹œμ μœΌλ‘œ μš°μ„  λ‘œλ”©ν•  λ¦¬μ†ŒμŠ€λ₯Ό μ§€μ •
  • rel="prefetch": λ‚˜μ€‘μ— ν•„μš”ν•  λ¦¬μ†ŒμŠ€λ₯Ό 미리 받아두기
  • 화면을 κ·Έλ¦¬λŠ” 데 ν•„μš”ν•œ CSS/JSλŠ” κ°€λŠ₯ν•œ 초기 14KB에 포함해 TTFB 이후 λΉ λ₯΄κ²Œ νŒŒμ‹±ν•  것

πŸ“‘ 탐색(Navigation)

DNS 쑰회(DNS Lookup)

  1. URL μž…λ ₯ / 링크 클릭 / 폼 제좜 이 λ°œμƒν–ˆμ„ λ•Œ
  2. DNS 쑰회 (졜초 λ°©λ¬Έ μ‹œ)
    • ν΄λΌμ΄μ–ΈνŠΈ β†’ DNS μ„œλ²„ β†’ IP μ£Όμ†Œ λ°˜ν™˜
    • λ§Œμ•½ 졜초 방문이 μ•„λ‹ˆλΌλ©΄ μΊμ‹±λœ IP 검색

TCP Handshake

  • SYN β†’ SYN-ACK β†’ ACK
  • TCP μ†ŒμΌ“ 연결을 λ§ΊκΈ° μœ„ν•œ 3-way handshake

TLS Handshake (HTTPS)

  • ClientHello β†’ ServerHello + μΈμ¦μ„œ β†’ clientKey β†’ μ•”ν˜Έν™” μ„€μ • μ™„λ£Œ
  • TLS μ„Έμ…˜ μž¬μ‚¬μš© μ‹œ Session ID or Ticket둜 λΉ λ₯΄κ²Œ μž¬μ—°κ²°(ClientHello에 Session Ticket을 ν™•μž₯ ν•„λ“œμ— ν¬ν•¨ν•˜μ—¬ 보냄)

πŸ“¬ 응닡(Response)

TTFB (Time to First Byte)

  • TCPκ°€ μ—°κ²°λ˜κ³  λ‚˜λ©΄, HTTP GET μš”μ²­μ„ 보냄. 이 μš”μ²­μ˜ 첫 응닡 λ°”μ΄νŠΈκ°€ λ„λ‹¬ν•˜κΈ°κΉŒμ§€μ˜ μ‹œκ°„

TCP μ„Έκ·Έλ¨ΌνŠΈ:

  • TCPλŠ” 데이터λ₯Ό 포트 번호, μ‹œν€€μŠ€ 번호, ν”Œλž˜κ·Έ λ“± TCP 헀더λ₯Ό λΆ™μ—¬μ„œ ν•¨κ»˜ μ„Έκ·Έλ¨ΌνŠΈλ‘œ λ‚˜λˆ„μ–΄ 전솑.
  • μ„Έκ·Έλ¨ΌνŠΈλŠ” IP κ³„μΈ΅μœΌλ‘œ μ „λ‹¬λ˜μ–΄ νŒ¨ν‚·μœΌλ‘œ λ³€ν™˜λœ ν›„, λΌμš°νŒ…μ„ 톡해 λͺ©μ μ§€λ‘œ 전솑.

λ°μ΄ν„°μ˜ ν˜•νƒœλŠ”?

  • HTTP: 헀더 + λ°”λ””λ‘œ κ΅¬μ„±λœ ν…μŠ€νŠΈ 데이터.
  • WebSocket: 초기 ν•Έλ“œμ…°μ΄ν¬λŠ” HTTP, 이후 λ°”μ΄λ„ˆλ¦¬ 데이터 전솑.
  • HTTPS: TLS둜 μ•”ν˜Έν™”λœ λ°”μ΄λ„ˆλ¦¬ 데이터.
  • TLS ν•Έλ“œμ…°μ΄ν¬: μ•”ν˜Έν™” ν˜‘μƒμ„ μœ„ν•œ λ°”μ΄λ„ˆλ¦¬ 데이터 (Wireshark 툴둜 해석)

ACK

  • TCPλŠ” 일정 수의 μ„Έκ·Έλ¨ΌνŠΈλ₯Ό μ „μ†‘ν•œ λ’€ ACK νŒ¨ν‚·μœΌλ‘œ μˆœμ„œλ₯Ό ν™•μΈν•˜κ³  μŠΉμΈλ°›μŒ
    • 예: ACK 1001 β†’ "λ‹€μŒμ— 1001λ²ˆλΆ€ν„° λ³΄λ‚΄μ€˜"
  • ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„Έκ·Έλ¨ΌνŠΈλ₯Ό κ³Όλ„ν•˜κ²Œ μˆ˜μ‹ ν•˜λ©΄ 처리 λΆˆκ°€ β†’ ACK μ§€μ—° λ˜λŠ” λˆ„λ½ λ°œμƒ
  • μ„œλ²„λŠ” 계속 데이터 μ „μ†‘ν•˜μ§€λ§Œ, ν΄λΌμ΄μ–ΈνŠΈλŠ” μˆ˜μ‹ ν•˜μ§€ λͺ»ν•΄ 혼작 λ°œμƒ
    • μ΄λŸ¬ν•œ 상황을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ 혼작 μ œμ–΄(Congestion Control)κ°€ ν•„μš”

슬둜우 μŠ€νƒ€νŠΈ

  • TCPλŠ” μ²˜μŒμ—” 전솑 속도λ₯Ό 혼작 μœˆλ„μš°(CWND)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ μ§„μ μœΌλ‘œ 증가
    • ACK μˆ˜μ‹  μ‹œ, 2λ°° 증가
    • νŒ¨ν‚· 손싀 λ°œμƒ μ‹œ, 절반 κ°μ†Œ
  • μ˜ˆμ‹œ: 1 β†’ 2 β†’ 4 β†’ 8 MSS (MSSλŠ” 1460λ°”μ΄νŠΈ)

πŸ“– ꡬ문 뢄석(Parsing)

HTML νŒŒμ‹± 흐름

  • HTML β†’ ν† ν¬λ‚˜μ΄μ§• β†’ DOM 생성
  • <script> νƒœκ·ΈλŠ” 기본적으둜 νŒŒμ‹± 쀑단
    • async: λ‹€μš΄λ‘œλ“œ 병렬, μ‹€ν–‰ μ¦‰μ‹œ
    • defer: λ‹€μš΄λ‘œλ“œ 병렬, νŒŒμ‹± μ™„λ£Œ ν›„ μ‹€ν–‰

ν”„λ¦¬λ‘œλ“œ μŠ€μΊλ„ˆ(Preload scanner)

  • νŒŒμ‹±κ³Ό λ³‘λ ¬λ‘œ μ‹€ν–‰λ˜μ–΄ CSS, JS, μ›Ή 폰트 λ“± μš°μ„ μˆœμœ„ 높은 λ¦¬μ†ŒμŠ€λ₯Ό 미리 μš”μ²­ (λΈŒλΌμš°μ €κ°€ 처리)
  • λ¦¬μ†ŒμŠ€ λ‘œλ”© μ§€μ—° λ°©μ§€, λ Œλ”λ§ μ‹œκ°„ 단좕

CSSOM ꡬ좕(Building the CSSOM)

  • CSS도 νŒŒμ‹±λ˜μ–΄ μŠ€νƒ€μΌ κ·œμΉ™ 트리(CSSOM) 생성
  • DOM + CSSOM β†’ λ Œλ” 트리 생성
    - λ Œλ” νŠΈλ¦¬μ—λŠ” 화면에 직접 ν‘œμ‹œλ˜λŠ” λ…Έλ“œλ§Œ 포함됨

πŸ’‘ CSSOM λΉŒλ“œλŠ” 병λͺ© ꡬ간인가?

개발자 λ„κ΅¬μ—μ„œ μ°Ύμ•„λ³Ό 수 μžˆλŠ” Recalculate Style은 (CSS ꡬ문 뢄석 + μŠ€νƒ€μΌ 트리 생성 + μž¬κ·€ 계산)을 ν¬ν•¨ν•œ 전체 μ‹œκ°„μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.

μ΄λŠ” 전체 단계가 λΉ λ₯΄κ²Œ 처리되며, DNS 쑰회 1λ²ˆλ³΄λ‹€ 짧은 μ‹œκ°„μ— κ³„μ‚°λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

πŸ€” CSSκ°€ μ‹€μ œ μ„±λŠ₯에 영ν–₯을 μ£ΌλŠ” ꡬ간

  • λ¦¬ν”Œλ‘œμš°(Reflow): λ‚˜μ€‘μ— λ°œμƒν•˜λŠ” λ ˆμ΄μ•„μ›ƒ μž¬κ³„μ‚°
  • λ ˆμ΄μ•„μ›ƒ μ‰¬ν”„νŠΈ(Layout Shift): μš”μ†Œ μœ„μΉ˜ λ³€κ²½μœΌλ‘œ μΈν•œ ν”„λ ˆμž„ λ“œλ‘­ 유발

Javascript 컴파일(JavaScript Compilation)

μ‹€ν–‰ 흐름

  • JavaScriptλŠ” νŒŒμ‹± β†’ AST(Abstract Syntax Tree) 생성
  • 인터프리터가 ASTλ₯Ό 읽어 λ°”μ΄νŠΈ μ½”λ“œ(기계가 해석할 μˆ˜μžˆλŠ” 쀑간 μ½”λ“œ)둜 λ³€ν™˜
  • JIT(Just-In-Time) μ»΄νŒŒμΌλŸ¬κ°€ λ°˜λ³΅λ˜λŠ” ν•«μŠ€νŒŸ μ½”λ“œλ₯Ό 감지해 λ„€μ΄ν‹°λΈŒ λ¨Έμ‹  μ½”λ“œ(μ–΄μ…ˆλΈ”λ¦¬μ–΄ μˆ˜μ€€)둜 μ΅œμ ν™”
  • μ›Ή μ›Œμ»€ 등을 톡해 λ©€ν‹° μŠ€λ ˆλ“œλ‘œλ„ 처리 κ°€λŠ₯

🧡 Web Worker vs Promise

Promise

  • 비동기 μž‘μ—…μ„ 메인 μŠ€λ ˆλ“œμ—μ„œ μ˜ˆμ•½
  • λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰λ˜μ§€λ§Œ, 콜백이 μ‹€ν–‰λ˜λŠ” μ‹œμ μ—” 메인 μŠ€λ ˆλ“œ μ‚¬μš©
  • 즉, CPU 집약적인 μž‘μ—…μ΄ promise 콜백 μ•ˆμ— μžˆλ‹€λ©΄ β†’ 메인 μŠ€λ ˆλ“œ 점유 β†’ λ Œλ”λ§ μ§€μ—° λ°œμƒ κ°€λŠ₯

Web Worker

  • 메인 μŠ€λ ˆλ“œμ™€ μ™„μ „νžˆ λΆ„λ¦¬λœ μ‹€ν–‰ ν™˜κ²½
  • 별도 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ β†’ λ Œλ”λ§ 차단 없이 무거운 μž‘μ—… κ°€λŠ₯
    • 단, λ©”λͺ¨λ¦¬ μ†ŒλΉ„ 증가
  • 메인과 μ›Œμ»€ κ°„ 직접 DOM μ ‘κ·Ό λΆˆκ°€, 였직 λ©”μ‹œμ§€ 큐둜 톡신 ✨

μ ‘κ·Όμ„± 트리 ꡬ좕(Building the Accessibility Tree)

  • λΈŒλΌμš°μ €κ°€ DOM/CSSOMμ—μ„œ νŒŒμƒν•΄ 생성
  • λ‚΄μš©(name), μ—­ν• (role), μƒνƒœ(state), μ„€λͺ…(description) 포함
  • 슀크린 λ¦¬λ”λŠ” μ ‘κ·Όμ„± 트리λ₯Ό 톡해 μ›Ή μ½˜ν…μΈ μ— μ ‘κ·Ό

AOMμ΄λž€?

https://wicg.github.io/aom/explainer.html

  • AOM(Accessibility Object Model)은
    μ›Ή κ°œλ°œμžκ°€ μ ‘κ·Όμ„± 트리λ₯Ό 직접 μ œμ–΄ν•  수 μžˆλ„λ‘ ν•˜λŠ” API
  • κΈ°μ‘΄μ—λŠ” aria-* μ†μ„±μœΌλ‘œλ§Œ μ œν•œλœ μ ‘κ·Όμ„± μ œμ–΄κ°€ κ°€λŠ₯ν–ˆμ§€λ§Œ,
    AOM을 μ‚¬μš©ν•˜λ©΄ JSμ—μ„œ 보닀 λ™μ μœΌλ‘œ μ ‘κ·Όμ„±κ³Ό κ΄€λ ¨λœ 속성을 관리할 수 있게 됨

🎨 λ Œλ”(Render)

1. μŠ€νƒ€μΌ(Style)

  • λžœλ” 트리 λ§Œλ“€κΈ° (CSSOM + DOM λ§€μΉ­, 상속/μΊμŠ€μΌ€μ΄λ”© 계산)
  • 화면에 κ·Έλ €μ§€μ§€ μ•ŠλŠ” μš”μ†ŒλŠ” λ Œλ” 트리 ν•©μ„±μ—μ„œ 빠짐

2. λ ˆμ΄μ•„μ›ƒ(Layout)

  • 각 μš”μ†Œμ˜ μœ„μΉ˜μ™€ 크기 계산: 뷰포트λ₯Ό κ³ λ €ν•˜κ³  λ°•μŠ€ λͺ¨λΈμ˜ μ†μ„±μœΌλ‘œ 계산
  • 이미지 λ“± 비동기 μš”μ†ŒλŠ” 곡간을 확보해두고 λ‚˜μ€‘μ— 채움

3. 페인트(Paint)

  • 페인트 κ³Όμ •μ—μ„œ κ·Έλ €μ§€λŠ” 첫 페인트λ₯Ό FMP라 함(First Meaningful Paint)
  • μš”μ†Œλ“€μ„ ν”½μ…€λ‘œ λ³€ν™˜(λ ˆμŠ€ν„°ν™”)
  • λ¦¬νŽ˜μΈνŒ…μ„ λΉ λ₯΄κ²Œ ν•˜κΈ° μœ„ν•œ GPU λ ˆμ΄μ–΄
    • GPU λ ˆμ΄μ–΄ μœ λ„: video, canvas, νŠΉμ • CSS 속성을 κ°€μ§„ μš”μ†Œ(opacity, transform, will-change)
    • κ³Όλ„ν•œ λ ˆμ΄μ–΄ 생성은 λ©”λͺ¨λ¦¬ λ‚­λΉ„ 주의

4. ν•©μ„±(Compositing)

  • λ ˆμ΄μ–΄λ₯Ό λ³‘ν•©ν•˜μ—¬ μ΅œμ’… ν™”λ©΄ 좜λ ₯
  • νŽ˜μ΄μ§€κ°€ κ³„μ†ν•΄μ„œ μžμ›μ„ λ‘œλ“œν•˜λ©΄ λ¦¬ν”Œλ‘œμš°κ°€ λ°œμƒν•  수 있음(이미지 λ‘œλ“œ)

μƒν˜Έμž‘μš©(Interactivity)

  • λΈŒλΌμš°μ €κ°€ νŽ˜μ΄μ§€λ₯Ό λ‘œλ“œν•œ ν›„, onLoad μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κ³  μ½”λ“œ 싀행이 μ‹œμž‘λ˜λ©΄ 메인 μŠ€λ ˆλ“œκ°€ μž‘μ—…μ„ μ²˜λ¦¬ν•˜κ³  μžˆμœΌλ―€λ‘œ μƒν˜Έμž‘μš©(μΈν„°λž™μ…˜)이 지연될 수 있음
  • TTI(Time to Interactive): μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€μ™€ μƒν˜Έμž‘μš©ν•  μ€€λΉ„κ°€ μ™„λ£Œλ  λ•ŒκΉŒμ§€μ˜ μ‹œκ°„μ„ μΈ‘μ •ν•˜λŠ” μ§€ν‘œ
profile
μ•ˆλ…•ν•˜μ„Έμš”.

0개의 λŒ“κΈ€