실습에서 느린 상호작용 수동으로 진단

현장 데이터를 실험실로 가져와 수동 테스트를 통해 느린 상호작용의 원인을 재현하고 파악하는 방법을 알아보세요.

게시일: 2023년 5월 9일

다음 페인트에 대한 상호작용 (INP)을 최적화하는 데 있어 까다로운 부분은 INP가 낮은 원인을 파악하는 것입니다. 기본 스레드에서 여러 작업을 예약하는 서드 파티 스크립트, 큰 DOM 크기, 비용이 많이 드는 이벤트 콜백, 기타 원인 등 잠재적인 원인은 많습니다.

INP를 개선하는 것은 쉽지 않을 수 있습니다. 먼저 페이지의 INP를 담당하는 경향이 있는 상호작용을 알아야 합니다. 실제 사용자 관점에서 웹사이트에서 가장 느린 상호작용이 무엇인지 모르는 경우 현장에서 느린 상호작용 찾기를 참고하세요. 지침이 될 필드 데이터가 있으면 실습 도구에서 이러한 특정 상호작용을 수동으로 테스트하여 상호작용이 느린 이유를 파악할 수 있습니다.

현장 데이터가 없는 경우

현장 데이터를 보유하면 최적화해야 하는 상호작용을 파악하는 데 많은 시간을 절약할 수 있으므로 매우 중요합니다. 하지만 필드 데이터가 없는 위치에 있을 수도 있습니다. 이 설명이 내 상황에 해당하는 경우, 개선할 상호작용을 찾을 수 있습니다. 단, 약간의 노력과 다른 접근 방식이 필요합니다.

총 차단 시간(TBT)은 로드 중에 페이지 반응성을 평가하는 실험실 측정항목으로 INP와 잘 상관합니다. 페이지의 TBT가 높은 경우 페이지가 로드될 때 사용자 상호작용에 잘 반응하지 않을 수 있다는 신호일 수 있습니다.

페이지의 TBT를 확인하려면 Lighthouse를 사용하면 됩니다. 페이지의 TBT가 높으면 페이지 로드 중에 기본 스레드가 너무 바쁠 수 있으며, 이는 페이지 수명 주기의 중요한 시점에서 페이지의 반응 속도에 영향을 미칠 수 있습니다.

페이지가 로드된 후 느린 상호작용을 찾으려면 웹사이트 분석에서 이미 식별했을 수 있는 일반적인 사용자 흐름과 같은 다른 유형의 데이터가 필요할 수 있습니다. 예를 들어 전자상거래 웹사이트에서 작업하는 경우 일반적인 사용자 흐름은 사용자가 온라인 장바구니에 상품을 추가하고 결제할 때 취하는 작업입니다.

현장 데이터가 있든 없든 다음 단계는 느린 상호작용을 수동으로 테스트하고 재현하는 것입니다. 느린 상호작용을 재현할 수 있어야만 문제를 해결할 수 있기 때문입니다.

실습에서 느린 상호작용 재현

실험실에서 수동 테스트를 통해 느린 상호작용을 재현하는 방법에는 여러 가지가 있지만 다음은 시도해 볼 수 있는 프레임워크입니다.

DevTools 성능 패널 실시간 측정항목

DevTools 성능 프로파일러는 느린 것으로 알려진 상호작용을 진단하는 데 권장되는 접근 방식이지만, 문제가 되는 상호작용이 무엇인지 모르는 경우 느린 상호작용을 식별하는 데 시간이 걸릴 수 있습니다.

하지만 실적 패널을 처음 열면 실시간 측정항목 뷰가 표시됩니다. 이를 통해 더 자세한 성능 프로파일러로 이동하기 전에 여러 상호작용을 빠르게 시도하여 문제가 있는 상호작용을 찾을 수 있습니다. 상호작용할 때 진단 데이터가 상호작용 로그에 표시되며 INP 상호작용이 강조 표시됩니다. 이러한 상호작용을 펼쳐 단계별로 분류할 수 있습니다.

