Skip to content

[FE] 땅콩 성능 개선기

Gyuhan Park edited this page Nov 2, 2024 · 4 revisions

📈 땅콩 성능 개선기

❌ 개선 전

페이지 Performance FCP LCP TBT CLS Speed Index
메인 화면 60 1.5s 4.3s 1,360ms 0.011 1.9s
닉네임 설정 화면 70 1.5s 3.3s 990ms 0.01 1.8s
대기 화면 66 1.5s 3.6s 1,230ms 0.011 1.9s
게임 화면 67 1.5s 3.4s 1,170ms 0.01 2.0s
라운드 결과 화면 60 1.6s 4.2s 1,340ms 0.011 2.3s

✅ 개선 후

페이지 Performance FCP LCP TBT CLS Speed Index
메인 화면 88 1.7s 3.6s 170ms 0 1.7s
닉네임 설정 화면 91 1.7s 2.9s 210ms 0 1.7s
대기 화면 80 1.7s 4.5s 210ms 0 1.7s
게임 화면 85 2.2s 3.7s 170ms 0 2.2s
라운드 결과 화면 88 2.0s 3.3s 190ms 0.002 2.0s

🔍 개선 후 production 환경 lighthouse 측정 결과

메인 화면 닉네임 설정 화면 대기 화면 게임 화면 라운드 결과 화면

목표했던 타겟 환경에서의 동작 확인

[ 목표했던 타겟 환경과 디바이스에서 서비스 핵심 기능 동작 확인 ]

호스트 환경 : 모바일

네트워크 : Slow 4G (150ms)

CPU 스로틀링 : 6x slowdown

cache : 브라우저 캐시 사용 중지

_.mp4

성능 리포트

  • 초기 로딩 속도
    • 네트워크로 불러오는 리소스 크기를 줄이기
    • 이미지 포맷 및 크기 조절
    • 폰트 서브셋 최적화
    • 폰트 preload가 초기 로딩 속도를 지연시키는 문제가 발생했지만, 폰트 덜컹거림은 UX에 악영향을 미친다 생각하여 유지함
  • JS 번들 사이즈 최적화
    • 코드 스플리팅 적용
    • css-in-js는 런타임에 스타일링이 적용되기 때문에 css 파일을 별도로 분리하지 못함
  • 렌더링 최적화
    • 타이머를 구현하는 과정에서 width와 right를 조작하여 애니메이션 적용
    • transform을 활용하여 리플로우 발생시키지 않도록 설정

렌더링 최적화

렌더링 시간 감소 : 1686ms -> 87ms (94.84% 개선)

렌더링 개선 전 : reflow, repaint 발생으로 브라우저 렌더링 시간 지연 (1686ms)

렌더링 개선 후 : transform 활용하여 reflow 없이 composition 만으로 애니메이션 동작 (87ms)

개선 전 개선 후

레이아웃 시프트 개선

스피너 개선

개선 전

_.mp4

개선 후

_.mp4

매칭 결과 - 매칭된 사람이 아무도 없는 경우

개선 전

_.mp4

개선 후

_.mp4

매칭 결과에서 퍼센트 숫자가 오르면서 발생하는 레이아웃 시프트 개선

개선 전 개선 후

느낀 점

  • 이미지의 확장자를 바꾸는 것 만으로도 데이터의 크기를 절반 이상 낮출 수 있었다.
  • 개선 작업 이후에 Lighthouse 지표 중 TBT에서 가장 큰 개선을 보였다.
  • font를 CDN 서버에서 불러올 때 preload 옵션을 추가해 네트워크가 느린 환경에서 FOUT 현상을 없애 UX를 개선하였다.
  • 잦은 reflow, repaint는 frame drop을 발생시켜 성능 문제를 일으키기 때문에, transform을 사용하여 합성 단계만 거치도록 개선하였다.
  • 애니메이션을 구현할 때는 layout shift 발생을 유의해야 한다.
Clone this wiki locally