JavaScript 성능 측정 도구와 최적화 체크리스트 - 실무에서 바로 쓰는 성능 개선 가이드

JavaScript 성능 측정 도구와 최적화 체크리스트

JavaScript 애플리케이션의 성능은 사용자 경험과 비즈니스 성과에 직접적인 영향을 미친다. 느린 로딩 시간은 이탈률을 높이고, 전환율을 낮춘다. 이 글은 JavaScript 성능을 측정하고 최적화하는 실무 가이드를 제공한다.

1. 성능 측정 도구

Lighthouse

URL: https://developers.google.com/web/tools/lighthouse

주요 기능

  • 성능 점수 (0-100)
  • 접근성, SEO, 모범 사례 점수
  • 상세한 개선 제안

사용 방법

  1. Chrome DevTools 열기 (F12)
  2. Lighthouse 탭 선택
  3. 측정할 카테고리 선택
  4. “Analyze page load” 클릭

측정 항목

  • First Contentful Paint (FCP)
  • Largest Contentful Paint (LCP)
  • Total Blocking Time (TBT)
  • Cumulative Layout Shift (CLS)

WebPageTest

URL: https://www.webpagetest.org/

주요 기능

  • 실제 브라우저에서 테스트
  • 영상 녹화
  • 상세한 워터폴 차트

활용

  • 다양한 위치에서 테스트
  • 모바일/데스크톱 비교
  • 반복 테스트로 일관성 확인

Chrome DevTools Performance

주요 기능

  • CPU 프로파일링
  • 메모리 사용량 분석
  • 렌더링 성능 측정

사용 방법

  1. Performance 탭 열기
  2. Record 버튼 클릭
  3. 페이지 상호작용 수행
  4. Stop 클릭 후 분석

2. 핵심 성능 지표 (Core Web Vitals)

Largest Contentful Paint (LCP)

목표: 2.5초 이하

측정 방법

new PerformanceObserver((entryList) => {
  const entries = entryList.getEntries();
  const lastEntry = entries[entries.length - 1];
  console.log('LCP:', lastEntry.renderTime || lastEntry.loadTime);
}).observe({entryTypes: ['largest-contentful-paint']});

최적화 방법

  • 이미지 최적화 (WebP, lazy loading)
  • 서버 응답 시간 개선
  • CDN 활용
  • 중요 리소스 우선 로딩

First Input Delay (FID)

목표: 100ms 이하

측정 방법

new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    console.log('FID:', entry.processingStart - entry.startTime);
  }
}).observe({entryTypes: ['first-input']});

최적화 방법

  • JavaScript 번들 크기 감소
  • 코드 스플리팅
  • 긴 작업 분할
  • Web Workers 활용

Cumulative Layout Shift (CLS)

목표: 0.1 이하

측정 방법

let clsValue = 0;
new PerformanceObserver((entryList) => {
  for (const entry of entryList.getEntries()) {
    if (!entry.hadRecentInput) {
      clsValue += entry.value;
    }
  }
  console.log('CLS:', clsValue);
}).observe({entryTypes: ['layout-shift']});

최적화 방법

  • 이미지/비디오 크기 지정
  • 폰트 로딩 최적화
  • 동적 콘텐츠에 공간 예약
  • 애니메이션 최적화

3. JavaScript 최적화 체크리스트

번들 크기 최적화

체크리스트

  • 불필요한 라이브러리 제거
  • Tree shaking 활성화
  • 코드 스플리팅 적용
  • 동적 import 사용
  • 번들 분석 도구 사용

번들 분석 도구

# webpack-bundle-analyzer
npm install --save-dev webpack-bundle-analyzer

# 사용
npx webpack-bundle-analyzer dist/stats.json

코드 최적화

체크리스트

  • 불필요한 재렌더링 방지 (React.memo, useMemo)
  • 이벤트 리스너 정리
  • 메모리 누수 확인
  • 무거운 연산 최적화
  • 디바운싱/스로틀링 적용

예시: 디바운싱

function debounce(func, wait) {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
}

// 사용
const handleSearch = debounce((query) => {
  // 검색 로직
}, 300);

리소스 로딩 최적화

체크리스트

  • 중요 리소스 우선 로딩 (preload)
  • 비중요 리소스 지연 로딩 (defer, async)
  • 이미지 lazy loading
  • 폰트 최적화 (font-display: swap)
  • 서비스 워커 활용

리소스 힌트 예시

<!-- 중요 리소스 -->
<link rel="preload" href="critical.css" as="style">
<link rel="preload" href="main.js" as="script">

<!-- 폰트 최적화 -->
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>

4. 실무 최적화 가이드

단계별 최적화 프로세스

1단계: 측정

  • Lighthouse로 현재 성능 점수 확인
  • WebPageTest로 상세 분석
  • Chrome DevTools로 병목 지점 파악

