개발 단계 최적화
코드 작성 단계에서 성능 문제 예방이 핵심입니다.
아키텍처 선정
- 렌더링 방식: 관리자 시스템(CSR), 이커머스(SSR/SSG), 뉴스 사이트(ISR)에 맞춰 선택
- 경량 프레임워크: Preact, Svelte 등 상황에 맞는 도구 활용
코드 품질
// 비효율적인 컴포넌트
function UserList() {
return users.map(user => (
<UserItem
onClick={() => handleClick(user.id)}
style={{color: 'blue'}}
/>
))
}
// 최적화된 컴포넌트
const MemoizedItem = React.memo(UserItem);
function OptimizedList() {
const clickHandler = useCallback(id => { /* ... */ }, []);
return users.map(user => (
<MemoizedItem
onClick={clickHandler}
style={itemStyle}
key={user.uuid}
/>
))
}
- 컴포넌트 단일 책임 원칙 적용
- 메모이제이션으로 불필요한 리렌더링 방지
- 고유 키 사용 및 동적 임포트 구현
빌드 프로세스 최적화
번들 분할
// Webpack 설정 예시
module.exports = {
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors'
}
}
}
}
};
리소스 압축
- JavaScript: Terser로 변수 축소 및 불필요 코드 제거
- CSS: 중복 스타일 통합 및 미니파이
- 이미지: WebP 변환 및 srcset 적용
실행 환경 최적화
지연 로딩
// Intersection Observer 활용
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadContent(entry.target);
observer.unobserve(entry.target);
}
});
});
렌더링 성능
- 주요 CSS 인라인 처리
- 레이아웃 쓰래싱 방지를 위한 DOM 배치 작업
캐싱 전략
| 캐시 유형 | 기술 | 적용 시나리오 |
|---|---|---|
| 강력한 캐싱 | Cache-Control | 정적 에셋 |
| 검증 캐싱 | ETag | 자주 업데이트되는 리소스 |
| 서비스 워커 | Cache-first | 오프라인 지원 필요시 |
성능 모니터링
핵심 지표
- LCP: 메인 콘텐츠 로딩 시간 (2.5초 권장)
- INP: 상호작용 반응성 (200ms 미만)
- CLS: 레이아웃 이동 지표 (0.1 미만)
도구 활용
- Lighthouse: 개발 환경 진단
- WebPageTest: 다국가 테스트
- Sentry: 실시간 에러 추적
최적화 사이클
- 성능 기준선 설정
- 병목 현상 식별
- 대상 최적화 수행
- 지표 지속 모니터링
- 새로운 개선점 탐색