상호작용 로그가 실적 패널의 실시간 측정항목 화면에 표시되는 방식
실적 패널의 실시간 측정항목 화면입니다.

Web Vitals 확장 프로그램은 느린 상호작용을 식별하는 데 도움이 되고 INP를 디버그하는 데 도움이 되는 세부정보를 제공하지만 느린 상호작용의 원인을 찾기 위해 웹사이트의 프로덕션 코드를 탐색해야 하는 자세한 데이터를 제공하므로 성능 프로파일러를 사용하여 느린 상호작용을 진단해야 할 수 있습니다.

트레이스 기록

Chrome의 성능 프로파일러는 느린 상호작용을 진단하고 문제를 해결하는 데 권장되는 도구입니다. Chrome의 성능 프로파일러에서 상호작용을 프로파일링하려면 다음 단계를 따르세요.

  1. 테스트하려는 페이지를 엽니다.
  2. Chrome DevTools를 열고 Performance 패널로 이동합니다.
  3. 패널의 왼쪽 상단에 있는 Record 버튼을 클릭하여 추적을 시작합니다.
  4. 문제를 해결하려는 상호작용을 실행합니다.
  5. Record 버튼을 다시 클릭하여 추적을 중지합니다.

프로파일러가 채워지면 먼저 프로파일러 상단의 활동 요약을 확인해야 합니다. 활동 요약에는 기록에서 긴 작업이 발생한 위치에 빨간색 막대가 표시됩니다. 이렇게 하면 문제 영역을 빠르게 확대할 수 있습니다.

Chrome DevTools의 성능 패널 상단에 표시되는 활동 요약 표시되는 활동은 대부분 긴 작업을 일으키는 JavaScript에서 발생하며, 이는 플레임 차트 위에 빨간색으로 강조 표시됩니다.
Chrome의 성능 프로파일러 상단에 있는 활동 요약입니다. 긴 작업은 활동 플레임 차트 위에 빨간색으로 강조표시됩니다. 이 경우 중요한 스크립팅 작업이 긴 작업에서 대부분의 작업을 담당했습니다.

활동 요약에서 영역을 드래그하여 선택하면 문제 영역에 빠르게 집중할 수 있습니다. 프로파일러에서 탐색경로 기능을 선택적으로 사용하여 타임라인을 좁히고 관련 없는 활동을 무시할 수 있습니다.

상호작용이 발생한 위치에 포커스를 맞추면 상호작용 트랙을 사용하여 상호작용과 그 아래의 기본 스레드 트랙에서 발생한 활동을 정렬할 수 있습니다.

Chrome DevTools의 성능 패널에 시각화된 상호작용입니다. 기본 스레드 트랙 위의 상호작용 트랙은 상호작용 기간을 표시하며, 상호작용 기간은 그 아래의 기본 스레드 활동과 함께 정렬할 수 있습니다.
Chrome DevTools의 성능 프로파일러에서 프로파일링된 상호작용입니다. 상호작용 트랙에는 클릭 상호작용에 해당하는 일련의 이벤트가 표시됩니다. 상호작용 추적 항목은 상호작용을 유도하는 작업에 걸쳐 있습니다.

상호작용 트랙에서 상호작용 위로 마우스를 가져가면 상호작용의 어떤 부분이 가장 오래 진행되었는지에 관한 추가 세부정보를 확인할 수 있습니다.

Chrome DevTools의 성능 패널에 표시된 대로 상호작용의 마우스 오버 도움말 도움말에는 상호작용에 소비된 시간과 상호작용의 입력 지연, 처리 시간, 프레젠테이션 지연을 비롯한 각 부분의 시간이 표시됩니다.
실적 패널의 상호작용 추적에서 상호작용 위로 마우스를 가져가면 표시되는 도움말입니다. 도움말에는 상호작용의 각 부분에서 소요된 시간이 표시됩니다.

