๐Ÿฌ ๊ธดํ˜ธํก/๊ณ ์Šค๋ฝ ํ‹ฐ์ผ“

[2.0] ๋žœ๋”ฉํŽ˜์ด์ง€, GA, QA, ๋Ÿฐ์นญ!

ํ•œ๊ทœ์ง„ 2022. 9. 14. 01:09

๋ฒŒ์„œ ๊ณ ์Šค๋ฝ ํ‹ฐ์ผ“ ํšŒ๊ณ  ๋งˆ์ง€๋ง‰ ์‹œ๋ฆฌ์ฆˆ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ '์ด๊ฑด ์ ์–ด๋†”์•ผ์ง€' ํ–ˆ๋‹ค๊ฐ€ ๊นŒ๋จน์€๊ฒŒ ์žˆ์„ํ…๋ฐ. (์ ์  ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๊ฐ€ ์ผ๊ธฐ์žฅ์ฒ˜๋Ÿผ ์“ฐ์ด๋Š”๊ฒƒ ๊ฐ™์ง€๋งŒ) ์•„์ฃผ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ์— ๊ฑธ๋งž๋Š” ์•„์ฃผ์•„์ฃผ ๋ฉ‹์ง„ ๊ณต์—ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง๋„ ์—ฌ์šด์ด ๊ฐ€์‹œ์ง€ ์•Š๋Š”๊ตฐ์š”. ํžˆ. ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 


 

๋žœ๋”ฉํŽ˜์ด์ง€

๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ•œ๋ฒˆ์ด ์–ด๋ ต์ง€, ๋‘๋ฒˆ์€ ๊ทธ๋ž˜๋„ ํ• ๋งŒํ•˜๋‹ค. 3์›”๊ณต์—ฐ์ด๋ผ๋Š” ์•„์ฃผ ์ ํ•ฉํ•œ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—. 

 

์ด์ „๊ณผ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ์—์„œ ํฐ ์ฐจ์ด๋Š” ์—†๋‹ค. ๋Œ€์‹  ์ „์ฒด์ ์œผ๋กœ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์‹น ๊ฑท์–ด๋ƒˆ์Œ. ๊ฒ€์ • ๋ฐฐ๊ฒฝ์„ ์“ฐ๋‹ˆ๊นŒ ๋‹ค๋ฅธ ์ƒ‰๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค!! ๋””์ž์ธ์ด ์ œ์ผ ํž˜๋“ค์–ด. ๋‹ค๋ฅธ ์–ด๋Š ํŽ˜์ด์ง€๋ณด๋‹ค ์ œ์ผ ์™„์„ฑ๋„๊ฐ€ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋””ํ…Œ์ผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฑ™๊ธฐ๋Š”๊ฒŒ ๊ฝค ์ŠคํŠธ๋ ˆ์Šค์˜€๋‹ค. ๋•๋ถ„์— ๊ฒฐ๊ณผ๋Š” ํ›จ์”ฌ ์ด์˜๊ฒŒ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™์•„ ์ข‹๋‹ค. ํŠนํžˆ ๋ฐ˜์‘ํ˜•์ด ๊ธฐ๊น”๋‚˜๊ฒŒ ์ž˜ ๋ฝ‘ํ˜€์„œ ๊ธฐ๋ถ„์ด ์ข‹์Œ.

 

 

์ œ์ผ ์‹ ๊ฒฝ ์ผ๋˜ ๋ถ€๋ถ„์€ ์Šคํฌ๋กค ์œ„์น˜์— ๋”ฐ๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด์—ˆ๋‹ค. ์ƒ๋‹จ๋ฐ”๊ฐ€ ์Šคํฌ๋กค์„ ์กฐ๊ธˆ ๋‚ด๋ ธ์„ ๋•Œ๋ถ€ํ„ฐ ๋ฐฐ๊ฒฝ์ด ํ•˜์–—๊ฒŒ ๋˜๋„๋ก, ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ ํ”Œ๋กœํŒ… ๋ฒ„ํŠผ์€ ํ™”๋ฉด์ด ์ œ์ผ ์œ„์™€ ์•„๋ž˜์— ์žˆ์„ ๋• ์‚ฌ๋ผ์ง€๋„๋ก.

 

์ฒ˜์Œ์—๋Š” ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ์—์„œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ window.scrollY ๊ฐ’์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค state์— ๋ณ€๊ฒฝํ•˜๋„๋ก ํ–ˆ์—ˆ๋‹ค. state๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์ „์ฒด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋ฉด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๊ณ„์† ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋Š” ์ฐธ์‚ฌ๊ฐ€ ์žˆ์—ˆ๋‹ค.

์š”๊ธฐ

