/favicon.ico

itcode.dev

[Observer API ํŒŒํ—ค์น˜๊ธฐ] 5. PerformanceObserver

2024-06-27 (๋ชฉ) 11:27:14
https://github.com/RWB0104/blog.itcode.dev/assets/50317129/c472262e-0b99-4a6f-836f-fc797bcf26d9
Observer API ํŒŒํ—ค์น˜๊ธฐ

์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ

Observer API ํŒŒํ—ค์น˜๊ธฐ

5 / 6

PerformanceObserver๋Š” ์„ฑ๋Šฅ ์ด๋ฒคํŠธ๋ฅผ ๊ด€์ธกํ•˜๋Š” ์˜ต์ €๋ฒ„ API๋‹ค. F12๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‚˜์˜ค๋Š” ๊ฐœ๋ฐœ์ž๋„๊ตฌ์˜ ์„ฑ๋Šฅ ํƒญ๊ณผ ์—ฐ๊ด€๋œ๋‹ค.

TYPESCRIPT
1
2
3
const po = new PerformanceObserver(callback);

po.observer(options);

ํŽ˜์ด์ง€ ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ์˜ต์ €๋ฒ„๋ผ๋Š” ํŠน์ง•์œผ๋กœ์ธํ•ด, ํƒ€ ์˜ต์ €๋ฒ„์™€ ๋‹ฌ๋ฆฌ ํƒœ๊ทธ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์ด ์—†๋‹ค.

์˜ต์ €๋ฒ„ ๋“ฑ๋ก ์‹œ options๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์„ธ๋ถ€ ์˜ต์…˜์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. PerformanceObserverInit ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค.

์˜ต์ €๋ฒ„๊ฐ€ ๊ด€์ฐฐํ•  ์„ฑ๋Šฅ ์š”์†Œ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๊ฐ ์š”์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. navigation - ํŽ˜์ด์ง€ ๋กœ๋“œ์™€ ์—ฐ๊ด€๋œ ์„ฑ๋Šฅ ์ง€ํ‘œ. ํŽ˜์ด์ง€ ์ฒซ ๋กœ๋“œ ์‹œ์˜ ํƒ€์ด๋ฐ ์ •๋ณด ๋“ฑ์„ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. resource - ํŽ˜์ด์ง€์— ๋กœ๋“œ๋œ ๋ฆฌ์†Œ์Šค์™€ ์—ฐ๊ด€๋œ ์„ฑ๋Šฅ ์ง€ํ‘œ. ์ด๋ฏธ์ง€, js, css ๋“ฑ์ด ๋Œ€์ƒ์— ํ•ด๋‹น๋œ๋‹ค.
  3. mark - ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ ์ž„์˜์˜ ํƒ€์ด๋ฐ ์ •๋ณด.
  4. measure - ์ง€์ •ํ•œ ๋‘ mark ์‚ฌ์ด์˜ ์‹œ๊ฐ„ ์ธก์ •.
  5. paint - ํŽ˜์ด์ง€์˜ ๋ Œ๋”๋ง ๋ฐ ํŽ˜์ธํŠธ์™€ ๊ด€๋ จ๋œ ์„ฑ๋Šฅ ์ง€ํ‘œ. ์ฒซ ํŽ˜์ด์ง€ ํŽ˜์ธํŒ…(FP), ์ตœ์ดˆ์˜ ์œ ์˜๋ฏธํ•œ ํŽ˜์ธํŒ…(FMP) ๋“ฑ์ด ํ•ด๋‹นํ•œ๋‹ค.
  6. longtask - 50ms ์ด์ƒ์˜ ๊ธด ํ”„๋กœ์„ธ์Šค ์‹๋ณ„
  7. element - DOM ์š”์†Œ ๋ Œ๋”๋ง๊ณผ ์—ฐ๊ด€๋œ ์„ฑ๋Šฅ ์ง€ํ‘œ.
  8. frame - ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ”„๋ ˆ์ž„๊ณผ ๋ จ๊ด€๋œ ์„ฑ๋Šฅ ์ง€ํ‘œ. ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ์Šคํฌ๋กค ์„ฑ๋Šฅ ๋ถ„์„๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  9. event - ์ด๋ฒคํŠธ ๋ฐœ์ƒ๊ณผ ์—ฐ๊ด€๋œ ์„ฑ๋Šฅ ์ง€ํ‘œ.
  10. first-input - ์‚ฌ์šฉ์ž์˜ ์•ก์…˜๊ณผ ๊ด€๋ จ๋œ ์„ฑ๋Šฅ ์ง€ํ‘œ.
  11. largest-contentful-paint - ๋Œ€์šฉ๋Ÿ‰ ์š”์†Œ์˜ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ง€ํ‘œ.
  12. layout-shift - ํŽ˜์ด์ง€์˜ ์š”์†Œ ์ด๋™ ์„ฑ๋Šฅ ์ง€ํ‘œ.

type์€ ํ›„์ˆ ํ•  entryTypes์™€ ๋ณ‘ํ–‰ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์˜ต์ €๋ฒ„๊ฐ€ ๊ด€์ฐฐํ•  ์„ฑ๋Šฅ ์š”์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ์ง€์ •ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ธก์ •ํ•  ๋•Œ ์šฉ์ดํ•˜๋‹ค.

๊ธฐ์กด ์„ฑ๋Šฅ ์ง€ํ‘œ ํฌํ•จ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ false๋กœ ์„ ์–ธ๋˜์–ด์žˆ๋‹ค.