상호작용의 줄무늬 부분은 페이지의 INP에 대한 '좋음' 기준점의 상한선인 200밀리초를 초과한 상호작용 시간을 나타냅니다. 상호작용의 표시되는 부분은 다음과 같습니다.

  1. 입력 지연: 왼쪽 윗부분으로 시각화됩니다.
  2. 처리 시간: 왼쪽과 오른쪽 whiskers 사이의 솔리드 블록으로 표시됩니다.
  3. 표시 지연: 오른쪽 히스토그램으로 표시됩니다.

여기서는 느린 상호작용을 유발하는 문제를 더 깊이 파헤치는 것이 중요한데, 이 내용은 이 가이드의 뒷부분에서 다룹니다.

상호작용 중 느린 부분을 식별하는 방법

상호작용은 입력 지연, 처리 시간, 프레젠테이션 지연의 세 부분으로 구성됩니다. 페이지의 INP를 낮추기 위해 상호작용을 최적화하는 방법은 가장 시간이 많이 걸리는 부분에 따라 다릅니다.

긴 입력 지연을 식별하는 방법

입력 지연은 상호작용 지연 시간을 길게 할 수 있습니다. 입력 지연은 상호작용의 첫 번째 부분입니다. 이는 운영체제에서 사용자 작업을 처음 수신한 시점부터 브라우저가 해당 상호작용의 첫 번째 이벤트 핸들러 콜백 처리를 시작할 수 있는 시점까지의 시간입니다.

Chrome의 성능 프로파일러에서 입력 지연을 파악하려면 상호작용 트랙에서 상호작용을 찾으세요. 왼쪽 히스토그램 막대의 길이는 상호작용의 입력 지연 부분을 나타내며, 성능 프로파일러에서 상호작용 위로 마우스를 가져가면 도움말에서 정확한 값을 확인할 수 있습니다.

입력 지연은 0일 수 없지만 입력 지연의 길이를 어느 정도 제어할 수 있습니다. 핵심은 콜백이 최대한 빨리 실행되지 못하게 하는 작업이 기본 스레드에서 실행 중인지 파악하는 것입니다.

Chrome의 성능 패널에 표시된 입력 지연입니다. 서드 파티 스크립트에서 타이머가 실행되어 입력 지연이 증가하여 상호작용 시작이 이벤트 콜백보다 훨씬 빨리 발생합니다.
서드 파티 스크립트의 타이머에서 실행된 태스크로 인한 입력 지연 상호작용 추적에 표시된 상호작용의 와이셔의 왼쪽 부분은 입력 지연을 시각화합니다.

이전 그림에서는 사용자가 페이지와 상호작용하려고 할 때 서드 파티 스크립트의 작업이 실행되어 입력 지연이 연장됩니다. 입력 지연이 길어지면 상호작용 지연 시간이 영향을 받아 페이지의 INP에 영향을 줄 수 있습니다.

처리 시간이 긴 항목을 식별하는 방법

이벤트 콜백은 입력 지연 직후에 실행되며 완료하는 데 걸리는 시간을 처리 시간이라고 합니다. 이벤트 콜백이 너무 오래 실행되면 브라우저가 다음 프레임을 표시하는 데 지연이 발생하고 상호작용의 총 지연 시간이 크게 늘어날 수 있습니다. 처리 시간이 길어지는 이유는 컴퓨팅 비용이 많이 드는 퍼스트 파티 또는 서드 파티 JavaScript 때문일 수 있으며, 경우에 따라 둘 다일 수도 있습니다. 성능 프로파일러에서는 상호작용 트랙의 상호작용 중 솔리드 부분으로 표시됩니다.

Chrome의 성능 패널에 있는 이벤트 콜백 작업을 보여주는 그림 타임라인의 상호작용 위로 마우스를 가져가면 처리 시간이 길다는 도움말이 표시됩니다.
Chrome DevTools의 성능 프로파일러에 표시된 대로 클릭 상호작용에 응답하여 실행되는 이벤트 콜백입니다. 처리 시간이 길다는 점에 유의하세요.

