πŸ’¬ Q&A : μ„±λŠ₯ μ΅œμ ν™”

BOOaΒ·2025λ…„ 8μ›” 15일

Q&A

λͺ©λ‘ 보기
5/5
post-thumbnail

μ„±λŠ₯ μ΅œμ ν™”λ₯Ό ν•œ λ²ˆλ„ μ œλŒ€λ‘œ μ•Œμ•„λ³Έ 적이 μ—†λŠ” 것 κ°™μ•„, 면접을 μ€€λΉ„ν•˜λ©΄μ„œ μ–΄λ– ν•œ 방법듀과 κ°œλ…λ“€μ΄ μžˆλŠ”μ§€ μ•Œμ•„λ³΄μ•˜λ‹€.

βœ… 전솑 μ΅œμ ν™” - λ„€νŠΈμ›Œν¬ ꡬ간

λΈŒλΌμš°μ €κ°€ νŽ˜μ΄μ§€λ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄ μ„œλ²„μ—μ„œ HTML , CSS , JS , 이미지 λ“± μ—¬λŸ¬ νŒŒμΌμ„ λ°›μ•„μ˜€λŠ”λ°, 이 λ‹€μš΄λ‘œλ“œ 과정을 μ€„μ΄κ±°λ‚˜ λΉ λ₯΄κ²Œ λ§Œλ“œλŠ” 방법이닀.

πŸ“ μ½”λ“œ λΆ„ν•  : Code Splitting

  • 처음 νŽ˜μ΄μ§€λ₯Ό μ—΄ λ•Œ, JS 파일이 λ„ˆλ¬΄ 크면 λ‹€μš΄λ‘œλ“œ, 해석, 싀행이 였래 κ±Έλ¦°λ‹€.
  • κ·Έλž˜μ„œ μ½”λ“œλ₯Ό 잘게 μͺΌκ°œ ν•„μš”ν•œ μˆœκ°„μ—λ§Œ 뢈러였면 초기 λ‘œλ”©μ΄ 빨라진닀.
  • React.lazy , import() λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή κΈ°λŠ₯이 ν•„μš”ν•  λ•Œλ§Œ κ°€μ Έμ˜€κ²Œ ν•  수 μžˆλ‹€.
  • λ‹€λ§Œ μ§€λ‚˜μΉ˜κ²Œ μͺΌκ°œλ©΄ λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ λ§Žμ•„μ Έμ„œ 였히렀 느렀질 수 μžˆλ‹€.

πŸ“ 트리 셰이킹 : Tree Shaking

  • λ²ˆλ“€μ— μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ½”λ“œκΉŒμ§€ ν¬ν•¨λ˜λ©΄ 파일이 λΆˆν•„μš”ν•˜κ²Œ 컀진닀.
  • μ‚¬μš©λ˜λŠ” μ½”λ“œλ§Œ 남기고 λ‚˜λ¨Έμ§€λ₯Ό 제거 ν•˜λ©΄ 전솑 μš©λŸ‰μ΄ 쀄어든닀
  • ES Module 방식 (import/export) 을 μ‚¬μš©ν•˜κ³ , λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν•„μš”ν•œ ν•¨μˆ˜λ§Œ κ°€μ Έμ˜€λ©΄ λœλ‹€.

πŸ“ μ••μΆ• : gzip/brotli

  • JS , CSS , HTML 은 ν…μŠ€νŠΈμ΄λ―€λ‘œ μ••μΆ•ν•˜λ©΄ μš©λŸ‰μ„ 20~70% 쀄일 수 μžˆλ‹€.
  • μ„œλ²„λ‚˜ CDNμ—μ„œ Content-Encoding: br μ΄λ‚˜ gzip 을 μ„€μ •ν•œλ‹€.
  • 이미 μ••μΆ•λœ 이미지/ν°νŠΈλŠ” λ‹€μ‹œ 압좕해도 νš¨κ³Όκ°€ μ—†λ‹€.

