안녕하세요! 루빗의 귀염둥이 막내, 수연입니다.
오늘은 루빗에서 어떻게 AB 테스트를 하고 있는지에 대해서 얘기해보려고 합니다.
A/B 테스트의 필요성
- 성과 측정
- 인사이트 발견
- 데이터 기반 조직
배경
저희는 사내에서 매주 하나의 아티클 혹은 팀원들에게 공유하고 싶은 내용들을 공유하고 얘기해보는 독서 모임을 꾸준히 진행 중입니다!
때는 11월 즈음 PO님이 핵클 세미나에 참가해 ‘A/B테스트로 게임 매출 성장시키기' 라는 아티클을 주제로 발표하게 되었습니다 🙌
실험은 반복적이고 끊임 없이 하다보면 새로운 인사이트를 발견하게 되고, 실패하더라도 그 경험을 통해 발견할 수 있다고 합니다.
기존 루빗의 A/B 테스트 실험
A/B 테스트를 할 때 중요한 것은 타겟팅 설정입니다.
기존의 저희 팀은 유저 id를 홀수 혹은 짝수, 또는 remainder 기준으로 타켓팅을 설정하곤 했습니다.
루빗은 왜 핵클을 적용했을까?
- 조금 더 유연하게 타겟팅 설정하기
ex )
- 유저의 가입일
- 유저의 가입 시점의 버전
- 글로벌 유저 / 국내 유저
2. 2가지 실험을 동시에 할 수 있는 상호 배타적 설정하기
상호 배타적 설정이란?
일반적으로 여러개의 테스트가 동시에 진행되더라도, 각 테스트는 독립적으로 분배됩니다. 예를 들어 두 개의 테스트, 테스트1과 테스트2가 동시에 진행되는 경우 (테스트1 : A, 테스트2 : A), (테스트1 : A, 테스트2 : B) 등과 같이 개별 실험의 분배가 다른 실험에 공평하게 분배되기 때문에 문제가 없습니다.
동시에 여러 개의 실험이 가능하다는 장점이 있습니다.
3. 적극적인 장애 방지
- 장애 발생시 해당 기능을 스위치로 즉시 해결 할 수 있다.
A/B 테스트는
- 지속적으로 지표를 개선해나가는 실험
- 개선되는 점들이 누적되는 것
이러한 요소의 테스트들은 리텐션을 끌어 올리고 장기적으로 매출을 성장시키는 요소가 됩니다.
4. 트래픽 할당하기
팀 목표에 걸맞게 전체 유저의 10% 등등 원하는 트래픽을 할당할 수 있습니다.
이렇게 타켓팅 설정이 유연하지 못했던 기존과 다르게 현재는 조금 더 팀 목표에 맞도록 퍼널을 개선해나가는 중입니다 👏
우리들의 마음 가짐
최소한의 개발 공수로 최대한의 효율을 내는 것
그렇다면 이번에 겪었던 핵클 이슈에 대해서 소개해보려고 합니다!
때는 저번주,, 조금 큰 이슈가 발생했는데요.
앱 화면 첫 진입 시 무한로딩 되는 이슈였습니다.
문제의 발단
앱을 동작 후 첫 화면 A/B 테스트를 진행하게 되었습니다.
실험명 : NEW 온보딩 [첫 페이지] (4분할)
첫 화면에 진입하자마자 유저에게 보여질 화면이 총 4개로 나눠졌습니다.
하지만 핵클 내에서는 아주 간발의 차로 A/B 테스트 값을 할당받기까지 조금은 시간 차가 생기는 것을 확인했습니다.
예를 들어 해당 유저가 그룹 B임에도 값을 할당 받기까지 조금은 시간 차가 생겨 그룹 A로 보였다가 그룹 B 화면으로 보이게 되었습니다.
이를 해결하기 위해 생각한 로직은 이렇게 구성되었습니다.
SDK가 할당되기 전까지 로딩 화면이 보였다가 할당되는 시점에 A/B 테스트가 동작되도록 하는 것
useEffect(() => {
if (result.reason !== 'SDK_NOT_READY') {
SplashScreen.hide();
}
}, [result.reason]);
코드 의심하기
result.reason 값이 변하지 않아, splashscreen이 hide 되지 않아 생기는 이슈라고 판단하여 핵클에 직접 문의 했습니다.
핵클 측 답변
- SDK의 HackleProvider 내에 timeout이 설정되어 있음.
그러나 네트워크 이슈 등으로 설정 정보를 받아오는데 시간이 오래 걸려 해당 시간보다 늦게 설정 정보를 받아오는 경우에 Provider 내부에서 hook을 사용하여도,SDK_NOT_READY
가 reason으로 리턴되게 되어있음.
따라서HackleProvider
의timeout
값을 수정해서 해당 시간을 늘리는 방법을 사용하라.
<HackleProvider
hackleClient={hackleClient}
timeout={2000} // timeout을 2초로 설정
>
...
</HackleProvider>
2. 그것과 별개로 무조건 SDK가 준비되는 시점에 SplashScreen.hide()
를 실행해야 한다면, 핵클 내에서 제공하는 onReady 함수를 이용하라.
useEffect(() => {
hackleClient.onReady().finally(() => {
SplashScreen.hide();
});
}, []);
이렇게 문제를 해결할 수 있었습니다 🙌
깨달은 점이 있다면 “서드파티를 항상 의심하고 직접 확인하는 습관이 중요하다” 입니다.
핵클에 직접 문의했을 때 관계자님도 같은 말을 해주셔서 조금은 웃었던 기억이 납니다 ㅎ.ㅎ
유저 평점 4.9 가보자고오 🔥