비용이 많이 드는 이벤트 콜백을 찾으려면 특정 상호작용의 트레이스에서 다음을 관찰하면 됩니다.

  1. 이벤트 콜백과 연결된 작업이 긴 작업인지 확인합니다. 실습 설정에서 장기 작업을 보다 안정적으로 표시하려면 성능 패널에서 CPU 제한을 사용 설정하거나, 낮은 등급에서 중간 등급의 Android 기기를 연결하고 원격 디버깅을 사용해야 할 수 있습니다.
  2. 이벤트 콜백을 실행하는 작업이 긴 작업인 경우 호출 스택에서 항목의 오른쪽 상단에 빨간색 삼각형이 있는 이벤트 핸들러 항목(예: 이벤트: 클릭과 같은 이름의 항목)을 찾습니다.

다음 전략 중 하나를 사용하여 상호작용의 처리 시간을 줄일 수 있습니다.

  1. 최대한 적은 작업을 수행합니다. 비용이 많이 드는 이벤트 콜백에서 발생하는 모든 작업이 반드시 필요한가요? 그렇지 않은 경우 가능하면 해당 코드를 완전히 삭제하거나 삭제할 수 없다면 실행을 나중 시점으로 연기하는 것이 좋습니다. 프레임워크 기능을 활용하는 것도 도움이 됩니다. 예를 들어 React의 메모화 기능은 프로퍼티가 변경되지 않은 경우 구성요소의 불필요한 렌더링 작업을 건너뛸 수 있습니다.
  2. 이벤트 콜백에서 렌더링이 아닌 작업을 나중에 실행하도록 지연합니다. 긴 작업은 기본 스레드에 양보하여 분할할 수 있습니다. 기본 스레드에 양보할 때마다 현재 작업의 실행을 종료하고 나머지 작업을 별도의 작업으로 나눕니다. 이렇게 하면 렌더러가 이전에 이벤트 콜백에서 실행된 사용자 인터페이스 업데이트를 처리할 수 있습니다. React를 사용하는 경우 전환 기능을 사용하여 이 작업을 할 수 있습니다.

이러한 전략을 사용하면 이벤트 콜백이 실행되는 데 걸리는 시간이 줄어들도록 최적화할 수 있습니다.

프레젠테이션 지연을 식별하는 방법

긴 입력 지연 시간과 처리 시간이 INP 저하의 유일한 원인은 아닙니다. 소량의 이벤트 콜백 코드에 대한 응답으로 발생하는 렌더링 업데이트가 비용이 많이 들 수 있습니다. 브라우저가 상호작용의 결과를 반영하기 위해 사용자 인터페이스의 시각적 업데이트를 렌더링하는 데 걸리는 시간을 표시 지연이라고 합니다.

Chrome DevTools의 성능 패널에 시각화된 렌더링 작업 렌더링 작업은 다음 프레임을 페인트하기 위해 이벤트 콜백 후에 발생합니다.
Chrome의 성능 프로파일러에 표시된 대로 태스크 렌더링 오른쪽 히스토그램은 프레젠테이션 지연 시간을 시각화합니다.

렌더링 작업은 대부분 스타일 재계산, 레이아웃, 페인트, 합성과 같은 작업으로 구성되며 프로파일러의 플레임 차트에서 보라색 및 녹색 블록으로 표시됩니다. 총 표시 지연은 상호작용 트랙에서 상호작용의 오른쪽 수염으로 표시됩니다.

