Google, Discourse 사이트의 느린 Interaction to Next Paint(INP)에 대한 불만 제기

안녕하세요. 먼저 말씀드리고 싶은 것은, 저는 SEO를 추격하거나 구글이 제 사이트가 어떻게 생기고 작동해야 한다고 생각하는 요구사항 선호도에 맞추기 위해 별다른 노력을 기울이는 사람이 아니라는 점입니다. 하지만 구글이 곧 랭킹에 매우 큰 비중으로 반영될 새로운 "Core Web Vitals 지표"에서 사이트 개선이 필요하다는 이메일을 보내왔다는 점은 알아두는 것이 좋습니다:

Discourse Meta에 대한 보고서는 제 사이트보다 INP가 다소 나쁜 상태입니다(372ms 대 208ms):

Discourse가 기본적으로 JavaScript 웹 앱이므로, 이러한 지표를 개선하는 것이 쉽지는 않을 것 같습니다. 하지만 구글은 Moto G Power 폰을 에뮬레이션한다고 주장하면서도, 웹 크롤러가 보는 JavaScript가 없는 버전을 기반으로 랭킹을 매기는 것으로 보입니다…

…그래서 그들의 알고리즘과 랭킹이 결정하는 것에 대해 크게 믿거나 신경 쓰지는 않습니다. 하지만 개발자와 사이트 관리자들이 이 점을 인지해 두는 것이 좋다는 참고 사항으로 남겨둡니다.

6개의 좋아요

Hi @rahim123 - INP 개선은 Discourse의 페이지 내비게이션 애니메이션을 전체 페이지 '스피너’에서 슬라이더로 전환하는 주요 동기 중 하나입니다. 해당 변경 사항은 지난주에 Meta에만 배포되었기 때문에, Google의 웹 비탈스 조사 데이터에 그 변화가 반영되기에는 아직 이릅니다.

하지만 데이터를 주시하고 있으며, 필요 시 추가적인 조정을 검토하겠습니다.

12개의 좋아요

답변해 주셔서 감사합니다. 이 문제를 잘 파악하고 계시다니 다행입니다.

