데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      페이지 노출 여부를 판별하는 Page Visibility API 살펴보기

      chamming2 24.07.08
      1,533 9 0
      DEVOTEE 요약
      방문형 광고 기능을 구현하기 위해 페이지의 포커스(event)를 감지해 콜백을 실행하는 방법을 소개하고 있습니다. 단순한 focus 이벤트 대신 더 정밀한 Page Visibility API를 사용하면 페이지 이탈 및 복귀를 명확하게 판별할 수 있습니다. visibilitychange 이벤트를 활용해 페이지가 유저에게 보이는지 여부를 감지해 광고 상태를 검사하는 코드를 작성하는 방법을 설명합니다.

      컨텐츠로 수익을 창출할 수 있는 시대가 되면서 미디어에 광고를 부착하는 것이 흔한 광경이 되었는데요,

      여러 광고 유형들 중에서도 제 3의 페이지를 방문하도록 유도하는 형태가 점점 많이 보이는 것 같아요.

      Untitled.png

      예시 : “쿠팡 방문하고 계속 읽기”

      그런데 갑자기 광고팀에서 우리의 플랫폼에도 방문형 광고 기능을 추가해달라고 요청하면 어떻게 해야 할까요?

      이런 요청을 가정하고, 오늘은 한번 간단한 방문형 광고를 만들어 보겠습니다.

      🔔 필요한 코드는 아래 링크에 미리 준비해 두었어요!

      깃허브 저장소 링크


      방문형 광고 기능 만들기

      “광고를 시청하고 복귀했을 때” 컨텐츠가 노출되는 로직은 어떤 형태로 구성해야 할까요?

      실제로는 더 복잡한 과정들을 거치겠지만, 아마 대략적으로는 이런 흐름이 될 것 같아요.

      스크린샷 2024-06-01 21.22.12.png

      여기서 빨갛게 표시한 부분을 주목해야 하는데요, 사용자가 다른 페이지에 진입했다가 복귀했을 때 콜백을 실행하도록 하는 것 이 중요한 요건 중 하나입니다.

      이를 구현하려면 어떤 장치를 활용해야 할까요?


      페이지에 초점을 맞출 때 콜백 실행하기

      아무래도 제일 먼저 떠오르는 것은 페이지에 포커스를 맞출 때마다 콜백을 실행하는 방법이에요.

      스크린샷 2024-06-01 21.37.11.png

      코드로 표현하면 이런 모습이 될 텐데요, 이 코드는 “어느 정도는” 훌륭하게 동작해요.

      const [adWatched, setAdWatched] = useState(false);
      
      useEffect(() => {
        fetchAdStatus();
      }, []);
      
      useEffect(() => {
        window.addEventListener("focus", fetchAdStatus);
        return () => {
          document.removeEventListener("focus", fetchAdStatus);
        };
      }, []);
      
      const fetchAdStatus = async () => {
        if (adWatched) return;
        const res = await getAdStatusFromServer();
      
        if (res.watched) {
          setAdWatched(() => true);
        }
      };

      화면 기록 2024-06-01 22.02.30.gif

      광고 페이지에 들어갔다 나오면 컨텐츠가 잘 노출되지만, 사용자가 뷰포트 바깥(Ex. 개발자 도구, URL 입력 창 등) 에 포커스를 맞췄다가 창을 누를 때마다 요청이 전송되고 있는 모습이에요.

      지금은 단순히 광고 시청 여부만을 검사하기 때문에 focus 이벤트를 사용해도 문제가 없지만 마케팅 데이터 분석 등을 위해

      페이지 복귀, 이탈 이벤트를 정밀하게 수집해야 하는 경우에는 적합하지 않을 수 있는데요,

      바로 이런 상황에서 오늘 소개할 Page Visibility API를 고려해볼 수 있습니다.


      Page Visibility API

      브라우저는 focus, blur 이벤트 외에도 “페이지가 유저에게 보여지고 있는지” 를 직관적으로 판별할 수 있는 API를 제공합니다.

      아마 이런 로직이 필요할 때 유용하게 사용될 수 있겠죠?

      • 다른 탭으로 전환할 때 비디오나 배경음악을 정지하는 로직

      • 페이지로의 복귀, 이탈 시점을 감지하는 로직

      • MDN에 기고된 글 에 따르면 특히 페이지를 이탈할 때의 로직을 작성할 때 유용하다고 해요.

        (아마 unload 이벤트가 deprecate 되었고, beforeunload 역시 큰 신뢰를 얻지 못하고 있기 때문일 것 같아요)


      사용법

      document의 visibilitychange 이벤트를 사용하면 페이지가 유저에게 노출되거나 숨겨질 때 실행될 동작을 지정할 수 있습니다.

      // 1. visibilitychange 이벤트로 페이지 노출 여부를 감지할 수 있다.
      document.addEventListener("visibilitychange", () => {
        if (document.hidden) {
          // 페이지가 유저에게 보이지 않을 때 수행할 동작
        } else {
          // 페이지가 유저에게 나타날 때 수행할 동작
        }
      });
      
      // ------------------------------------------------------------------- //
      
      // 2. document.visibilityState 속성으로 페이지 노출 여부를 감지할 수 있다.
      if(document.visibilityState === "hidden") {
          // 페이지가 유저에게 보이지 않을 때 수행할 동작
      }
      
      else if(document.visibilityState === "visible") {
          // 페이지가 유저에게 나타날 때 수행할 동작
      }

      위에서 focus 이벤트로 작성했던 로직을 visibilitychange 이벤트를 사용하도록 다시 작성해 보겠습니다.


      페이지를 '보게 될 때' 콜백 실행하기

      focus 이벤트를 사용할 때와 거의 유사하지만, visibilitychange 이벤트를 사용하면 다음 상황에서 콜백이 실행됩니다.

      • 다른 탭으로 이동했다가 돌아올 때

      • 다른 페이지로 이동했다가 돌아왔을 때

      • 브라우저를 최소화했다가 복구했을 때

      Untitled.png

      // focus 대신 visibilitychange 이벤트를 사용하는 코드
      const [adWatched, setAdWatched] = useState(false);
      
      useEffect(() => {
        fetchAdStatus();
      }, []);
      
      useEffect(() => {
        document.addEventListener("visibilitychange", fetchAdStatus);
        return () => {
          document.removeEventListener("visibilitychange", fetchAdStatus);
        };
        fetchAdStatus;
      }, []);
      
      const fetchAdStatus = async () => {
        // 이미 광고를 봤거나, 광고를 보는 중이라면 실행하지 않는다
        if (adWatched || document.hidden) return;
        const res = await getAdStatusFromServer();
      
        if (res.watched) {
          setAdWatched(() => true);
        }
      };

      코드만 봤을 때는 이전과 달라진 점이 크게 없지만 실행 결과에는 차이가 생겼는데요,

      더이상 콘솔과 URL 입력창에 포커스를 맞췄을 때는 로그가 찍히지 않고 페이지에 복귀했을 때만 이벤트가 호출됩니다.

      화면 기록 2024-06-02 01.17.12.gif


      정리

      • 페이지에 복귀, 이탈했음을 인식하기 위해 focus, blur 이벤트를 사용할 수도 있지만,

        visibilitychange 이벤트를 활용하면 보다 직관적이고 정확하게 페이지 노출 여부를 판별해낼 수 있습니다.

      • visibilitychange 이벤트는 특히 페이지를 이탈하는 경우 (Ex. 탭 전환, 브라우저 최소화, 홈 버튼 눌러서 모바일 앱 최소화 등) 를 판별할 때 유용하게 사용될 수 있습니다.

      간단하지만 유용한 이번 인터페이스가 도움이 될 수 있길 기대하겠습니다.


      그럼, 오늘도 즐거운 코딩 하세요!


      참고 및 함께 보면 좋을 링크

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      chamming2 님의 최신 블로그

      더보기
      동영상 기고하기