๊ทธ๋ž˜์„œ ์Šคํฌ๋กค ๋†’์ด๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋กœ์ง์„ ์ปค์Šคํ…€ํ›…์œผ๋กœ ๋งŒ๋“ค์–ด๋†“๊ณ , ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์žฌ๋ Œ๋”๋ง์ด ๋˜๋„๋ก ๋ฐ”๊พธ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

 

useScroll.tsx

import { throttle } from 'lodash';
import { useEffect, useState } from 'react';

const useScroll = () => {
  const [scrollY, setScrollY] = useState<number>(0);
  const onScroll = throttle(() => {
    setScrollY(window.scrollY);
  }, 100);

  useEffect(() => {
    window.addEventListener('scroll', onScroll);
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return { scrollY };
};

export default useScroll;

 

 

๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค

์ „์ฒด ์‚ฌ์šฉ์ž๊ฐ€ ๋ช‡๋ช…์ธ์ง€, ์กฐํšŒ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€ ๋“ฑ์„ ๋ณด๊ณ  ์‹ถ์–ด์„œ ๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค๋„ ๋‹ฌ์•„๋ณด์•˜๋‹ค.

react-ga ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

useGAPageTraking.tsx

const TRACKING_ID = process.env.REACT_APP_GA_TRACKING_ID!;

const useGAPageTracking = () => {
  const location = useLocation();
  const [initialized, setInitialized] = useState(false);
  /* localhost๋Š” ์ธ์ง€ ๋ชปํ•˜๊ฒŒ  */
  useEffect(() => {
    if (!window.location.href.includes('localhost')) {
      ReactGA.initialize(TRACKING_ID);
    }
    setInitialized(true);
  }, []);

  useEffect(() => {
    if (initialized) {
      ReactGA.pageview(location.pathname + location.search);
    }
  }, [initialized, location]);

  // ๊ฐœ๋ฐœ์šฉ
  /*   useEffect(() => {
    ReactGA.initialize(TRACKING_ID);
    ReactGA.pageview(location.pathname + location.search);
  }, [location]); */
};

export default useGAPageTracking;

์œ„ ํ•จ์ˆ˜๋ฅผ App.tsx์— ๊ฐ€์ ธ์™€ ์‹คํ–‰ํ•œ๋‹ค.

 

๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค ์„ค์ •์€ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋ญ ์ž˜ ๋‚˜์˜ด. ์• ๋„๋ฆฌํ‹ฑ์Šค4๊ฐ€ ์•„๋‹ˆ๋ผ '์œ ๋‹ˆ๋ฒ„์„ค ์• ๋„๋ฆฌํ‹ฑ์Šค ์†์„ฑ๋งŒ ๋งŒ๋“ค๊ธฐ'๋ฅผ ์„ ํƒํ•˜๋Š”๊ฒŒ ํฌ์ธํŠธ. react-ga์—์„œ ๊ทธ๊ฑธ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‚ด๋…„ 7์›”๋ถ€ํ„ด ์‚ฌ์šฉ ๋ชปํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ.. ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ๋– ๋‚˜๋ด…์‹œ๋‹ค.

 

 

๋ณธ์ธ์˜ ํ‹ฐ์ผ“ QR์ฝ”๋“œ ํŽ˜์ด์ง€๋ฅผ ๋ฌด๋ ค 22๋ฒˆ์ด๋‚˜ ๋“ค์–ด๊ฐ„ ๋ถ„์ด ์žˆ๊ธธ๋ž˜ ํ™•์ธํ•ด๋ดค๋”๋‹ˆ 22ํ•™๋ฒˆ ์นœ๊ตฌ์˜€์Œ. ๊ดœํžˆ ๋ฟŒ๋“ฏํ•˜๋‹ค. ์‘์›ํ†ก ํŽ˜์ด์ง€์— ์ƒ๊ฐ๋ณด๋‹ค ๋ทฐ๊ฐ€ ์ ์–ด์„œ ์•„์‰ฝ๋‹ค. ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋„ ๋“ค์–ด๊ฐ€์„œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ์–ด๋• ์„๊นŒ ํ•˜๋Š” ์•„์‰ฌ์›€์ด ์žˆ๋‹ค.

 

๋Ÿฐ์นญ ์ „ QA ์‹œ๊ฐ„

๋ชจ๋“  ๊ฐœ๋ฐœ์ด ๋๋‚˜๊ณ  ์˜ˆ๋งค์˜คํ”ˆ ์‚ผ์ผ ์ „์— ํŒ€์›๋“ค์„ ๋ชจ๋‘ ๋ชจ์•„์„œ ๋‘์‹œ๊ฐ„๋™์•ˆ QAํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. ๋ฑ…ํ‚ค์ฆˆ์—์„  ๋ณ„๊ฐœ์˜ ๋…ธ์…˜ ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ์—” ๊นƒํ—ˆ๋ธŒ์—์„œ ์ด์Šˆ๋ฅผ ํŒŒ์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ทธ๋งŒํผ์˜ ๋ณผ๋ฅจ๋„ ์•„๋‹ˆ๊ณ  QA์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์›์ด ๋‚˜์™€ ๋‹ค๋ฅธ ์นœ๊ตฌ ๋‘๋ช…๋ฐ–์— ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด์Šˆ๋กœ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ์ ๋‹นํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด์—ˆ๋‹ค. ํ•ด๋‹น ์ด์Šˆ ๋งํฌ๋กœ ๊ฐ€์„œ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

QAํ• ๋•Œ๋งˆ๋‹ค ๋Š๋ผ๋Š”๊ฑด๋ฐ, ํ•ญ์ƒ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์ด ๋‚˜์˜จ๋‹ค. ๋ณดํ†ต ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ๋ฌธ์ œ, ๊ธฐ๊ธฐ๋ณ„ ํ™”๋ฉด์— ๋”ฐ๋ฅธ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๋‹ค. ๋˜๋Š” ์–ด๋–ค ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ๋‚˜์˜ค๋Š” ๋˜๋‹ค๋ฅธ ์˜ค๋ฅ˜๋“ค์ธ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋„์ž…ํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ ๋‹ค๋ฅธ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์–ธ์  ๊ฐ€ ๊ผญ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค!

 

 

์„œ๋น„์Šค ์†Œ๊ฐœ ์ด๋ฏธ์ง€

๋ฆฌ๋“œ๋ฏธ์™€ ์†Œ๊ฐœ ์ด๋ฏธ์ง€์— ์ €๋ฒˆ๋ณด๋‹ค ๋” ์—ด์„ ๋ƒˆ๋‹ค. ์ฒ˜์Œ ํ•ด๋ณด๋Š”๊ฑฐ์˜€์ง€๋งŒ ๊ฝค ์žฌ๋ฐŒ๋Š” ์ž‘์—…์ด์—ˆ์Œ. ๋•๋ถ„์ธ์ง€ ์—ํƒ€ ํ•ซ๊ฒŒ ๊ฐ”๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

 

๋‚˜๋ฆ„ ๋น„์ „๊ณต์ž์™€ ์•ผ๋งค๋“ค ์‚ฌ์ด์—์„  ์•ˆ ๊ฟ€๋ฆฐ๋‹ค๊ณ (...) ์ž”๋œฉ ์–ด๊นจ ์˜ฌ๋ผ๊ฐ„ ์ƒํƒœ์˜€๋‹ค๊ฐ€, ๋ฑ…ํ‚ค์ฆˆ์—์„œ ์ฐ ๋””์ž์ด๋„ˆ๋“ค์ด ํ•ด๋†“์€๊ฑฐ ๋ณด๊ณ  ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋Œ์•„์™”๋‹ค. ๋ถ„๋ช…ํžˆ ๋น„์Šทํ•˜๊ฒŒ ํ–ˆ๋Š”๋ฐ ๋Š๊ปด์ง€๋Š” ํ€„๋ฆฌํ‹ฐ๋Š” ํ•˜๋Š˜๊ณผ ๋•… ์ฐจ์ด๋”๋ผ. ๋””ํ…Œ์ผ์˜ ์ฐจ์ด์ธ๊ฐ€ ์‹ถ๋‹ค. ๋””์ž์ธ์ด ์ œ์ผ ์–ด๋ ต๋‹ค.

 

 

ํŒŒ๋น„์ฝ˜๋„ ์ด์˜์ง€. ์ „์ฒด์ ์œผ๋กœ ๋ฐ”๋€ ์ƒ‰์ƒ ์ปจ์…‰์— ๋งž์ถฐ์„œ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค. ์•„์ฃผ ๋ง˜์— ๋“ค์–ด์š”.

 


 

์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ํ‹ฐ์ผ“ ์˜ˆ๋งค ์„œ๋น„์Šค๋Š” ๊ณต์—ฐ ์–‘์ผ ๋ชจ๋‘ ๋ฌธ์ œ์—†์ด ์ž˜ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. 21,22ํ•™๋ฒˆ ํ™œ๋™๊ธฐ์ˆ˜ ์นœ๊ตฌ๋“ค์ด ๊ณ ์ƒ์„ ๋งŽ์ด ํ•ด์ฃผ์—ˆ์Œ. ์ •์‚ฐํ•˜๊ณ  ํ†ต๊ณ„๋‚ด๋Š”๋ฐ ๊ทธ๋ž˜๋„ ํฐ ๋„์›€์ด ๋์„๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋งค ๊ณต์—ฐ๋งˆ๋‹ค ์ง€์†์ ์œผ๋กœ ์ด์–ด์กŒ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žŒ์ด ์žˆ์ง€๋งŒ.. ํ›„์ž„์ž๋ฅผ ๋นจ๋ฆฌ ์ฐพ์•„์•ผ๊ฒ ๋‹ค!!