다음 페인트에 대한 상호작용 최적화

웹사이트의 다음 페인트에 대한 상호작용을 최적화하는 방법을 알아보세요.

게시일: 2023년 5월 19일, 최종 업데이트: 2025년 9월 2일

다음 페인트에 대한 상호작용 (INP)은 사용자가 페이지를 방문하는 동안 발생하는 모든 적격 상호작용의 지연 시간을 관찰하여 사용자 상호작용에 대한 페이지의 전반적인 응답성을 평가하는 안정적인 Core Web Vitals 측정항목입니다. 최종 INP 값은 관찰된 가장 긴 상호작용이며 이상점을 무시하는 경우도 있습니다.

좋은 사용자 경험을 제공하려면 웹사이트의 다음 페인트에 대한 상호작용이 200밀리초 이하 가 되도록 노력해야 합니다. 대부분의 사용자를 대상으로 이 목표를 달성하려면 모바일 및 데스크톱 기기별로 구분하여 페이지 로드 횟수의 75번째 백분위수를 측정 기준으로 삼는 것이 좋습니다.

INP 값이 200밀리초 이하이면 양호한 값이고, 500밀리초를 초과하면 좋지 않은 값이며, 그 사이의 값은 개선이 필요합니다.
INP 기준점

웹사이트에 따라 상호작용이 거의 또는 전혀 없을 수 있습니다. 예를 들어 상호작용 요소가 거의 또는 전혀 없는 텍스트와 이미지가 대부분인 페이지가 있습니다. 또는 텍스트 편집기나 게임과 같은 웹사이트의 경우 수백 또는 수천 개의 상호작용이 있을 수 있습니다. 두 경우 모두 INP가 높으면 사용자 경험이 위험에 처합니다.

INP를 개선하려면 시간과 노력이 필요하지만 더 나은 사용자 경험이라는 보상이 따릅니다. 이 가이드에서는 INP를 개선하는 방법을 살펴봅니다.

INP가 낮은 원인 파악

느린 상호작용을 해결하려면 웹사이트의 INP가 낮은지 또는 개선이 필요한지 알려주는 데이터가 필요합니다. 이 정보가 있으면 실험실로 이동하여 느린 상호작용을 진단하고 해결 방법을 찾을 수 있습니다.

필드에서 느린 상호작용 찾기

이상적으로는 INP 최적화 여정을 필드 데이터로 시작하는 것이 좋습니다. 최상의 경우 실제 사용자 모니터링 (RUM) 프로바이더의 필드 데이터는 페이지의 INP 값뿐만 아니라 INP 값 자체를 담당한 특정 상호작용, 상호작용이 페이지 로드 중 또는 후에 발생했는지, 상호작용 유형 (클릭, 키 누르기 또는 탭) 및 기타 유용한 정보를 강조표시하는 문맥 데이터도 제공합니다.

RUM 제공업체를 사용하여 필드 데이터를 가져오지 않는 경우 INP 필드 데이터 가이드에서는 PageSpeed Insights를 사용하여 Chrome 사용자 환경 보고서 (CrUX) 데이터를 보고 격차를 메우는 것이 좋습니다. CrUX는 Core Web Vitals 프로그램의 Google 데이터 세트이며 INP를 비롯한 수백만 개의 웹사이트에 대한 측정항목의 대략적인 요약을 제공합니다. 하지만 CrUX는 문제를 분석하는 데 도움이 되는 RUM 제공업체에서 얻을 수 있는 컨텍스트 데이터를 제공하지 않는 경우가 많습니다. 따라서 Google은 사이트에서 가능한 경우 RUM 제공업체를 사용하거나 자체 RUM 솔루션을 구현하여 CrUX에서 제공되는 기능을 보완하는 것이 좋습니다.

실험실에서 느린 상호작용 진단

