GoogleAnalytics

sanghoon Ahn·2021년 6월 11일
0

iOS

목록 보기
6/20

E-Commerce Service를 하고있다 보니, 자연스럽게 유저가 어떤 상품을 좋아 하는지 또는 자주 구매하는지에 대한 궁금증이 생겼고 이를 수치화 해서 보고싶다는 생각이 들었습니다.

그래서 "유저 행동 추적" 이라고 알고 있었던 GA를 활용 해 보려고 합니다. 🤭

그렇다면 GA를 적용하려면 먼저 GA에 대해 알아야 하겠죠 ?

GA는 무엇인가요?

GA는 유저가 진입한 화면, 개발자가 지정한 특정 이벤트를 유저가 수행한 횟수, 해당 이벤트에 대한 정보

전반적인 유저의 행동 정보 수집 및 분석에 사용되는 Library라고 생각하시면 좋을 것 같습니다!

GA를 사용해야 하는 이유가 있나요?

일반적으로 DataBase에 있는 정보를 종합하여 통계를 낼 수도 있지만,

예를들어 화면진입과 같이 너무 빈번하게 일어나는 이벤트를 DB에 저장한다면 사용하는 유저가 많을 수록 부담이 커질것입니다.

또한 이벤트의 추가 및 삭제 등 유지보수에 server side 작업이 필수적으로 들어가야 하기 때문에 빠른 대응이 불가능합니다.

반면 GA는

  1. 이벤트를 간편하게 추가/삭제가 가능합니다.
  2. 많은 양의 정보를 시각적 자료로 나타내 줍니다.
  3. 실시간으로 사용중인 플랫폼과 이벤트에 대한 추적이 가능합니다.

과 같은 장점이 있으며,

E-Commerce 서비스에서의 주된 활용은 다음과 같을 것 같습니다!

  1. 유저가 어떤 상품을 자주 봤는지
  2. 해당 상품에 대한 구매는 얼마나 이루어졌는지
  3. 여러가지 결제 방법(자사 페이서비스 / 일반 카드 결제 등)중에서 어떤 결제 방식이 자주 이루어지는가
  4. 자주 검색되는 상품은 무엇인가

등등... 유저 행동에 이벤트를 삽입하는거니까, 마음만 먹으면 거의 모든 행동을 수집 할 수 있고 이를 활용하는 방법은 무궁무진 하다고 생각합니다.😅

좋아요, 어떻게 쓰는건데요?

https://firebase.google.com/docs/ios/setup?hl=ko

Google 공식 가이드가 있습니다!!

조금 불친절하다고 생각하실수 있는데.. 진짜 조금 검색하면 설치방법은 정말 많이 나와있습니다.. 😭😭

참조해주시면 감사하겠습니다 ... 🥺

그러면 뭘 알려줄거냐면요!!

제가 GA를 프로젝트에 적용했던 방법에 대해 설명드리려고 합니다!!

다음 섹션으로 ... 총총총...

빨리 알려주세요!

먼저 알고 넘어가야 할 것은 이벤트 기록 메소드입니다.

import FirebaseAnalytics

// Obejctive-C
+ (void)logEventWithName:(NSString *)name
              parameters:(nullable NSDictionary<NSString *, id> *)parameters
    NS_SWIFT_NAME(logEvent(_:parameters:));