높은 상호작용 지연 시간을 유발할 수 있는 모든 원인 중에서 프레젠테이션 지연은 문제를 해결하고 해결하기가 가장 까다로울 수 있습니다. 과도한 렌더링 작업의 원인은 다음과 같습니다.

  • 큰 DOM 크기 페이지의 프레젠테이션을 업데이트하는 데 필요한 렌더링 작업은 페이지의 DOM 크기와 함께 증가하는 경우가 많습니다. 자세한 내용은 DOM 크기가 상호작용성에 미치는 영향 및 해결 방법을 참고하세요.
  • 강제 리플로우. 이는 JavaScript의 요소에 스타일 변경사항을 적용한 다음 즉시 해당 작업의 결과를 쿼리할 때 발생합니다. 따라서 브라우저가 업데이트된 스타일을 반환할 수 있도록 다른 작업을 실행하기 전에 레이아웃 작업을 실행해야 합니다. 강제 리플로를 방지하는 방법에 관한 자세한 내용과 도움말은 크고 복잡한 레이아웃 및 레이아웃 스래싱 피하기를 참고하세요.
  • requestAnimationFrame 콜백에서 과도하거나 불필요한 작업 requestAnimationFrame() 콜백은 이벤트 루프의 렌더링 단계 중에 실행되며 다음 프레임을 표시하기 전에 완료되어야 합니다. requestAnimationFrame()를 사용하여 사용자 인터페이스 변경과 관련 없는 작업을 실행하는 경우 다음 프레임이 지연될 수 있습니다.
  • ResizeObserver 콜백을 참조하세요. 이러한 콜백은 렌더링 전에 실행되며, 작업이 비용이 많이 드는 경우 다음 프레임의 프레젠테이션이 지연될 수 있습니다. 이벤트 콜백과 마찬가지로 다음 프레임에 필요하지 않은 로직은 지연시킵니다.

느린 상호작용을 재현할 수 없는 경우 어떻게 해야 하나요?

현장 데이터에 따르면 특정 상호작용은 느리지만 실습에서 문제를 직접 재현할 수 없는 경우에는 어떻게 해야 할까요? 이러한 현상이 발생하는 데는 몇 가지 이유가 있지만, 중요한 이유 중 하나는 상호작용을 테스트할 때의 환경이 하드웨어와 네트워크 연결에 따라 달라지기 때문입니다. 빠른 연결에서 빠른 기기를 사용하고 있을 수 있지만 사용자가 그렇다고는 할 수 없습니다. 이 문제가 발생한 경우 다음 세 가지 방법 중 하나를 시도해 보세요.

  1. 실제 Android 기기가 있는 경우 원격 디버깅을 사용하여 호스트 머신에서 Chrome DevTools 인스턴스를 열고 느린 상호작용을 재현해 봅니다. 휴대기기는 노트북이나 데스크톱 컴퓨터만큼 빠르지 않은 경우가 많으므로 이러한 기기에서는 느린 상호작용이 더 쉽게 관찰될 수 있습니다.
  2. 실제 기기가 없는 경우 Chrome DevTools에서 CPU 제한 기능을 사용 설정합니다.
  3. 페이지와 상호작용하기 전에 페이지가 로드되기를 기다리고 있지만 사용자는 그러지 않을 수 있습니다. 빠른 네트워크를 사용한다면 네트워크 제한을 사용 설정하여 느린 네트워크 조건을 시뮬레이션하고 그다음 페인트가 완료되는 즉시 페이지와 상호작용하세요. 시작 시 기본 스레드가 가장 붐비는 경우가 많고 이 기간 동안 테스트하면 사용자가 경험하는 환경을 파악할 수 있으므로 이렇게 해야 합니다.

INP 문제 해결은 반복적인 프로세스입니다.

INP 저하에 기여하는 높은 상호작용 지연의 원인을 찾는 데는 많은 노력이 필요하지만 원인을 파악할 수 있다면 절반의 성공을 거둔 것입니다. 잘못된 INP 문제를 해결하기 위한 체계적인 접근 방식을 따르면 문제의 원인을 확실하게 파악하여 더 빠르게 올바른 해결책을 도출할 수 있습니다. 검토하려면 다음 단계를 따르세요.

  • 현장 데이터를 사용하여 느린 상호작용 찾기
  • 실험실에서 문제가 있는 필드 상호작용을 수동으로 테스트하여 재현 가능한지 확인합니다.
  • 긴 입력 지연, 값비싼 이벤트 콜백 또는 값비싼 렌더링 작업 때문인지 확인합니다.
  • 반복

이 중 마지막 항목이 가장 중요합니다. 페이지 성능을 개선하기 위해 수행하는 다른 대부분의 작업과 마찬가지로 INP 문제 해결 및 개선은 주기적인 프로세스입니다. 느린 상호작용 하나를 수정하면 다음으로 이동하고 결과가 나타날 때까지 반복합니다.