이상적으로는 느린 상호작용이 있음을 나타내는 필드 데이터가 있으면 실험실에서 테스트를 시작하는 것이 좋습니다. 필드 데이터가 없는 경우 실험실에서 느린 상호작용을 식별하는 몇 가지 전략이 있습니다. 이러한 전략에는 일반적인 사용자 흐름을 따르고 도중에 상호작용을 테스트하는 것뿐만 아니라 사용자 경험의 중요한 부분에서 느린 상호작용을 식별하기 위해 기본 스레드가 가장 바쁜 로드 중에 페이지와 상호작용하는 것이 포함됩니다.

상호작용 최적화

느린 상호작용을 식별하고 실험실에서 수동으로 재현할 수 있다면 다음 단계는 최적화하는 것입니다.

상호작용은 세 가지 하위 부분으로 나눌 수 있습니다.

  1. 사용자가 페이지와의 상호작용을 시작할 때 시작되고 상호작용의 이벤트 콜백이 실행되기 시작할 때 종료되는 입력 지연입니다.
  2. 이벤트 콜백이 완료될 때까지 실행되는 데 걸리는 시간으로 구성된 처리 기간입니다.
  3. 브라우저가 상호작용의 시각적 결과를 포함하는 다음 프레임을 표시하는 데 걸리는 시간인 표시 지연입니다.
기본 스레드에서의 상호작용 예시 사용자가 실행 중인 작업을 차단하는 동안 입력을 합니다. 이러한 작업이 완료될 때까지 입력이 지연된 후 pointerup, mouseup, click 이벤트 핸들러가 실행되고 다음 프레임이 표시될 때까지 렌더링 및 페인팅 작업이 시작됩니다.
상호작용의 수명 입력 지연은 이벤트 핸들러가 실행될 때까지 발생하며 기본 스레드의 긴 작업과 같은 요인으로 인해 발생할 수 있습니다. 그러면 상호작용의 이벤트 핸들러 콜백이 실행되고 다음 프레임이 표시되기 전에 지연이 발생합니다.

이 세 가지 하위 부분의 합계는 총 상호작용 지연 시간입니다. 상호작용의 모든 하위 부분은 총 상호작용 지연 시간에 어느 정도 기여하므로 상호작용의 각 부분이 가능한 한 짧은 시간 동안 실행되도록 최적화하는 방법을 아는 것이 중요합니다.

입력 지연 식별 및 줄이기

사용자가 페이지와 상호작용할 때 상호작용의 첫 번째 부분은 입력 지연 입니다. 페이지의 다른 활동에 따라 입력 지연 시간이 길어질 수 있습니다. 이는 기본 스레드에서 발생하는 활동 (스크립트 로드, 파싱, 컴파일로 인한 것일 수 있음), 가져오기 처리, 타이머 함수 또는 빠르게 연속적으로 발생하고 서로 겹치는 다른 상호작용으로 인해 발생할 수 있습니다.

상호작용의 입력 지연의 원인이 무엇이든 상호작용이 가능한 한 빨리 이벤트 콜백을 실행할 수 있도록 입력 지연을 최소화하는 것이 좋습니다.

시작 중 스크립트 평가와 긴 작업 간의 관계

페이지 수명 주기의 상호작용에서 중요한 측면은 시작 중입니다. 페이지가 로드되면 처음에는 렌더링되지만 페이지가 렌더링되었다고 해서 페이지가 로드를 완료한 것은 아닙니다. 페이지가 완전히 작동하는 데 필요한 리소스 수에 따라 사용자가 페이지가 아직 로드 중인 동안 페이지와 상호작용하려고 시도할 수 있습니다.

페이지가 로드되는 동안 상호작용의 입력 지연을 연장할 수 있는 한 가지 방법은 스크립트 평가입니다. JavaScript 파일이 네트워크에서 가져온 후에도 브라우저가 JavaScript를 실행하기 전에 해야 할 작업이 있습니다. 이 작업에는 스크립트를 파싱하여 구문이 유효한지 확인하고, 바이트 코드로 컴파일한 후 최종적으로 실행하는 것이 포함됩니다.

