Blog of Hyeonseok

이벤트 추적 코드 쉽게 넣기

서비스를 새롭게 개편하거나 런칭하면 사용자의 클릭 행태를 분석하기 위해서 이벤트 추적(event tracking) 코드를 넣는다. 사용자가 웹페이지에서 어떤 액션을 취했을 때, 이를 모두 저장해서 웹사이트의 어느 부분이 사용자에게 인기가 좋고 유용하며 어느 부분이 그렇지 않은지를 분석하는 기초 자료를 쌓는 것이다. 가장 쉽게 접할 수있는 이벤트 추적 기능은 아마도 구글 애널리틱스의 이벤트 트래킹 기능 일 것 같고 이런 류의 사용자 분석 도구에는 아마도 대부분 이 기능이 있을 것이다.

처음 이 이벤트 추적 기능이라는 것을 접했을 때에는 웹사이트의 '특정 부분'에 이벤트 추적 코드를 넣고 사용자들의 행동을 분석 한 후에 뭔가 개선점을 도출하는 것으로 생각했었다. 그런데 실제로 코드를 넣는 과정을 보니 기획쪽에서는 '특정 부분'이 아니라 웹페이지에서 상호작용이 일어나는 '모든 부분'에 이벤트 추적 코드를 넣기를 원했다. 모든 링크, 서식, 자바스크립트로 삽입되는 부분들까지 모든 곳에 이벤트 추적 코드를 넣는 작업은 만만하지는 않은 노가다 작업이다. 수백개의 이벤트 추적 코드를 따옴표와 이스케이프된 따옴표, HTML 태그의 늪에 넣고나면 너무 긴장하고 집중한 나머지 온몸이 뻐근해진다.

이렇게 넣어진 이벤트 추적 코드가 개선점을 도출하는데 잘 활용이 된다면 좋겠지만 실제로 보니 이벤트가 많이 발생하거나 적게 발생하는 부분을 제외한 그저 그런 클릭을 보여주는 중간 항목들은 이벤트 추적 코드 넣은 노력이 무색하게 잊혀지게 된다. 정말 모든 상호작용을 분석하는 초기화면 정도가 아닌 다음에야 이벤트 추적 코드 넣는 작업이 노가다에 비해 생산성이 너무 떨어지는 작업으로 느껴졌다. 코드를 선별적으로 넣는 것이 아니라 전체에 동일한 기준으로 넣는 것이라면 동적으로 넣었을 때와 수동으로 넣었을 때가 얼마나 차이가 날지 궁금했다.

이벤트 추적 코드를 넣을 때 중요한 부분은 수많은 이벤트들을 구분할 수 있게 이벤트마다 고유한 코드를 넣어주는 것이다. 그래서 기획자는 이 코드를 정해진 위계에 의해서 엑셀 시트에 만들어 넣고 개발자는 이 코드를 일일이 링크마다 변경해서 넣는 노가다를 하는 것이다. 이벤트가 발생한 위치를 구별하는 것이 주된 목적이기 때문에 HTML의 구조에서 이벤트가 발생한 위치를 뽑아낼 수 있으면 노가다를 할 필요가 없다.

<script type="text/javascript">
//<![CDATA[
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-******-*']);
_gaq.push(['_trackPageview']);
_gaq.push(['_trackPageLoadTime']);

(function () {
	var as = document.getElementsByTagName('a');
	for (var i = 0, cnt = as.length; i < cnt; i++) {
		addEvent(as.item(i), 'click', function () {
			var category = getStructure(this).join('-');
			var action = (
				this.href.indexOf('.pdf') > -1
				|| this.href.indexOf('.mov') > -1
				|| this.href.indexOf('.avi') > -1
				|| this.href.indexOf('.m4v') > -1
				|| this.href.indexOf('.wmv') > -1
				|| this.href.indexOf('.mp3') > -1
				|| this.href.indexOf('.rar') > -1
				|| this.href.indexOf('.zip') > -1
			) ? 'download' : (
				this.href.indexOf('.html') > -1
				|| this.href.indexOf('.txt') > -1
				|| this.href.indexOf('.js') > -1
			) ? 'example' : 'link';
			var label = this.innerHTML;
			_gaq.push(['_trackEvent', category, action, label]);
		});
	}
	function getStructure(el) {
		var structure = [];
		if (el.parentNode && el.parentNode.tagName.toLowerCase() != 'body') {
			structure = getStructure(el.parentNode);
		}
		if (el.id) {
			structure.push(el.id);
		} else if (el.className) {
			structure.push(el.className);
		}
		return structure;
	}
	function addEvent(obj, type, fn) {
		if (obj.addEventListener) {
			obj.addEventListener(type, fn, false);
		} else if (obj.attachEvent) {
			obj["e" + type + fn] = fn;
			obj[type + fn] = function() {
				obj["e" + type + fn](window.event);
			}
			obj.attachEvent("on" + type, obj[type + fn]);
		}
	}
})();

