성능 측정 이벤트를 관찰하고 브라우저의 성능 타임라인에 기록되는 성능 항목에 대한 알림을 받는 데 사용
현대 웹에서는 사용자 경험을 향상시키기 위해 웹 성능 측정이 중요해졌습니다.
기존에는 performance.getEntries*()
메서드들을 호출하여 이미 수집된 성능 데이터를 한꺼번에 가져오는 방식으로 성능을 분석했습니다.
그러나 이런 방식은 새로운 성능 이벤트를 실시간으로 감지하기 어렵고, 타이밍을 놓치면 데이터를 놓칠 수 있다는 한계가 있습니다.
예를 들어 페이지 로드 중간중간 발생하는 이벤트를 잡아내려면 지속적으로 폴링(polling)해야 했습니다.
⇒ PerformanceObserver
는 성능 데이터를 능동적으로 수집하고자 할 때 꼭 필요한 도구
PerformanceObserver
를 사용하려면 먼저 새로운 옵저버 인스턴스를 생성
생성자는 콜백 함수를 인자로 받으며, 이 콜백은 관찰 대상 성능 엔트리가 발생할 때마다 호출
// INFO: obs: 자기 자신(옵저버 객체)
const observer = new PerformanceObserver((list, obs) => {
const entries = list.getEntries(); // INFO: 성능 엔트리 목록 가져오기
entries.forEach(entry => {
console.log(entry.entryType, entry.startTime, entry.duration);
});
});
// INFO: 관찰 시작, longtask 타입
observer.observe({ entryTypes: ['longtask'], **buffered: true** });
// INFO: 관찰 해제
observer.disconnect();
브라우저 내부에는 생성된 성능 이벤트(PerformanceEntry
)를 일시적으로 저장해 두는 구조
브라우저는 메인 스레드에서 발생하는 다양한 퍼포먼스 이벤트(예: longtask
, paint
, resource
등)를 PerformanceEntry
객체로 만들어 내부적으로 저장(버퍼링)
PerformanceObserver
를 통해 관찰(observe()
)하면, 새로운 성능항목(PerformaceEntry
)가 생길 때마다(혹은 일정 시점에 일괄(batch)로) 콜백으로 전달됨.
그런데 페이지 로드가 시작되기 전에 오래 걸린 렌더링(또는 Long Task)이 있었다면, 단순히 등록 시점 이후 이벤트만 수신하는 관찰자로는 그 이전 데이터를 놓칠 수 있습니다.
이때 buffered: true
옵션을 지정하면, 브라우저가 내부 버퍼에 과거(등록 이전)에 기록되어 남아 있는 해당 타입의 PerformanceEntry
들을 최초 콜백 때 한꺼번에 전달
observer.observe({ type: 'longtask', buffered: true });
PerformanceEntry
객체를 생성 후 내부 버퍼에 보관observe()
시점PerformanceObserver.observe({ type: 'X', buffered: true })
를 호출하면, 브라우저는 지금까지 버퍼에 모여 있는 'X'
타입 엔트리들을 한 번에 전달takeRecords()
로 중복 전달되지 않음