스크립트 크기에 따라 이 작업은 기본 스레드에서 긴 작업을 발생시켜 브라우저가 다른 사용자 상호작용에 응답하는 것을 지연시킵니다. 페이지 로드 중에 페이지가 사용자 입력에 계속 응답하도록 하려면 페이지 로드 중에 긴 작업이 발생할 가능성을 줄여 페이지가 빠르게 유지되도록 할 수 있는 작업을 이해하는 것이 중요합니다.

이벤트 콜백 최적화

입력 지연은 INP가 측정하는 것의 첫 번째 부분일 뿐입니다. 사용자 상호작용에 응답하여 실행되는 이벤트 콜백이 가능한 한 빨리 완료될 수 있도록 해야 합니다.

기본 스레드에 자주 양보

이벤트 콜백을 최적화하는 가장 좋은 일반적인 방법은 이벤트 콜백에서 가능한 한 적은 작업을 실행하는 것입니다. 하지만 상호작용 로직이 복잡할 수 있으며 실행하는 작업을 약간만 줄일 수 있습니다.

웹사이트에 이 문제가 발생하는 경우 다음으로 시도해 볼 수 있는 것은 이벤트 콜백의 작업을 별도의 작업으로 나누는 것입니다. 이렇게 하면 집단 작업이 기본 스레드를 차단하는 긴 작업이 되지 않으므로 기본 스레드에서 대기하는 다른 상호작용이 더 빨리 실행될 수 있습니다.

setTimeout은 작업을 나누는 한 가지 방법입니다. 전달된 콜백이 새 작업에서 실행되기 때문입니다. 를 단독으로 사용하거나 별도의 함수로 사용을 추상화할 수 있습니다.setTimeout

무차별적인 양보는 전혀 양보하지 않는 것보다 낫습니다. 하지만 기본 스레드에 양보하는 더 미묘한 방법이 있습니다. 여기에는 렌더링 로직이 더 빨리 실행될 수 있도록 사용자 인터페이스를 업데이트하는 이벤트 콜백 직후에만 양보하는 것이 포함됩니다.

렌더링 작업이 더 빨리 발생하도록 양보

더 고급 양보 기술에는 이벤트 콜백에서 실행되는 코드를 구조화하여 다음 프레임의 시각적 업데이트를 적용하는 데 필요한 로직만 실행되도록 제한하는 것이 포함됩니다. 다른 모든 항목은 후속 작업으로 연기할 수 있습니다. 이렇게 하면 콜백이 가볍고 민첩하게 유지될 뿐만 아니라 시각적 업데이트가 이벤트 콜백 코드에서 차단되지 않도록 하여 상호작용의 렌더링 시간도 개선됩니다.

예를 들어 입력할 때 텍스트의 서식을 지정하지만 작성한 내용에 따라 UI의 다른 측면 (예: 단어 수, 맞춤법 오류 강조표시, 기타 중요한 시각적 피드백)도 업데이트하는 서식 있는 텍스트 편집기를 생각해 보세요. 또한 애플리케이션은 작성한 내용을 저장하여 사용자가 나갔다가 돌아와도 작업이 손실되지 않도록 해야 할 수도 있습니다.

이 예에서는 사용자가 입력한 문자에 응답하여 다음 네 가지가 발생해야 합니다. 하지만 다음 프레임이 표시되기 전에 첫 번째 항목만 완료해야 합니다.

  1. 사용자가 입력한 내용으로 텍스트 상자를 업데이트하고 필요한 서식을 적용합니다.
  2. 현재 단어 수를 표시하는 UI 부분을 업데이트합니다.
  3. 맞춤법 오류를 확인하는 로직을 실행합니다.
  4. 가장 최근 변경사항을 저장합니다 (로컬 또는 원격 데이터베이스).

이렇게 하는 코드는 다음과 같을 수 있습니다.

textBox.addEventListener('input', (inputEvent) => {
  // Update the UI immediately, so the changes the user made
  // are visible as soon as the next frame is presented.
  updateTextBox(inputEvent);

  // Use `setTimeout` to defer all other work until at least the next
  // frame by queuing a task in a `requestAnimationFrame()` callback.
  requestAnimationFrame(() => {
    setTimeout(() => {
      const text = textBox.textContent;
      updateWordCount(text);
      checkSpelling(text);
      saveChanges(text);
    }, 0);
  });
});