(function() {
	var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
	ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
	var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
//]]>
</script>

링크의 부모요소를 재귀적으로 루트요소까지 탐색하면서 아이디(id) 값과 클래스(class) 값을 가져오고 이를 사용하면 특정 이벤트가 발생한 위치를 HTML 구조상에서 동적으로 만들어 낼 수 있다. 물론 HTML 구조가 잘 되어 있고 아이디와 클래스 값이 적절한 의미를 담고 있을 때에만 사용할 수 있기는 하지만, 요즘 이렇게 만들지 않는 사이트는 없다고 본다(진짜?).

동적으로 생성된 이벤트 추적 코드 이렇게 동적으로 생성된 이벤트 코드값은 실제로 기획자가 고생해서 만든값과 비교해 볼때 별로 문제가 없어 보인다. HTML 구조의 깊이가 너무 깊어질 경우에 이벤트 코드가 길어서 좀 보기 좋지 않은 경우를 빼고는 별 문제가 없다. 그리고 한글이 아니라는 점 정도? 이벤트 코드가 기본적으로 HTML 구조를 가지고 있기 때문에 특정 영역의 코드들을 검색한다든가 모아서 보는 데에도 탁월했다. 예를 들어서 'body-aside'를 검색하면 사이드바에서 발생한 모든 이벤트를 검색할 수 있다.

HTML을 모르는 기획자 입장에서는 좀 헷갈릴 수도 있겠다. 그래도 보기 편하라고 필터링 만드는 작업이 HTML과 JS 코드 뒤지면서 따옴표와 씨름하는 것 보다는 훨씬 수월할 것 같다.

November 09, 2011 | Comments (3) | TrackBacks (0)

오픈뱅킹 봇물, 진짜 오픈 뱅킹

우리은행이 오픈뱅킹 서비스를 시작하고나서 각 은행들도 너도나도 오픈뱅킹 서비스를 시작했다. 국민은행, 기업은행, 외환은행, 하나은행, 농협 등 웬만한 은행들은 다들 오픈뱅킹이라는 이름으로 맥과 리눅스에서도 인터넷 뱅킹을 할 수 있는 서비스를 제공하고 있다. 몇 년 동안 소송도 불사할 때는 가만히 있더니, 업계에서 한 기업이 서비스를 시작하면 나머지도 다 따라한다는 '도미노 효과'를 정말 실감할 수 있는 현상이다.

일단 사용자의 다양성을 인정하고 충족시켜준다는 데에는 더할나위없이 좋은 현상이다. 처음에는 소수 이용자를 위하는 서비스처럼 시작했지만 뚜껑을 열어보니 모든 이용자들에게 유용한 서비스가 됐다는 결과도 의미심장하다.

이제 3개월째. 반응은 기대 이상이다. “처음엔 이용자를 5천명 정도로 추산했어요. 그런데 지금까지 이용자만 7만명이 넘었습니다. 우리도 깜짝 놀랐어요. 우리는 맥이나 리눅스, 파이어폭스나 구글 크롬, 오페라 같은 비 윈도우·IE 이용자를 대상으로 생각했어요. 막상 열어보니 IE 이용자들도 오픈뱅킹을 즐겨쓰는 걸 알게 됐습니다. 지금 인터넷뱅킹보다 속도도 빠르고 더 편리하니까요.”

하지만 첫 테이프를 잘 못 끊어서인지 우려하는 목소리들도 있다. 서비스 플랫폼은 확장했지만 아직도 플러그인에 의존적으로 서비스를 하고 있기 때문에 오픈뱅킹이라고 이름은 붙어 있지만 진짜 오픈 뱅킹은 아니라는 이야기들이 많다. 또한 새롭게 나오는 플랫폼은 지원을 못하고 있다. 플로그인에 의존 하는 한 이런 현상은 앞으로 계속 더 심화될 것으로 생각된다.

고객님, 죄송합니다. 고객님의 브라우저는 KB오픈뱅킹을 이용하실 수 없습니다. 특히, IE6의 경우 웹표준을 준수하지 않아 호환성에 문제가 있고 보안 취약점이 많은 것으로 알려져 있습니다. 아래의 지원브라우저 목록을 참고하시어 해당 브라우저 설치 후 재 접속하시거나 www.kbstar.com을 이용하시기 바랍니다. 실제로 우리은행이나 국민은행의 경우, 파이어폭스가 빠르게 버전업을 하는 것을 따라가지 못해서 파이어폭스 6에서 뱅킹을 지원하는데 한참이 걸렸고 이를 해결하자마자 또 파이어폭스 7이 나와서 현실적으로 서비스가 거의 제대로 되고 있지 않고 있다. 나도 보통때는 파이어폭스 7을 사용하지만 인터넷 뱅킹을 할 때에는 파이어폭스 3.6.23을 사용하고 있다. IE8 사용 자제를 외치던 액티브엑스로 발라진 사이트를 상기시켜서 씁쓸하다.

우리 규정을 지키려면 브라우저의 기능만으로는 불가능하기 때문에 충돌이 있는 것 같다. 하지만 관련해서 표준화 소식도 들려서 다행이다. 아직은 어떻게 될지 알 수 없지만 조금씩 나이지고 있다는데 기대를 걸어본다. 플러그인 업체도 새로운 플랫폼 지원을 위해서 좀 더 빠르게 대응해줬으면 좋겠다.

November 06, 2011 | Comments (1) | TrackBacks (0)

나꼼수 서울 광장

오마이뉴스: "오늘 선물 드리겠다...서울광장은 시민의 것"

박원순 시장 당선을 듣고 즐거워하는 정봉주 주진우 김어준 좋댄다. 화장실 갔다오는 김용민 꼬깔콘 ㅋㅋ

계속 화이팅!

October 30, 2011 | Comments (3) | TrackBacks (0)

최근글 이전글

About me

신현석 안녕하세요, 신현석입니다. 웹표준, 웹접근성에 관심이 많습니다. 궁금하신 점은 언제든지 메일 주세요.