Github Repository 방문수를 트래킹 하는 방법

Allan Bae
6 min readSep 21, 2019

--

Photo by Brina Blum on Unsplash

해당 글인 이전에 썻던 블로그를 Medium으로 마이그레이션 한것이다.

개요

Github에서 개인 프로젝트를 작업후에 README에 방문수 트래킹 하기위해서 badge 로 표현하는 것을 이용할려고 했었다.
그중 가장 인기가 많아 보이는것은hits 라는 오픈소스 프로젝트 였는데, 내가 사용하기에는 몇가지 부족한점이 있었다.

  1. https 지원 안한다. 보안 이슈로 업계 전반으로 https 를 기본 으로 하는 추세인지라, 마음적으로 거슬리는 부분이 컸다.
  2. github 프로젝트만 badge 를 지원 한다. github 프로젝트 외에도 개인 블로그나 사이트에서도 이용하고 싶은 부분이 컸다.
  3. 페이지수 카운팅 할때, 최대한 개인정보를 저장하고 싶지 않다. 유저를 식별할수 있다고 판단될수 있는 정보를 남기고 싶지 않았다.(ip .. 등)
  4. 날짜별 페이지 방문수를 알고 싶다. 보통 전체 누적으로만 알수 있는데, 날짜별 페이지 방문수를 간략하게 확인해 볼수 있을 정도는 있었으면 좋겠다고 생각했다.
  5. badge 달때 좀더 다양한 옵션이 있었으면 한다. 그냥 페이지 카운터를 계산하지 않고, 노출만 시키는 badge 라던가, badge 타이틀을 바꾸는 등 기능이 있었으면 좋겠다.

결국은 만들어 쓰자고 생각하여 개발을 시작하기로 했었고, 그 후기를 남겨본다. https://hits.seeyoufarm.com

준비 작업

1. 도메인 준비

일단 먼저 개발 보다 어떤 도메인을 쓸까 부터 고민했었다.(김치국부터 마시는…)
어차피 계속 운영 할테니 돈주고 살까 생각도 했었지만, 문뜩 부모님 과수원 홈페이지 만들려고 구매한 도메인인이 생각났었다. ( seeyoufarm.com)
서브도메인으로 이용하기로 했고 https://hits.seeyoufarm.com 으로 하기로 결정을 했었다.

2. 플랫폼 선택

당시 구글 클라우드 개발자행사에서 Cloud Run 을 소개 되었는데 컨셉이 마음에 들어서 사용해야지 생각했으나 1가지 문제가 있었다.

구글클라우드 내 SASS 서비스(Cloud SQL, Redis ..등)을 이용할수 없습니다.

물론 Cloud Run 을 인프라를 Kubernetes로 하면 가능하다는 이야기가 있었지만, 배보다 배꼽이 큰 사항(비용!!!!)이라 당연히 그냥 패스하고, 그냥 Flexible AppEngine 쓰기로 결정했다.

3. 데이터 저장소 선택

성능적인 장점이랑 여러 고려했을테 Redis 가 가장 무난했고, 그걸 이용하기로 했다.

4. 언어 선택

머 딱히 선택할꺼 없이 무조건 Golang 이였다.

개발

일단 echo 프레임워크로 기반을 HTTP 서버 기반을 만들었다. 그리고 급 개발 욕심에 몇가지 기능을 더 만들게 되었는데…

1. 뱃지 생성

링크 생성하기

누구나 편하게 넣기 쉽게 하기 위해서, html link 또는 markdown 을 복사해서 가져 갈수 있게 기능을 넣었다. 그냥 URL EDIT 폼에서 URL 변경하면 복사해서 가져 갈수 있게 작업을 했었다.

2. 랭킹

상위 10위 랭킹

일단 목적 자체가 Github 프로젝트에 이용할 목적으로 제작을 했었다.
(물론 github repository 아니어도 사용 가능하다.)

그래서 해당 서비스를 사용하는 Github Repository중 페이지 방문수 상위 10위 까지 프로젝트를 보여주는게 좋다고 생각했다.

그래서 Redis 데이터 구조를 해당 검색이 가능하도록 Index 를 만드는 작업을 비동기로 생성하도록 구현을 해두었다.

3. 히스토리

날짜별 방문수 확인

간략히 날짜별 페이지수를 보고 싶었기에, URL만 수정하면 날짜별 방문율이 보여질수 있게 작업을 했었다.

4. 스트림

실시간으로 트래킹 확인

실시간으로 페이지 카운팅 되는것을 스트림 형태로 보여주는 기능이다.
내부적으로 이용해서 실시간으로 보여주는 방식이고, WASM 이용해서 작업을 했다.
WASM 자세한 설명은 여기에 있고, 관련히 설명 하면 C,C++,Go,Rust 같은 언어를 이용해서 컴파일해서 웹에서 이용할수 있는 기법이라고 생각하면 된다.(javascript 코드 짜는 대신에)

WASM 이용시 장점은

  • 내가 원하는 언어로 javascript 일부 대체할수 있다.
    (javascript 완전 대체할 목적으로 만들어진 프로젝트는 아니고, 상호 보완 형태로 이용한다.)
  • 의도치 않게 코드 난독화가 된다.
    (컴파일 되니깐… 물론 풀어서 보는 방법이 없는건 아니다.)
  • 성능적인 장점이 있다

그래서 익숙한 언어(Go)로 개발을 했으나, Go로 이용했을때 1가지 단점이 있었다.

Go로 만들때 바이너리 사이즈가 MB 단위를 훌쩍 넣어간다.
머 별거 들어간것도 없는데, 사이즈 너무 커서 별로 였다.

물론 방법이 없는건 아니다. TinyGo를 쓰면 획기적으로 줄어들수 있긴하지만, 네트워크 관련 기본 라이러리를 서포트하지 않는다.
(사실 이때 WASM 사이즈 벤치마킹 한 결과 찾아보면서 Rust 좋군아 하는 생각도 했었다.)

배포

편하게 배포하기 위해서는, Github에 master 브랜치에 푸쉬될때 테스트 통과후 자동 배포가 되길 원했다.

별도의 외부 CI/CD 툴을 이용하기 보다는, 그냥 Google Cloud 내에서 지원하는걸 써야겠다는 생각에Cloud Build 이용 했었다.

그러나 Public 하게 공개된 프로젝트에 Cloud Build 설정을 넣기에는 조금 민감한 데이터들이 있었다. 이런것들은 Google Cloud 에서 제공하는 서비스를 이용하여 암호화후 이용하는하는걸로 작업을 했었다.

결론

혼자 사용할 목적으로 만들었으나, 점점 사용자가 늘어서 푸듯함을 느끼고 있다.
(달 마다 invoice 가 날라오는 압박이 있지만…)

필요로 하시는 분들이 편하게 사용하시면 좋을꺼 같다.

https://hits.seeyoufarm.com

코드는 여기서 확인 가능하다.
https://github.com/gjbae1212/hit-counter

--

--