다음 시각화는 다음 프레임이 표시될 때까지 중요하지 않은 업데이트를 연기하면 처리 기간이 단축되어 전반적인 상호작용 지연 시간이 줄어드는 방법을 보여줍니다.

두 시나리오에서 키보드 상호작용과 후속 작업을 보여주는 그림 위쪽 그림에서 렌더링에 중요한 작업과 모든 후속 백그라운드 작업은 프레임을 표시할 기회가 올 때까지 동기식으로 실행됩니다. 아래 그림에서는 렌더링에 중요한 작업이 먼저 실행된 다음 기본 스레드에 양보하여 새 프레임을 더 빨리 표시합니다. 그러면 백그라운드 작업이 실행됩니다.
그림을 클릭하여 고해상도 버전을 확인하세요.

이전 코드 예에서 requestAnimationFrame() 호출 내에서 setTimeout()을 사용하는 것은 다소 난해하지만 모든 브라우저에서 작동하는 효과적인 방법으로 중요하지 않은 코드가 다음 프레임을 차단하지 못하도록 합니다.

레이아웃 스래싱 방지

레이아웃 스래싱(강제 동기 레이아웃이라고도 함)은 레이아웃이 동기적으로 발생하는 렌더링 성능 문제입니다. JavaScript에서 스타일을 업데이트한 다음 동일한 작업에서 스타일을 읽을 때 발생하며 JavaScript에는 레이아웃 스래싱을 일으킬 수 있는 속성이 많이 있습니다.

Chrome DevTools의 성능 패널에 표시된 레이아웃 스래싱 시각화
Chrome DevTools의 성능 패널에 표시된 레이아웃 스래싱의 예 레이아웃 스래싱과 관련된 렌더링 작업은 호출 스택 부분의 오른쪽 상단에 빨간색 삼각형으로 표시되며 스타일 재계산 또는 레이아웃 으로 라벨이 지정되는 경우가 많습니다.

레이아웃 스래싱은 성능 병목 현상입니다. 스타일을 업데이트한 다음 JavaScript에서 해당 스타일의 값을 즉시 요청하면 브라우저가 동기 레이아웃 작업을 강제로 실행해야 합니다. 그렇지 않으면 이벤트 콜백이 실행된 후에 비동기적으로 실행될 때까지 기다릴 수 있습니다.

표시 지연 최소화

상호작용의 표시 지연 은 상호작용의 이벤트 콜백이 실행을 완료한 시점부터 브라우저가 결과 시각적 변경사항을 보여주는 다음 프레임을 페인트할 수 있는 시점까지의 범위를 표시합니다.

DOM 크기 최소화

페이지의 DOM이 작으면 렌더링 작업이 일반적으로 빠르게 완료됩니다. 하지만 DOM이 매우 커지면 렌더링 작업이 DOM 크기 증가에 따라 확장되는 경향이 있습니다. 렌더링 작업과 DOM 크기 간의 관계는 선형이 아니지만 큰 DOM은 작은 DOM보다 렌더링하는 데 더 많은 작업이 필요합니다. 큰 DOM은 두 가지 경우에 문제가 됩니다.

  1. 초기 페이지 렌더링 중에 큰 DOM은 페이지의 초기 상태를 렌더링하는 데 많은 작업이 필요합니다.
  2. 사용자 상호작용에 응답하여 큰 DOM은 렌더링 업데이트에 많은 비용이 들 수 있으므로 브라우저가 다음 프레임을 표시하는 데 걸리는 시간이 늘어납니다.

큰 DOM을 크게 줄일 수 없는 인스턴스가 있다는 점을 명심하세요. DOM을 평면화하거나 사용자 상호작용 중에 DOM에 추가하여 초기 DOM 크기를 작게 유지하는 등 DOM 크기를 줄이는 방법이 있지만 이러한 기술은 제한적일 수 있습니다.

