Google Analytics 추가하기

개인마다 선택한 Theme에 이미 구글 애널리틱스 삽입 코드가 포함되어 있어 config.toml 파일에 추적코드만 삽입하면 되는 경우가 대부분일 것이다. 이 부분은 선택한 theme 문서를 잘 확인해보고 만약에 없다면 아래와 같은 방법으로 추가해줄 수 있다.


1. Google Analytics 추적 코드 발급

구글 애널리틱스를 추가하기 위해서는 당연히 구글의 애널리틱스에 가입을 먼저 해야 한다. 가입을 하고 나면 계정속성을 등록해야 한다.

계정은 일종의 그룹과 같은 느낌으로 계정하나에 여러 속성(사이트,도메인)를 관리 할 수 있다. 구글 고객센터 에 계정과 속성을 추가하여 추적 코드를 발급 받는 방법이 잘 나와있다.


2. 추적 script 삽입

구글 애널리틱스 페이지에서 관리 > 속성 > 추적 정보 > 추적 코드 경로 따라 들어가면 범용 사이트 태그(gtag.js) 에 js를 그대로 이용해도 무방하나 나는 config.toml에서 추적코드를 관리하여 script를 유동적으로 변경되도록 작성해주고자 아래와 같은 코드를 head에 삽입 해주었다.

<script
  async
  src="https://www.googletagmanager.com/gtag/js?id={{ .Site.Params.googleAnalytics }}"
></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag() {
    dataLayer.push(arguments);
  }
  gtag("js", new Date());

  gtag("config", "{{ .Site.Params.googleAnalytics }}");
</script>

이때 이 스크립트를 삽입해주는 위치는 theme/테마명/layouts/partials/html-head.html 에 직접 추가해주어도 되고 theme 파일은 건드리기 싫다 하면 /layouts/partials/html-head.html 파일을 재정의 하여 추가해도 가능하다.

나는 테마의 html-head.html에 {{- partial “head.html” . -}} 을 추가해준 후, head에 무언가 데이터를 추가해주고자 할때는 /layouts/partials/head.html 파일을 통해 추가해주었다. ( meta(og, twitter), 페이지네이션이나 갤러리 같은 추가 기능(css/js) 에 관한 부분들은 이 파일에 정의하고 theme의 파일은 건드리지 않는 방식으로 개발했다. )


3. 포스팅 중에는 적용 안되게 하기

hugo server 명령어로 local 서버를 켜놓고 포스팅을 하다보면 md파일을 저장할때마다 페이지가 자동 새로고침이 되고 구글 애널리틱스 추적 스크립트가 살아있어 애널리틱스의 데이터를 신뢰하기 어려워 진다. 그렇기 때문에 개발(포스팅)중에는 구글 애널리틱스를 적용이 안되게 코드를 조금만 수정해보자.

<!-- google analytics-->
{{ if and ( ne (printf "%v" $.Site.BaseURL) "http://localhost:1313/" )
(.Site.Params.googleAnalytics) }}
<!-- Global site tag (gtag.js) - Google Analytics -->
<script
  async
  src="https://www.googletagmanager.com/gtag/js?id={{ .Site.Params.googleAnalytics }}"
></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag() {
    dataLayer.push(arguments);
  }
  gtag("js", new Date());

  gtag("config", "{{ .Site.Params.googleAnalytics }}");
</script>
{{ end }}

위와 같이 scipt 전에 if 문으로 localhost인지 확인하고 config.toml에 추적코드 속성이 있다면 삽입되게 코드를 수정하여 해결 할 수 있다.


4. google analytics script 최적화

google analytics 추적 스크립트를 보면 알겠지만 외부 js를 로드하게 되며 이때 로딩되는 js는 약 73kb인데 만일 google analytics의 다양한 기능은 필요없고 단순히 뷰카운트가 목적이라고 하면 Minimal analytics 에서 제공하는 script를 통해 1.5kb 로 최적화를 할 수 있다.

위에서 삽입했던 script 대신에 아래의 script를 삽입 해주면 간단하게 교체가 가능하다.