πŸ“ 이미지 μ΅œμ ν™” : WebP/AVIF, lazy-loading

  • 이미지가 νŽ˜μ΄μ§€ λ‘œλ”© 속도λ₯Ό κ°€μž₯ 많이 μž‘μ•„λ¨ΉλŠ” κ²½μš°κ°€ λ§Žλ‹€.
  • JPG/PNG λŒ€μ‹  μš©λŸ‰μ΄ 적은 WebP/AVIF 포맷을 μ‚¬μš©ν•œλ‹€.
  • λ˜λŠ” loading="lazy" 둜 화면에 보이기 μ§μ „κΉŒμ§€ λ‹€μš΄λ‘œλ“œλ₯Ό μ§€μ—°μ‹œν‚¨λ‹€.

πŸ“ CDN & μΊμ‹œ : Cache-Control, ETag

  • 같은 νŒŒμΌμ„ 재방문 λ•Œ λ‹€μ‹œ λ‹€μš΄λ‘œλ“œν•˜μ§€ μ•Šκ²Œ ν•˜λ©΄ λΉ λ₯΄λ‹€.
  • 파일λͺ…에 버전 ν•΄μ‹œλ₯Ό 뢙이고, CDN μ—μ„œ μž₯κΈ° μΊμ‹œλ₯Ό μ„€μ •ν•œλ‹€.


βœ… λ Œλ”λ§ μ΅œμ ν™”

μ„œλ²„μ—μ„œ νŒŒμΌμ„ λ°›μ•„μ˜¨ ν›„, λΈŒλΌμš°μ €κ°€ λΉ λ₯΄κ²Œ λ Œλ”λ§ν•  수 μžˆλ„λ‘ ν•˜λŠ” 방법

πŸ“ SSR/SSG

  • μ„œλ²„μ—μ„œ HTML 을 λ§Œλ“€μ–΄ 보내면, λΈŒλΌμš°μ €κ°€ λ°”λ‘œ ν‘œμ‹œ κ°€λŠ₯ν•˜λ‹€.
  • 검색 λ…ΈμΆœμ΄ μ€‘μš”ν•˜κ±°λ‚˜ 첫 홀녀 ν‘œμ‹œ 속도가 μ€‘μš”ν•œ 경우 이λ₯Ό μ‚¬μš©ν•˜λ©΄ μ’‹λ‹€.
  • ν•˜μ΄λ“œλ ˆμ΄μ…˜(μ„œλ²„ λ Œλ” HTML에 JS 이벀트 μ—°κ²°) λΉ„μš©μ΄ λ„ˆλ¬΄ 크면 μƒν˜Έμž‘μš©μ΄ 느렀질 수 μžˆλ‹€.

πŸ“ CSR μ§€μ—° λ‘œλ”©

  • ν•œ λ²ˆμ— λ§Žμ€ JS λ₯Ό μ‹€ν–‰ν•˜λ©΄ 첫 ν™”λ©΄ ν‘œμ‹œκ°€ λŠ¦μ–΄μ§„λ‹€.
  • ν™”λ©΄ μ•„λž˜μͺΎμ˜ μ»΄ν¬λ„ŒνŠΈλŠ” InterSection Observer둜 μ‹€μ œ 보일 λ•Œ λ‘œλ”©ν•˜κ²Œ ν•œλ‹€.

πŸ“ Critical CSS / 폰트 μ΅œμ ν™”

  • ν™”λ©΄ ν‘œμ‹œλ₯Ό λ§‰λŠ” CSS/폰트 λ‘œλ”©μ„ 쀄이면 LCPκ°€ κ°œμ„ λœλ‹€.
  • ν•„μš”ν•œ CSS만 HTML에 인라인, λ‚˜λ¨Έμ§€λŠ” μ§€μ—°λ‘œλ”©
  • ν°νŠΈλŠ” rel=preconnect +font-display:swap 을 μ‚¬μš©ν•œλ‹€.
  • CSS의 @import λŠ” λ‘œλ”© 차단이 μ»€μ„œ ν”Όν•΄μ•Ό ν•œλ‹€.

