루빗은 A/B 테스트를 어떻게 하고 있을까? (with. Hackle)

sooyeon
roubit.me
Published in
5 min readMar 24, 2023

안녕하세요! 루빗의 귀염둥이 막내, 수연입니다.

오늘은 루빗에서 어떻게 AB 테스트를 하고 있는지에 대해서 얘기해보려고 합니다.

A/B 테스트의 필요성

  1. 성과 측정
  2. 인사이트 발견
  3. 데이터 기반 조직

배경

저희는 사내에서 매주 하나의 아티클 혹은 팀원들에게 공유하고 싶은 내용들을 공유하고 얘기해보는 독서 모임을 꾸준히 진행 중입니다!

때는 11월 즈음 PO님이 핵클 세미나에 참가해 ‘A/B테스트로 게임 매출 성장시키기' 라는 아티클을 주제로 발표하게 되었습니다 🙌

실험은 반복적이고 끊임 없이 하다보면 새로운 인사이트를 발견하게 되고, 실패하더라도 그 경험을 통해 발견할 수 있다고 합니다.

기존 루빗의 A/B 테스트 실험

A/B 테스트를 할 때 중요한 것은 타겟팅 설정입니다.

기존의 저희 팀은 유저 id를 홀수 혹은 짝수, 또는 remainder 기준으로 타켓팅을 설정하곤 했습니다.

루빗은 왜 핵클을 적용했을까?

  1. 조금 더 유연하게 타겟팅 설정하기

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 되지 않아 생기는 이슈라고 판단하여 핵클에 직접 문의 했습니다.

핵클 측 답변

  1. SDK의 HackleProvider 내에 timeout이 설정되어 있음.
    그러나 네트워크 이슈 등으로 설정 정보를 받아오는데 시간이 오래 걸려 해당 시간보다 늦게 설정 정보를 받아오는 경우에 Provider 내부에서 hook을 사용하여도, SDK_NOT_READY 가 reason으로 리턴되게 되어있음.
    따라서 HackleProvidertimeout 값을 수정해서 해당 시간을 늘리는 방법을 사용하라.
<HackleProvider
hackleClient={hackleClient}
timeout={2000} // timeout을 2초로 설정
>
...
</HackleProvider>

2. 그것과 별개로 무조건 SDK가 준비되는 시점에 SplashScreen.hide()를 실행해야 한다면, 핵클 내에서 제공하는 onReady 함수를 이용하라.

  useEffect(() => {
hackleClient.onReady().finally(() => {
SplashScreen.hide();
});
}, []);

이렇게 문제를 해결할 수 있었습니다 🙌

깨달은 점이 있다면 “서드파티를 항상 의심하고 직접 확인하는 습관이 중요하다” 입니다.

핵클에 직접 문의했을 때 관계자님도 같은 말을 해주셔서 조금은 웃었던 기억이 납니다 ㅎ.ㅎ

유저 평점 4.9 가보자고오 🔥

--

--