12장 모든 웹 개발자가 관심을 가져야 할 핵심 웹 지표
1. 웹사이트와 성능
1. 지향해야 할 세 가지 수칙
-
사용자가 방문한 목적을 손쉽게 달성할 수 있어야 한다.
-
방문 목적 달성에 걸리는 시간이 짧아야 한다.
-
사용자의 정보가 누출되는 등의 사고 없이 보안이 철저해야 한다.
2, 개발자가 성능에 관심을 가져야 하는 이유
-
개발 도구는 사용자의 기기 보다 성능이 뛰어나기 때문에 성능 문제를 경험하기 어려워 문제를 파악하기 어렵다.
-
성능 향상 작업은 러닝 커브가 높고 서비스를 개발하는 작업에 비해 눈에 띄는 성능 향상을 기대하기 어려워 많은 개발자가 기피하는 작업이다.
-
하지만 웹 사이트의 성능은 조직이 이루고자 하는 목표와 직결되기 때문에 개발자는 웹 사이트의 성능에도 주의를 기울여 안정적인 사용자 경험을 위해 노력해야 한다.
2. 핵심 웹 지표(Core Web Vital)
구글에서 만든 지표로 좋은 웹 사이트를 분류하는 기준으로 사용된다.
1.핵심 지표
-
최대 콘텐츠풀 페인트(LCP: Largest Contentful Paint)
-
최초 입력 지연(FID: First Input Delay)
-
누적 레이아웃 이동(CLS: Cumulative Layout Shift)
2. 특정 문제 진단 지표
-
최초 바이트까지의 시간(TTFB: Time To First Byte)
-
최초 콘텐츠풀 시간(FCP: First Contentful Paint)
3. 최대 콘텐츠풀 페인트(LCP)
1. 정의
사용자 화면(뷰포트) 내부에서 가장 큰 영역을 차지하는 요소가 렌더링되는 데 얼마나 걸리는지를 측정하는 지표다.
2. 의미
사용자에게 메인 콘텐츠의 정보를 화면에 전달하는 속도를 객관적으로 판단하기 위해 만들어진 지표다.
3. 예제
LCP는 일반적으로 페이지에서 가장 크고 눈에 띄는 요소이다. 요소의 로딩 속도를 높이는 것으로 지표의 값이 달라진다.
function getLCPCandidate() {
let largestElement = null;
let maxArea = 0;
document.querySelectorAll("img, video, h1, h2, h3, p, div").forEach((el) => {
const rect = el.getBoundingClientRect();
const area = rect.width * rect.height;
if (area > maxArea) {
largestElement = el;
maxArea = area;
}
});
return largestElement;
}
// 페이지 로드 후 LCP 예상 요소 출력
window.addEventListener("load", () => {
const lcpElement = getLCPCandidate();
console.log("예상 LCP 요소:", lcpElement);
});
PerformanceObserver
: API 를 활용해 실제 LCP를 감지getBoundingClientRect()
: 가장 큰 요소를 감지
<!-- 중요 이미지에 preload 적용 -->
<link rel="preload" as="image" href="large-image.jpg" />
<img src="large-image.jpg" loading="lazy" width="800" height="600" />
- LCP 요소가 이미지인 경우
preload
를 사용해 브라우저가 요소를 미리 로드하게 만들어 시간을 단축시킬 수 있다.
4. 기준 점수
5. 개선 방안
1. 텍스트는 언제나 옳다.
텍스트는 어떤 요소보다 로딩이 빠르기 때문에 LCP 예상 영역에 문자열을 채우면 사용자에게 텍스트를 빠르게 노출하기 때문에 점수가 높아진다.
2. 이미지를 어떻게 불러올 것인가?
1. 프리로드 스캐너
- HTML을 해석(파싱)하는 동안, 필요한 리소스를 미리 찾고 로드하는 브라우저 기능
<img>
태그 내부의 src 속성을 보면 브라우저가 즉시 다운로드 시작한다.- 따라서 LCP 요소가
<img>
일 경우 빠르게 로딩되어 좋은 성능을 기대할 수 있음
<!-- 1) img -->
<img src="lcp.jpg" />
<!-- 2) svg -->
<svg xmlns="http://www.w3.org/1000/svg">
<image href="lcp.jpg" />
</svg>
<!-- 3) (비디오의 경우) vide.poster -->
<video poster="lcp.jpg"></video>
<!-- 4) background-image: url() -->
<div style="background-image: url(lcp.jpg)">...</div>
-
<img>
: 프리로드 스캐너 덕분에 빠르게 로드된다. -
<svg>
: 내부에<img>
를 넣으면 프리로드 스캐너가 감지하지 못해 LCP에 불리하다. -
<video>
: 프리로드 스캐너 덕분에 빠르게 로드된다. -
background-image: url()
: css 리소스는 늦게 다운로드 되기 때문에 LCP에 불리하다.