// Swift
logEvent(_ name: String, parameters: [String : Any]?

메소드의 parameter를 보면~

  • name: The name of the event. Should contain 1 to 40 alphanumeric characters or underscores. The name must start with an alphabetic character. Some event names are reserved. See FIREventNames.h for the list of reserved event names. The "firebase", "google", and "ga_" prefixes are reserved and should not be used. Note that event names are case-sensitive and that logging two events whose names differ only in case will result in two distinct events. To manually log screen view events, use the screen_view event name.
  • parameters: The dictionary of event parameters. Passing nil indicates that the event has no parameters. Parameter names can be up to 40 characters long and must start with an alphabetic character and contain only alphanumeric characters and underscores. Only NSString and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are supported. NSString parameter values can be up to 100 characters long. The "firebase", "google", and "ga_" prefixes are reserved and should not be used for parameter names.

영어 전문은 복잡하니까 간단하게 요약하면

name : 이벤트의 이름이며, 1~40알파벳 혹은 "_"을 허용합니다. 알파벳으로 시작해야 하며, 이미 예약된 몇개의 예약어는 사용할 수 없습니다.

paramters : [String : Any]? 타입의 dictionary이며, nil은 이벤트의 param이 존재하지 않는다는것을 의미합니다. dictionary의 key는 name과 같은 특성을 가지고 있습니다. Value의 경우 Any타입이지만, NSString, NSNumber (String / signed 64-bit integer and 64-bit floating-point number)만 사용이 가능합니다! 또한 NSString의 경우 최대 100글자 까지만 지원합니다.

이벤트의 기록은 logEvent() 메소드를 통해 이루어집니다.

준비는 끝났습니다 !!! 출발하시죠~!

설계

우선 GA의 특성상 유저의 이벤트가 일어나는 모든 곳, 즉 서비스 전체에서 발생 할 수 있습니다.

또한 수많은 이벤트의 종류가 존재하겠죠?

이에따라서 두가지를 생각해냈습니다.

첫번째, SingleTon으로 logEvent만 사용하는 Manager를 만들어서 Manager를 호출해 이벤트를 기록하자.

두번째, 이벤트의 종류가 많을것으로 예상되기 때문에 이벤트는 enum으로 관리하자

먼저 SingleTon을 사용해야겠다고 생각한 이유는 다음과 같습니다.

  1. 이벤트에 대한 정보를 정제하고 기록하는 객체가 필요하다.
  2. 동일한 객체의 생성을 막아 메모리 효율을 높인다.

구현

그렇다면 해당 Manager를 어떻게 구현할 것인가??

Manager에는 이벤트 유형을 구분해야하는 enum이 존재합니다.

import FireBaseAnalytics

struct GAEventManager  {
	let shared = GAEventManager()
	private init { }

	enum EventType {
	case screen(screenName: String)
	case search(keyword: String)
	case viewProduct(product: Product)
	.. etc
	}
}

이벤트 기록에 필요한 정보들은 Associated Values로 전달합니다.

(Associated Values에 대한 자세한 정보는 공식문서를 참조해주세요!!)

viewProduct case 와 같이 서비스에서 사용되는 객체를 전달해도 좋습니다!

이벤트 타입에 대한 정의는 끝났고, 이제 이벤트를 기록하는 함수를 작성해보겠습니다.

이벤트를 기록하려면 이름과 paramter가 필요한데...

이벤트 이름은 다음과 같이 enum에서 생성 해 낼 수 있을 것 같습니다!

enum EventType {
case screen(screenName: String)
case search(keyword: String)
case viewProduct(product: Product)
.. etc

var eventName: String {
	switch self {
	case .screen:
		"screen"
	case .search:
		"search"
	case .viewProduct:
		"viewProduct"
       }
}

paramter 또한 Associated Values로 만들 수 있을 것 같습니다!

/*
struct Product {
	let name: String
	let option: String
	let price: Int
}
*/

enum EventType {
case screen(screenName: String)
case search(keyword: String)
case viewProduct(product: Product)
.. etc

var eventName: String {
	switch self {
	case .screen:
		"screen"
	case .search:
		"search"
	case .viewProduct:
		"viewProduct"
	}
}

var paramters: [String: Any]? {
	switch self {
	case .screen(let screenName):
		["screen": screenName]
	case .search(let keyword):
		["screen": screenName]
	case .viewProduct(let product):
		["productName": product.name, "productOption": product.option, "productPrice": product.price]
	}
}

paramters의 viewProduct케이스의 경우 객체의 property를 풀어서 dictionary로 만들었는데요, 위에서 paramter는 NSString 혹은 NSNumber타입만 가능하다고 했죠 ?!

(NSNumber가 Swift의 Int, Float, Doble까지 지원하는건가..??? 이것도 알아보겠습니다 ㅠ)

그렇기 때문에 객체를 풀어서 dictionary로 만들었습니다.

준비는 다 된것 같네요! 메소드를 작성해볼까요!

import FireBaseAnalytics

class GAEventManager  {
	...
	...
	...

	func logEvent(_ eventType: EventType) {
		Anaytics.logEvnet(evnetType.name, parameters: eventType.parameters)
	}
}	

간단하죠?!ㅋㅋㅋ

이제 서비스에서 해당 메소드를 호출해주면됩니다.

/* SearchViewController.swift */
...
...
var keyword: String?
...
...
// user search action
keyword = "glove"

GAEventManager.shared.logEvent(.search(keyword))

이렇게 Manager 구성은 완료 되었습니다!

실시간 테스트

이제부터가 더욱 중요한것 같은데요,

이벤트가 잘 들어가는지 테스트 해 볼 필요가 있겟죠?

GoogleAnalytics는 DebugView를 통해 실시간으로 이벤트 추적이 가능합니다.


Firebase console의 DebugView


GoogleAnlaytics의 DebugView

지금부터는 DebugView를 사용하기 위한 설정을 해보겠습니다!!

Xcode에서 Target의 Scheme 설정 화면으로 가주세요!

Arguments탭을 보시면

위와같이 Arguments Passwd On Launch 탭에 다음과 같은 변수들을 설정 할 수 있습니다.

각각의 변수는 다음과 같은 의미입니다!!

  • -FIRDebugEnabled : Debug모드 사용, 명시적으로 -FIRDebugDisabled을 실행하기 전까지 Debug 모드로 설정합니다.
  • -FIRDebugDisabled: Debug 모드 미사용
  • -FIRAnalyticsDebugEnabled : Xcode Debug Console에 log 표시 여부

또한, 각각의 변수는 사진과 동일하게 "-" 까지 함께 적어주셔야 합니다!

그리고 에뮬레이터나 테스트 디바이스에 앱이 이미 설치되어있다면 삭제 후 빌드 해주시기 바랍니다!

"-FIRDebugEnabled"를 체크하고, 앱을 실행하고 Debug View를 한번 볼까요?!

실시간으로 이벤트들이 추적되는 것을 볼 수 있습니다!

다음과 같이 이벤트에 전달한 parameter도 잘 나오네요!!

적용하면서 겪었던 문제점이 있나요?

적용하면서 어려웠던 점은 Debug View에 실시간으로 디바이스가 잡히지 않아서 어려움을 겪었었는데요,

GoogleAnalytics 프로젝트 설정을 이리저리 만져서 발생했던 문제였습니다 🥲

처음 시도하시는 분들은 겪지 않으실 것 같은데요,

그래도 비슷한 상황을 겪는 분들이 계실 것 같아서 적어보겠습니다.

저는 실제 서비스 일때만 수집하고, 개발중일때는 수집하지 않도록 하기 위해서

개발중일때는 paramter에 debug_mode를 채워서 보냈습니다.

그리고 필터 상태를 "활성" 상태로 체크해두니

디바이스가 잡히지 않는 문제가 있었습니다. 😱

결국 개발중 일때는 logEvent Method를 막고, 릴리즈에서만 기록하도록 메소드를 수정하였습니다. 😫

개발중일때 GA를 테스트하기위해선 막은 코드를 주석처리하고 테스트 하겠죠 ??

위의 필터를 잘 활용하면 굳이 주석처리한다거나 할 필요가 없을 것 같은데 말이죠 ...

조금 더 알아봐야겠습니다...

마무리하며...

이번 포스팅은 서비스를 운영하면서 필요하게 된 GoogleAnalytics에 대해 직접 경험했던 내용을 적어보았습니다.

검색을 해도 나오는 GoogleAnlalytics의 가이드 문서는 조금 불친절 하더라구요.. ㅠ

번역도 잘 안되어있어서 원문으로 봤다는 ... 🤢

그래도 GoogleAnalytics를 적용할 수 있느냐고 물어본다면 자신있게 적용할 수 있다고 할 수 있을것 같아요! 조금 더 성장한 것 같아서 기분이 좋네요. 🙂

이번 포스팅은 여기서 마치겠습니다 !

틀린부분에 대한 지적은 언제나 환영합니다 !! 🥺

읽어주셔서 감사합니다!! 🙇

profile
hello, iOS

0개의 댓글