2단계: 우선순위 설정

  • Core Web Vitals 개선 우선
  • 사용자 경험에 큰 영향 주는 항목부터
  • ROI가 높은 최적화부터

3단계: 최적화 적용

  • 번들 크기 감소
  • 코드 최적화
  • 리소스 로딩 개선

4단계: 재측정 및 검증

  • 개선 효과 확인
  • 회귀 테스트
  • 지속적 모니터링

성능 예산 설정

권장 성능 예산

지표 목표 경고 위험
LCP < 2.5s 2.5-4s > 4s
FID < 100ms 100-300ms > 300ms
CLS < 0.1 0.1-0.25 > 0.25
번들 크기 < 200KB 200-500KB > 500KB

성능 예산 적용

// package.json
{
  "bundlesize": [
    {
      "path": "./dist/main.js",
      "maxSize": "200 KB"
    }
  ]
}

5. 도구별 활용 팁

Lighthouse 활용

CI/CD 통합

# GitHub Actions 예시
- name: Run Lighthouse CI
  run: |
    npm install -g @lhci/cli
    lhci autorun

정기 모니터링

  • 주간 성능 리포트 생성
  • 성능 회귀 감지
  • 팀 공유

Chrome DevTools 활용

메모리 프로파일링

  1. Memory 탭 열기
  2. Heap snapshot 생성
  3. 메모리 누수 확인
  4. 비교 분석

네트워크 분석

  • 느린 요청 식별
  • 중복 요청 확인
  • 캐싱 전략 검증

6. 프레임워크별 최적화

React 최적화

체크리스트

  • React.memo로 불필요한 리렌더링 방지
  • useMemo, useCallback 활용
  • 코드 스플리팅 (React.lazy)
  • 가상화 (react-window) 적용
  • 프로덕션 빌드 사용

예시: React.lazy

const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  );
}

Vue 최적화

체크리스트

  • v-once, v-memo 사용
  • computed 속성 활용
  • 비동기 컴포넌트
  • 가상 스크롤

Vanilla JavaScript 최적화

체크리스트

  • 이벤트 위임 사용
  • DOM 조작 최소화
  • requestAnimationFrame 활용
  • Web Workers 활용

7. 모니터링 및 지속적 개선

실시간 모니터링

도구

  • Google Analytics (Core Web Vitals)
  • New Relic
  • Datadog
  • Sentry

설정

// Core Web Vitals 추적
import {getCLS, getFID, getLCP} from 'web-vitals';

getCLS(console.log);
getFID(console.log);
getLCP(console.log);

성능 대시보드

구성 요소

  • Core Web Vitals 추이
  • 페이지별 성능 비교
  • 사용자 기기별 성능
  • 에러율 및 성능 상관관계

FAQ

Q: 성능 최적화를 어디서부터 시작해야 하나요?
A: Lighthouse로 현재 상태를 측정하고, Core Web Vitals 점수가 낮은 항목부터 개선하는 것을 추천한다.

Q: 번들 크기를 얼마나 줄여야 하나요?
A: 초기 로딩 번들은 200KB 이하를 목표로 하되, 프로젝트 특성에 따라 조정한다.

Q: 모든 최적화를 한 번에 적용해야 하나요?
A: 단계적으로 적용하고 각 단계마다 측정하여 효과를 확인하는 것이 좋다.

Q: 모바일 성능은 어떻게 측정하나요?
A: Chrome DevTools의 Device Toolbar를 사용하거나 WebPageTest에서 모바일 기기를 선택한다.

Q: 성능 최적화 후에도 점수가 낮은 이유는?
A: 서버 응답 시간, 네트워크 속도, 서드파티 스크립트 등 다양한 요인이 영향을 준다. 전체적인 분석이 필요하다.

Q: 성능 예산을 어떻게 설정하나요?
A: 현재 성능을 기준으로 10-20% 개선을 목표로 설정하고, 점진적으로 목표를 높여간다.

성능 최적화 후 프로젝트 기회

JavaScript 성능 최적화 기술을 습득했다면, 실제 프로젝트에서 이를 적용해볼 수 있다. 블루버튼 같은 플랫폼에서 성능 최적화가 필요한 웹 애플리케이션 프로젝트를 찾아 실전 경험을 쌓을 수 있다. 특히 느린 로딩 속도로 고민하는 프로젝트, Core Web Vitals 개선이 필요한 프로젝트, 대규모 프론트엔드 애플리케이션 최적화 프로젝트에서 이 글에서 배운 지식을 바로 활용할 수 있다.


Written by Jeon Byung Hun 개발을 즐기는 bottlehs - Engineer, MS, AI, FE, BE, OS, IOT, Blockchain, 설계, 테스트