Lazy loading은 Suspense
const WhatDoWeProvideSection = React.lazy(() => import('./WhatDoWeProvideSection'));
function MainPage() {
return (
<React.Suspense fallback={<div style={{ height: '400px' }} />}>
<WhatDoWeProvideSection />
</React.Suspense>
);
}
react-intersection-observer 라이브러리
온보딩페이지의 맨 위 영역은 바로 보여주되, 그렇지 않은 경우는 공용으로 사용되는 Skeleton 컴포넌트를 대신 보여준다.


FCP : 1.8s
LCP : 3.3s
TBT : 2,220ms
Speed Index : 10.6s


FCP : 1.3s
LCP : 1.7s
TBT : 1,040 ms
Speed Index : 3.3s
개선률(%)은 위와같다.
| 지표 | 의미 | 체감 속도와의 관계 | 필요성 |
|---|---|---|---|
| FCP (First Contentful Paint) | 화면에 첫 콘텐츠(텍스트·이미지 등)가 표시되는 시점 | “화면이 뜨기 시작했다”는 사용자 인식과 직결 | ⭐ 매우 중요 |
| LCP (Largest Contentful Paint) | 주요 콘텐츠(큰 이미지·텍스트)가 완전히 표시된 시점 | “화면이 다 떴다”는 체감과 직결 | ⭐ 매우 중요 |
| TBT (Total Blocking Time) | JS 실행으로 메인 스레드가 막힌 총 시간 | 인터랙션(클릭 등) 지연과 직결 | ⚙️ 성능 개선 핵심 |
| Speed Index | 콘텐츠가 얼마나 빠르게 시각적으로 채워지는가 | 화면 채워지는 체감 속도와 직결 | 🌈 종합적 판단용 |