E-Commerce Service를 하고있다 보니, 자연스럽게 유저가 어떤 상품을 좋아 하는지 또는 자주 구매하는지에 대한 궁금증이 생겼고 이를 수치화 해서 보고싶다는 생각이 들었습니다.
그래서 "유저 행동 추적" 이라고 알고 있었던 GA를 활용 해 보려고 합니다. 🤭
그렇다면 GA를 적용하려면 먼저 GA에 대해 알아야 하겠죠 ?
GA는 유저가 진입한 화면, 개발자가 지정한 특정 이벤트를 유저가 수행한 횟수, 해당 이벤트에 대한 정보 등
전반적인 유저의 행동 정보 수집 및 분석에 사용되는 Library라고 생각하시면 좋을 것 같습니다!
일반적으로 DataBase에 있는 정보를 종합하여 통계를 낼 수도 있지만,
예를들어 화면진입과 같이 너무 빈번하게 일어나는 이벤트를 DB에 저장한다면 사용하는 유저가 많을 수록 부담이 커질것입니다.
또한 이벤트의 추가 및 삭제 등 유지보수에 server side 작업이 필수적으로 들어가야 하기 때문에 빠른 대응이 불가능합니다.
반면 GA는
과 같은 장점이 있으며,
E-Commerce 서비스에서의 주된 활용은 다음과 같을 것 같습니다!
등등... 유저 행동에 이벤트를 삽입하는거니까, 마음만 먹으면 거의 모든 행동을 수집 할 수 있고 이를 활용하는 방법은 무궁무진 하다고 생각합니다.😅
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를 보면~
screen_view
event name.영어 전문은 복잡하니까 간단하게 요약하면
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을 사용해야겠다고 생각한 이유는 다음과 같습니다.
그렇다면 해당 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 View를 한번 볼까요?!
실시간으로 이벤트들이 추적되는 것을 볼 수 있습니다!
다음과 같이 이벤트에 전달한 parameter도 잘 나오네요!!
적용하면서 어려웠던 점은 Debug View에 실시간으로 디바이스가 잡히지 않아서 어려움을 겪었었는데요,
GoogleAnalytics 프로젝트 설정을 이리저리 만져서 발생했던 문제였습니다 🥲
처음 시도하시는 분들은 겪지 않으실 것 같은데요,
그래도 비슷한 상황을 겪는 분들이 계실 것 같아서 적어보겠습니다.
저는 실제 서비스 일때만 수집하고, 개발중일때는 수집하지 않도록 하기 위해서
개발중일때는 paramter에 debug_mode를 채워서 보냈습니다.
그리고 필터 상태를 "활성" 상태로 체크해두니
디바이스가 잡히지 않는 문제가 있었습니다. 😱
결국 개발중 일때는 logEvent Method를 막고, 릴리즈에서만 기록하도록 메소드를 수정하였습니다. 😫
개발중일때 GA를 테스트하기위해선 막은 코드를 주석처리하고 테스트 하겠죠 ??
위의 필터를 잘 활용하면 굳이 주석처리한다거나 할 필요가 없을 것 같은데 말이죠 ...
조금 더 알아봐야겠습니다...
이번 포스팅은 서비스를 운영하면서 필요하게 된 GoogleAnalytics에 대해 직접 경험했던 내용을 적어보았습니다.
검색을 해도 나오는 GoogleAnlalytics의 가이드 문서는 조금 불친절 하더라구요.. ㅠ
번역도 잘 안되어있어서 원문으로 봤다는 ... 🤢
그래도 GoogleAnalytics를 적용할 수 있느냐고 물어본다면 자신있게 적용할 수 있다고 할 수 있을것 같아요! 조금 더 성장한 것 같아서 기분이 좋네요. 🙂
이번 포스팅은 여기서 마치겠습니다 !
틀린부분에 대한 지적은 언제나 환영합니다 !! 🥺
읽어주셔서 감사합니다!! 🙇