<!-- google analytics-->
{{ if and ( ne (printf "%v" $.Site.BaseURL) "http://localhost:1313/" )
(.Site.Params.googleAnalytics) }}
<script>
  (function (a, b, c) {
    var d = a.history,
      e = document,
      f = navigator || {},
      g = localStorage,
      h = encodeURIComponent,
      i = d.pushState,
      k = function () {
        return Math.random().toString(36);
      },
      l = function () {
        return g.cid || (g.cid = k()), g.cid;
      },
      m = function (r) {
        var s = [];
        for (var t in r)
          r.hasOwnProperty(t) &&
            void 0 !== r[t] &&
            s.push(h(t) + "=" + h(r[t]));
        return s.join("&");
      },
      n = function (r, s, t, u, v, w, x) {
        var z = "https://www.google-analytics.com/collect",
          A = m({
            v: "1",
            ds: "web",
            aip: c.anonymizeIp ? 1 : void 0,
            tid: b,
            cid: l(),
            t: r || "pageview",
            sd:
              c.colorDepth && screen.colorDepth
                ? screen.colorDepth + "-bits"
                : void 0,
            dr: e.referrer || void 0,
            dt: e.title,
            dl: e.location.origin + e.location.pathname + e.location.search,
            ul: c.language ? (f.language || "").toLowerCase() : void 0,
            de: c.characterSet ? e.characterSet : void 0,
            sr: c.screenSize
              ? (a.screen || {}).width + "x" + (a.screen || {}).height
              : void 0,
            vp:
              c.screenSize && a.visualViewport
                ? (a.visualViewport || {}).width +
                  "x" +
                  (a.visualViewport || {}).height
                : void 0,
            ec: s || void 0,
            ea: t || void 0,
            el: u || void 0,
            ev: v || void 0,
            exd: w || void 0,
            exf: "undefined" != typeof x && !1 == !!x ? 0 : void 0,
          });
        if (f.sendBeacon) f.sendBeacon(z, A);
        else {
          var y = new XMLHttpRequest();
          y.open("POST", z, !0), y.send(A);
        }
      };
    (d.pushState = function (r) {
      return (
        "function" == typeof d.onpushstate && d.onpushstate({ state: r }),
        setTimeout(n, c.delay || 10),
        i.apply(d, arguments)
      );
    }),
      n(),
      (a.ma = {
        trackEvent: function o(r, s, t, u) {
          return n("event", r, s, t, u);
        },
        trackException: function q(r, s) {
          return n("exception", null, null, null, null, r, s);
        },
      });
  })(window, "{{ .Site.Params.googleAnalytics }}", {
    anonymizeIp: true,
    colorDepth: true,
    characterSet: true,
    screenSize: true,
    language: true,
  });
</script>
{{ end }}

Related Posts

Go in Action

Go in Action

  • Books
  • 2022년 3월 29일

저는 개인적으로 GoLang을 접한지는 꽤 되었습니다. 제가 Go를 학습할때는 인터넷을 통해 충분히 학습할 수 있었는 데, 키워드들이 많지 않았고 http://golang.site 에 대부분 필요한 내용은 설명되어있어 무리없이 학습할 수 있었습니다. 그런데 책을 구매하게 된 이유는 요즘 읽을 책이 마땅치 않았기도 하고, Go 책을 개인적으로 소장하고 싶어 구매해본 책입니다. 책이 나온...

Read More
Red Black Tree

Red Black Tree

BST (이진 탐색 트리)를 기반으로 둔 Tree. Tree의 Rebalancing 방법 중 하나로 balanced한 트리이다. 각 노드는 값(key)말고도 색을 갖고 있으며, 색은 레드 or 블랙 2종류이다. 1. Red Black Tree가 갖는 특성 Root Property : 루트(root)노드는 블랙(black)이다. External Property : 모든 외부 노드 (external node)는 블랙이다. Depth Property : 모든 단말 노드(leaf n...

Read More
함수형 인터페이스와 람다식

함수형 인터페이스와 람다식

  • Java
  • 2021년 3월 1일

1. 소개 함수형 인터페이스란 추상 메소드가 하나만 선언된 인터페이스이다. 1) 함수형 VS. 객체지향 Java 개발자에게 익숙한 객체지향 프로그래밍과의 차이를 비교하자면, 값을 취급하는 단위가 어디까지 인지 나눌 수 있다. Java 는 값(상태)과 행위를 다루기 위한 기본 단위를 객체로 정의하고, 이 객체를 클래스라는 형태로 구현한다. 함수형 프로그래밍은 행위(로...

Read More