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

변수

변수

1. 변수 선언 1) 기본 방법 var키워드로 변수를 선언하고 변수명 다음 데이터 타입을 명시해주어야 하고, 선언만 하고 초기화를 해주지 않으면 go는 Zero value를 할당한다. Note Zero Value 숫자 = 0 bool = false string = &quot;&quot; 2) 타입 추론 위 처럼 변수 뒤의 타입형태를 제외한 형식의 타입추론도 가능하다....

Read More
Clean Code

Clean Code

  • Books
  • 2021년 1월 22일

1장. 깨끗한 코드 코드 품질을 측정하는 유일한 척도 = 분당 내지르는 &lsquo;WTF!&rsquo; 횟수 코드는 요구사항을 상세히 표현하는 수단 ( 기계가 실행할 정도로 상세하게 요구사항을 명시하는 작업 = 프로그래밍 ) 작성자가 아닌 사람도 읽고 고치기 쉽고 단순하고 직접적이다 중복을 피하고 한 기능만 수행하게 작제 추상화하기 프로그래밍은 코드를 읽는 시간 대 짜는 시간 비율이 9:1 잘 짠 코드도 시간이 지나면 레거시가 되니 조금씩 코드를 정리/개선하자 2장. 의미있는 이름 클래스/메서드 이름 클래스 : 명사, 명사구가 적합 메서드 : 동사, 동사구가 적합 의도를 명확하게 밝히자 ( 코드의 맥락이 코드자체에 명시적으로 드러내자) 잘못된 정보를 피하자 약어를 함부로 사용하지말자 0/O, l/1등과 같이 서로 헷갈리게 하는 변수명을 짓지말자 의미있게 구분하자 단순히 컴파일러나 인터프리터를 통과할 목적의 네이밍하지 말자 a1,a2와 같이 연속된 숫자나, 불용어를 지양하자 ex getAccount(),getAccounts(), getAccountInfo() 와 같은 메서드가 있다면 새로운 프로젝트 참가자는 메서드를 구분하기 힘들다 발음하기 쉬운 이름을 사용하자 검색하기 쉬운 이름을 사용하자 간단한 메서드에서 로컬 변수는 한 문자를 사용하더라도 상수나 대부분의 변수는 긴 이름이름이 검색하기에도 더 편하다 요즘 좋은 IDE들은 몇자 타이핑 안해도 자동 추천해주니 검색성능 면에서는 긴이름이 더 좋다 인코딩을 피하자 마찬가지로 요즘 IDE들은 코드를 컴파일하지 않고도 타입 오류를 감지할 정도로 똑똑하기 때문에 헝가리안 표기법을 지양 하자 한 개념에 한 단어를 사용하자 fetch/get/retrieve 나 controller/manager/driver와 같이 비슷한 의미의 단어를 혼용해서 사용하는 것을 지양하자 add/insert/append 와 같이 추가하는 메서드라고 하더라고 맥락이 다르면 다른 단어를 사용하자 ( 의도 를 명확하게 밝히는 것이 중요! ) 3장. 함수 가능한 한 작고 한가지 기능만 수행하도록 작성하자....

Read More
상수

상수

상수는 Immutable(불변)한 특징을 갖으며 한 번 할당된 값을 변경할 수 없는 변수이다. 상수 키워드는 const로 선언방식은 변수 var와 같고 short assginment statement는 var키워드 전용이기 때문에 상수는 짧은 대입문 사용이 불가능 하다. 또한, 반드시 컴파일 타임에 실행이 가능한 표현식이어야만 한다....

Read More