content-visibility를 사용하여 화면 밖 요소를 지연 렌더링

페이지 로드 중의 렌더링 작업과 사용자 상호작용에 응답하는 렌더링 작업의 양을 모두 제한하는 한 가지 방법은 CSS content-visibility 속성을 사용하는 것입니다. 이 속성은 요소가 표시 영역에 접근할 때 요소를 지연 렌더링하는 것과 같습니다. content-visibility를 효과적으로 사용하려면 약간의 연습이 필요하지만 결과가 페이지의 INP를 개선할 수 있는 더 낮은 렌더링 시간이라면 조사해 볼 가치가 있습니다.

JavaScript를 사용하여 HTML을 렌더링할 때 성능 비용에 유의

HTML이 있는 곳에는 HTML 파싱이 있으며 브라우저가 HTML을 DOM으로 파싱한 후에는 스타일을 적용하고 레이아웃 계산을 실행한 후 해당 레이아웃을 렌더링해야 합니다. 이는 피할 수 없는 비용이지만 HTML을 렌더링하는 방법 이 중요합니다.

서버가 HTML을 전송하면 브라우저에 스트림으로 도착합니다. 스트리밍은 서버의 HTML 응답이 청크 단위로 도착한다는 의미입니다. 브라우저는 스트림이 도착할 때 스트림의 청크를 점진적으로 파싱하고 조금씩 렌더링하여 스트림을 처리하는 방법을 최적화합니다. 이는 브라우저가 페이지 로드 중에 주기적으로 자동으로 암시적으로 양보하는 성능 최적화이며 무료로 제공됩니다.

웹사이트를 처음 방문할 때는 항상 어느 정도 의 HTML이 포함되지만 일반적인 접근 방식은 최소한의 초기 HTML 비트로 시작한 다음 JavaScript를 사용하여 콘텐츠 영역을 채우는 것입니다. 해당 콘텐츠 영역에 대한 후속 업데이트도 사용자 상호작용의 결과로 발생합니다. 이를 일반적으로 단일 페이지 애플리케이션 (SPA) 모델이라고 합니다. 이 패턴의 한 가지 단점은 클라이언트에서 JavaScript로 HTML을 렌더링하면 해당 HTML을 만드는 JavaScript 처리 비용이 발생할 뿐만 아니라 브라우저가 해당 HTML을 파싱하고 렌더링할 때까지 양보하지 않는다 는 것입니다.

하지만 SPA가 아닌 웹사이트도 상호작용의 결과로 JavaScript를 통해 어느 정도의 HTML 렌더링을 포함할 수 있다는 점을 기억하는 것이 중요합니다. 클라이언트에서 많은 양의 HTML을 렌더링하지 않는 한 일반적으로 괜찮습니다. 이렇게 하면 다음 프레임의 표시가 지연될 수 있습니다. 하지만 브라우저에서 HTML을 렌더링하는 이 접근 방식의 성능 영향과 JavaScript를 사용하여 많은 HTML을 렌더링하는 경우 사용자 입력에 대한 웹사이트의 응답성에 미치는 영향을 이해하는 것이 중요합니다.

결론

사이트의 INP를 개선하는 것은 반복적인 프로세스입니다. 필드에서 느린 상호작용을 해결하면 특히 웹사이트에서 많은 상호작용을 제공하는 경우 다른 느린 상호작용을 찾기 시작하고 이러한 상호작용도 최적화해야 할 가능성이 높습니다.

INP를 개선하는 열쇠는 지속성입니다. 시간이 지나면 사용자에게 제공하는 경험에 만족할 수 있는 수준으로 페이지의 응답성을 높일 수 있습니다. 사용자를 위한 새로운 기능을 개발할 때 이러한 기능에 특정한 상호작용을 최적화하는 동일한 프로세스를 거쳐야 할 가능성도 높습니다. 시간과 노력이 필요하지만 그만한 가치가 있는 시간과 노력입니다.

Unsplash의 David Pisnoy가 제공한 히어로 이미지를 Unsplash 라이선스에 따라 수정했습니다.