저는 Google의 실시간 URL 테스트기(https://pagespeed.web.dev)를 사용했는데, 그러면 이미 랭킹에 포함되지 않나요? 그리고 Google이 JavaScript가 없는 버전을 보고 있으므로, 스피너와 슬라이더를 어떻게 고려하는지 모르겠습니다. INP(입력 지연)는 같은 웹사이트 내에서 한 페이지에서 다른 페이지로 이동하는 것과 관련이 있는 것 아닌가요? 그렇다면 단일 URL에 대해 해당 메트릭을 어떻게 측정하는지 정말로 이해가 되지 않습니다. 죄송합니다. 페이지 아키텍처와 Google의 최신 정책 변화와 관련된 이러한 세부 사항에 대해 저는 전문가가 아니기 때문입니다.

1개의 좋아요

네, 'PageSpeed Insights’와 Google 검색 크롤러는 Discourse의 기본 HTML 버전을 가져옵니다. 따라서 불행히도 이러한 온디맨드 도구는 우리에게 큰 도움이 되지 않습니다.

검색 랭킹을 위해 Google은 데스크톱과 Android에서 Chrome 사용자들이 생성한 실제 데이터를 수집하여 사용합니다. 이 데이터는 Overview of CrUX  |  Chrome UX Report  |  Chrome for Developers 에서 공개적으로 이용할 수 있습니다. 불행히도 데이터 수집과 공개 사이에 1~2개월의 지연이 있어, 이 새로운 로딩 슬라이더의 실제 영향력을 확인하려면 잠시 기다려야 합니다.

자신의 사이트(또는 Meta)에 대한 Google 데이터를 보려면 여기로 가서 도메인을 입력하세요: CrUX Dashboard  |  Chrome UX Report  |  Chrome for Developers. 보고서를 로드한 후, 왼쪽에 INP 탭이 있습니다. 기억이 맞다면, Google은 검색 랭킹에 ‘모바일’ 데이터에 중점을 두므로, 디바이스 필터를 사용하여 해당 데이터를 자세히 살펴봐야 합니다.

Meta의 모바일 데이터:

목표는 적어도 75%가 '좋음’을 달성하는 것입니다. 이는 Google이 검색 랭킹에 사용하는 P75 INP 값이 200ms 미만이어야 함을 의미합니다.

9개의 좋아요

와, 그건 정말 들어본 적도 없네요. 설명해 주셔서 정말 감사합니다!

3개의 좋아요

참고로, 사이트가 공개된 이후로 discourse-loading-slider 테마 컴포넌트를 단독으로 사용해 왔습니다. 아직 "개선이 필요"한 상태입니다.

특히 구글에서 접속하는 익명 계정이 주로 접근하는 페이지들이 가장 성능이 나쁜 것 같습니다. 제 포럼만의 특수한 상황일 수도 있지만, 공유해 두는 것이 좋겠다고 생각했습니다.

4개의 좋아요

데이비드, 확실히 큰 개선으로 보이긴 하네. 그래도 나는 옛날 스피너가 좀 좋아서 말이야. :wink:
여기서 그 개선을 가능하게 한 고수준의 기술적 접근 방식 변경이 뭔지 다시 한번 알려줄래? 그거 어딘가에 문서화되어 있어?

INP 개선에 관한 건가요?

기존 스피너를 사용할 때는 순서가 다음과 같았습니다.

  1. 링크 클릭
  2. Ember가 모든 DOM을 해체하고 이전 루트의 컴포넌트를 정리
  3. 스피너가 화면에 렌더링됨
  4. 네트워크 요청이 해결되면 새 루트가 DOM에 렌더링됨

슬라이더를 사용하면 2단계가 생략됩니다. 슬라이더는 비용이 많이 드는 해체 과정을 기다릴 필요 없이 즉시 렌더링됩니다.

여기서 명확히 할 점이 있습니다: 우리가 기본값을 전환한 주된 동기는 개선된 UX입니다. INP 지표 개선도 좋지만, 변경의 주된 이유는 아닙니다.

5개의 좋아요

네, 가장 중요한 건 인식이고, 콘텐츠를 너무 빨리 삭제하지 않는 건 좋은 디테일입니다. 정말 잘했어요!

1개의 좋아요

INP가 사이트 랭킹에 영향을 미치는 시점은 2024년 3월이라는 점을 매우 중요하게 여겨야 합니다. 따라서 오늘 우리가 진행 중인 개선 작업은 Google에 영향을 주기 시작하기 전에 반복적으로 다듬을 시간이 있습니다.

7개의 좋아요

저도 옛날 스피너를 꽤 좋아합니다. 옛날 스피너를 사용할 수 있는 테마 구성 요소(또는 사용자 설정)를 추가할 수 있을까요?

3개의 좋아요

다시 전환할 수 있는 시스템 전체 설정이 있습니다: page loading indicator

맞습니다. 하지만 새로운 방식을 선호하는 사람들도 있기에, 그들의 설정을 건드리고 싶지 않습니다.

그리고 기억이 맞다면, 해당 전환 기능은 곧 제거될 예정이라고 합니다.

2개의 좋아요

아, 최근에 추가된 거라고 생각했는데요?

맞습니다. 하지만 이 내용을 참고해 보세요:

4개의 좋아요

meta.discourse.org와 같은 자체 도메인의 데이터의 경우, Google Search Console의 ‘경험(Experience)’ → ‘핵심 웹 바이탈(Core Web Vitals)’ → ‘모바일(보고서 열기)’ 섹션에 항상 최신 보고서가 숨겨져 있습니다. 여기서 아래로 스크롤하여 ‘INP 문제: 200ms 초과(모바일)’ 항목을 확인하세요.

편집: 이는 더 낮은 확률/높은 영향도 범주에 해당합니다. INP는 p75만 고려합니다.

INP는 Matomo 코어나 플러그인의 게시글 ?조리(cooking)? 과정(로드 시 JS를 통한 기능 강화)에 의해 영향을 받을 수 있습니다. 이러한 과정은 '렌더링 차단 시간(render blocking time)'이 큰 ‘무거운’ JS 작업을 수행합니다.

특히 사용자가 다른 스레드로 전환할 때, 10~20개의 게시글이 동시에 "조리(cooked)"됩니다.

이 경우 개별 게시글에 대한 작업을 별도의 setTimeouts()로 나누어 브라우저가 개별 작업 사이에 페인팅(painting)을 수행할 수 있도록 하고, 전체 프로세스가 완료될 때까지 기다리지 않도록 하는 것이 항상 좋습니다.

예를 들어 다음과 같은 코드가 있습니다:

var initializeSliderSlickItem = function (item) {
  /* 실제 초기화 작업을 여기에 수행 */
  var $this = $(item);
  […]
};

$('.slider-slick').each(function () {
  var item = this;
  setTimeout(initializeSliderSlickItem, 0, item);
});

정말 그렇게 생각하시나요? 한 주제에서 다른 주제로 이동할 때, **다음 페인트(next paint)**는 페이지 상단의 로더가 되며, 이는 즉시 시작됩니다.

1개의 좋아요
수정: 이것은 더 낮은 확률/높은 영향도 범주에 해당합니다. INP는 p75만 고려합니다.

…그리고 이후 쿠킹(cooking)이 시작됩니다. 사용자가 Discourse 쿠킹 작업이 실행 중일 때 무언가를 클릭하면, Google은 INP를 다음 페인트까지의 시간으로 측정합니다. 다음 페인트는 실행 중인 쿠킹 작업이 끝나는 시점에 가장 일찍 나타날 수 있습니다.

web.dev: INP: What is an interaction 참고

“상호작용의 생명주기. 이벤트 핸들러가 실행되기까지 입력 지연이 발생하며, 이는 메인 스레드에서 긴 작업(예: “쿠킹”)과 같은 요인에 의해 발생할 수 있습니다. 이후 상호작용의 이벤트 핸들러가 실행되고, 다음 프레임이 표시되기 전까지 지연이 발생합니다.”


Google은 “페이지의 전체 생명주기 동안” 여러 차단 이벤트가 있는 경우, INP 계산 시 가장 긴 페인트 차단 시간을 고려합니다. 생명주기 예시:

  1. URL 스레드 “A” 열림
  2. 스피너 표시
  3. 스레드 "A"에서 게시물 쿠킹
  4. 클릭 1: 사용자가 스레드 “B” 링크 클릭
  5. 스피너 표시
  6. 스레드 “B” 로딩
  7. 스레드 "B"에서 게시물 쿠킹
  8. 클릭 2: 스레드 "B"가 여전히 쿠킹 중일 때 사용자가 스레드 “C” 링크 클릭
  9. 스레드 "B"에서 실행 중인 쿠킹 작업 완료 (<-- 클릭 2의 INP에 포함됨)
  10. 스피너 표시
  11. 스레드 “C” 로딩
  12. 스레드 "C"에서 게시물 쿠킹
  13. …

또한 web.dev: INP: What is an interaction 참고

“INP는 사용자가 페이지를 떠날 때 계산되며, 이는 페이지의 전체 생명주기 전반에 걸친 페이지의 전반적인 반응성을 나타내는 단일 값이 됩니다.”

지표의 p75를 사용한다는 점은, 당신이 묘사한 시나리오에 대해 누구도 크게 걱정할 필요가 없다는 것을 의미하며, 이는 Discourse와의 일반적인 상호작용을 대표하지 않는다는 것이 분명합니다.

2개의 좋아요