성능 측정 이벤트를 관찰하고 브라우저의 성능 타임라인에 기록되는 성능 항목에 대한 알림을 받는 데 사용

현대 웹에서는 사용자 경험을 향상시키기 위해 웹 성능 측정이 중요해졌습니다.
기존에는 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()로 중복 전달되지 않음