πŸ“ λ ˆμ΄μ•„μ›ƒ μŠ€λž˜μ‹± λ°©μ§€

  • DOM의 λ ˆμ΄μ•„μ›ƒμ„ 읽고 μ“°λŠ” λ™μž‘μ΄ μ„žμ΄λ©΄ λΈŒλΌμš°μ €κ°€ 계쏙 λ‹€μ‹œ 계산해야 ν•΄μ„œ ν”„λ ˆμž„ λ“œλžμ΄ λ‚œλ‹€.
  • 읽기 μž‘μ—… ν›„ μ“°κΈ° μž‘μ—…μœΌλ‘œ λ¬Άκ³ , μœ„μΉ˜ 변경은 transform 을 μ‚¬μš©ν•œλ‹€.


βœ… λŸ°νƒ€μž„ μ΅œμ ν™” - μ‹€ν–‰ 쀑

이미 λ‘œλ“œλœ νŽ˜μ΄μ§€κ°€ μ‚¬μš©μžμ˜ μž…λ ₯/슀크둀 등에 λΉ λ₯΄κ²Œ λ°˜μ‘ν•˜λ„λ‘ μ‹€ν–‰ 쀑 λ™μž‘μ„ μ΅œμ ν™”ν•˜λŠ” 방법이닀.

πŸ“ λ©”λͺ¨μ΄μ œμ΄μ…˜

  • 같은 계산을 λ°˜λ³΅ν•˜μ§€ μ•Šκ²Œ 캐싱해 CPU λ‚­λΉ„λ₯Ό 쀄인닀.
  • React의 useMemo , useCallback , React.memo 등을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • λ‹€λ§Œ, 계산이 λΉ λ₯Έ μž‘μ—…μ— λ‚¨μš©ν•˜λ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ 될 μˆ˜λ„ μžˆλ‹€.

πŸ“ 가상 슀크둀

  • 수천 개의 리슀트λ₯Ό ν•œ λ²ˆμ— 그리면 λŠλ €μ§„λ‹€.
  • 화면에 λ³΄μ΄λŠ” λ²”μœ„λ§Œ DOM에 λ Œλ”λ§, λ‚˜λ¨Έμ§€λŠ” κ°€μƒμœΌλ‘œ κ΄€λ¦¬ν•œλ‹€.

πŸ“ 이벀트 μœ„μž„

  • μˆ˜λ§Žμ€ μžμ‹ μš”μ†Œλ§ˆλ‹€ 이벀트λ₯Ό 달면 λ©”λͺ¨λ¦¬μ™€ μ„±λŠ₯이 λ‚­λΉ„λœλ‹€.
  • λΆ€λͺ¨ μš”μ†Œμ— 이벀트λ₯Ό ν•œ 번만 달고 event.target 으둜 λΆ„κΈ° 처리λ₯Ό ν•΄μ€€λ‹€.

πŸ“ Debounce/Throttle

  • μž…λ ₯/슀크둀 같은 μ΄λ²€νŠΈκ°€ λ„ˆλ¬΄ 자주 λ°œμƒν•˜λ©΄ λ Œλ”λ§μ΄ λŠλ €μ§„λ‹€.
  • Debounce : λ§ˆμ§€λ§‰ 이벀트 ν›„ 일정 μ‹œκ°„λ§Œ μ‹€ν–‰
  • Throttle : 일정 μ£ΌκΈ°λ§ˆλ‹€ μ‹€ν–‰

πŸ”— 핡심 μ§€ν‘œ

  • LCP : κ°€μž₯ 큰 컨텐츠 ν‘œμ‹œκΉŒμ§€ κ±Έλ¦° μ‹œκ°„ (λͺ©ν‘œ ≀ 2.5s)
  • CLS : ν™”λ©΄ μš”μ†Œμ˜ 예기치 μ•Šμ€ μ›€μ§μž„ 정도 (λͺ©ν‘œ ≀ 0.1)
  • INP : μ‚¬μš©μž μž…λ ₯ ν›„ λ°˜μ‘ μ‹œκ°„ (λͺ©ν‘œ ≀ 200ms)

0개의 λŒ“κΈ€