공유/React, Next

Next에서 특정 페이지에 사용자가 머무는 시간 측정 방법

구하천포 2024. 10. 16. 18:30

구글 애널리틱스(GA)를 이용하여 해결할 수 있습니다. 그러나 자체적으로 관리하기 위해 커스텀 훅을 구현하였습니다.

학습 개념

  • Next.js 페이지 로드 이벤트
  • Next.js 페이지 이탈, 종료 이벤트
  • Next.js 새로고침 이벤트

usePageStayDuration

usePageStayDuration 훅은 사용자가 현재 페이지에 머무는 시간을 측정하는 기능을 제공합니다.
이 훅은 Next.js의 라우터 이벤트를 활용하여 페이지 전환 및 새로 고침 시 머무른 시간을 기록합니다.
아래에서 이 훅의 동작 방식과 구현 세부 사항을 설명하겠습니다.

코드

먼저 구현된 코드를 확인해보도록 하겠습니다.

import { useRouter } from "next/router";
import { useEffect, useRef } from "react";

const usePageStayDuration = () => {
  const router = useRouter();

  const isRefresh = useRef(false);
  const startTime = useRef(Date.now());
  const duration = useRef(0);

  useEffect(() => {
    const calculateDuration = () => {
      const endTime = Date.now();
      return (endTime - startTime.current) / 1000;
    };

    const handleRouteChangeStart = () => {
      if (isRefresh.current) return;
      duration.current += calculateDuration();
    };

    const handleRouteChangeComplete = () => {
      if (isRefresh.current) return;
      startTime.current = Date.now();
      duration.current = 0;
    };

    const handleBeforeUnload = () => {
      isRefresh.current = true;
      duration.current += calculateDuration();
    };

    router.events.on("routeChangeStart", handleRouteChangeStart);
    router.events.on("routeChangeComplete", handleRouteChangeComplete);
    window.addEventListener("beforeunload", handleBeforeUnload);

    return () => {
      router.events.off("routeChangeStart", handleRouteChangeStart);
      router.events.off("routeChangeComplete", handleRouteChangeComplete);
      window.removeEventListener("beforeunload", handleBeforeUnload);
    };
  }, [router.events, startTime]);
};

export default usePageStayDuration;

상태 관리

  • isRefresh
    페이지 새로 고침 여부를 확인하는 참조 변수입니다.
  • startTime
    사용자가 페이지에 진입한 시점을 기록합니다.
  • duration
    사용자가 페이지에 머문 총 시간을 초 단위로 누적합니다.

제가 구현한 코드에서는 렌더링과 무관하기 때문에 ref로 관리하였습니다.
만약 렌더링에 따라 동작하기 원하면 state로 변경하시면 됩니다.

이벤트 핸들러 및 함수 설명

routeChangeStart 이벤트는 route가 변경되는 시점에 발생하는 이벤트입니다.
routeChangeComplete 이벤트는 route 변경이 완료된 시점에 발생하는 이벤트입니다.
위 2가지는 Next.js에서 제공해주는 이벤트입니다.

새로고침 이벤트는 window 객체를 사용하셔야 합니다.
beforeunload 이벤트를 사용하시면 됩니다.

  • calculateDuration
    페이지에 머무는 시간을 계산합니다. 현재 시간을 가져와서 startTime과의 차이를 계산하여 반환합니다.
  • handleRouteChangeStart
    페이지 전환이 시작될 때 호출됩니다. 페이지 새로 고침이 아닌 경우, 현재까지의 머무른 시간을 누적합니다.
  • handleRouteChangeComplete
    페이지 전환이 완료될 때 호출됩니다. 새로 고침이 아닌 경우, 새 페이지 진입을 위해 startTime을 현재 시간으로 업데이트하고 duration을 초기화합니다.
  • handleBeforeUnload
    사용자가 페이지를 떠나기 전에 호출됩니다. 새로 고침 여부를 확인하고, 현재까지의 머무른 시간을 누적합니다.

결론

Next에서 제공해주는 라우터 이벤트를 활용하여 간단히 구현해보았습니다.
사용자의 행동을 분석하는데 도움이 되셨으면 좋겠습니다.

반응형