์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ ๊ด€๋ จ ์ง€ํ‘œ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. PerformanceObserverCallback ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค.

์„ฑ๋Šฅ ์ง€ํ‘œ ๊ฐ์ฒด PerformanceObserverEntryList๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. getEntries, getEntriesByName, getEntriesByType ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ๋ชฉ๋ก์„ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ ์š”์†Œ๋Š” type ํ˜น์€ entryTypes์— ์ง€์ •ํ•œ ์š”์†Œ์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ๊ฐœ์ฒด๋‹ค. ์ธก์ •๋œ ์„ฑ๋Šฅ ์š”์†Œ์— ๋”ฐ๋ผ ์ƒ์ดํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

PerformanceObserver ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋„ PerformanceObserver๋ฅผ ์—ฐ์‡„์ ์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

PerformanceObserver๋ฅผ ์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด์ž.

TYPESCRIPT
1
2
3
4
export function usePerformanceObserver(): void
{
  //
}

์œ„์™€ ๊ฐ™์ด usePerformanceObserver ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค.

useMutationObserver๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์•„๋ž˜์˜ ๋‘ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  1. ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ
  2. ์˜ต์…˜

์ง€๊ธˆ๊นŒ์ง€์˜ ์˜ต์ €๋ฒ„์™€ ๋‹ฌ๋ฆฌ DOM์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

TYPESCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { useEffect } from "react";

export type UsePerformanceObserverCallback = (entry: PerformanceEntry) => void;

/**
 * PerformanceObserver ์ ์šฉ ํ›… ๋ฉ”์„œ๋“œ
 *
 * @param {UsePerformanceObserverCallback} callback: ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ
 * @param {PerformanceObserverInit} options: ์˜ต์…˜
 */
export function usePerformanceObserver(
  callback: UsePerformanceObserverCallback,
  options?: PerformanceObserverInit
): void {
  useEffect(() => {
    const po = new PerformanceObserver((entries) => {
      entries.getEntries().forEach(callback);
    });
  }, [callback, options]);
}

PerformanceObserver๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ po ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•œ๋‹ค.

po.observe() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํƒœ๊ทธ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.

TYPESCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { useEffect } from "react";

export type UsePerformanceObserverCallback = (entry: PerformanceEntry) => void;

/**
 * PerformanceObserver ์ ์šฉ ํ›… ๋ฉ”์„œ๋“œ
 *
 * @param {UsePerformanceObserverCallback} callback: ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ
 * @param {PerformanceObserverInit} options: ์˜ต์…˜
 */
export function usePerformanceObserver(
  callback: UsePerformanceObserverCallback,
  options?: PerformanceObserverInit
): void {
  useEffect(() => {
    const po = new PerformanceObserver((entries) => {
      entries.getEntries().forEach(callback);
    });

    po.observe(options);
  }, [callback, options]);
}

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค PerformanceObserver์˜ ๋“ฑ๋ก์ด ์ค‘์ฒฉ๋˜์ง€ ์•Š๋„๋ก, ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

po.disconnect() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด PerformanceObserver๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.

TYPESCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import { useEffect } from "react";

export type UsePerformanceObserverCallback = (entry: PerformanceEntry) => void;

/**
 * PerformanceObserver ์ ์šฉ ํ›… ๋ฉ”์„œ๋“œ
 *
 * @param {UsePerformanceObserverCallback} callback: ์ฝœ๋ฐฑ ๋ฉ”์„œ๋“œ
 * @param {PerformanceObserverInit} options: ์˜ต์…˜
 */
export function usePerformanceObserver(
  callback: UsePerformanceObserverCallback,
  options?: PerformanceObserverInit
): void {
  useEffect(() => {
    const po = new PerformanceObserver((entries) => {
      entries.getEntries().forEach(callback);
    });

    po.observe(options);

    return () => {
      po.disconnect();
    };
  }, [callback, options]);
}

์ „์ฒด ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™๋‹ค.

CodeSandbox๋กœ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

Lighthouse ์„ฑ๋Šฅ ์ธก์ •

PerformanceObserver๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์ ์ ˆํžˆ ๊ตฌ์„ฑํ•˜๋ฉด Lighthouse์™€ ๊ฐ™์€ ์›น ์„ฑ๋Šฅ ์ธก์ • ์„œ๋น„์Šค๋ฅผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.


ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋น„์Šทํ•˜๊ฑฐ๋‚˜, ๋” ์šฐ์ˆ˜ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜คํ”ˆ/์ƒ์šฉ ๋„๊ตฌ๋“ค์ด ๋งŽ์€ ๊ฒƒ์ด ํ˜„์‹ค์ด๋‹ค. ๋˜ํ•œ ์•ž์„œ ๋‹ค๋ฃฌ ์„ธ ์˜ต์ €๋ฒ„์™€ ๋‹ฌ๋ฆฌ, ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์— ์žˆ์–ด ๋ฒ”์šฉ์„ฑ์ด ๋งŽ์ด ๋–จ์–ด์ง€๋Š” ํƒ“์—, ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋งŽ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋‹จ์ ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ค๋ฃฐ ์˜ต์ €๋ฒ„๋Š” ReportingObserver๋‹ค.

Tags

# JavaScript
# TypeScript
# React
# Observer API
# PerformanceObserver