본문 바로가기

스프링/외부 서비스

Spring으로 ABTest 진행하기 (2/2) - Hackle 사용하기

반응형

목차

  1. 핵클(Hackle)이란?
  2. 핵클로 무엇을 할 수 있나?
  3. 핵클에서 제공되는 SDK
  4. 핵클 SDK로 할 수 있는 것
  5. 핵클 SDK 적용
  6. 핵클 SDK 진행하기 - 자바
  7. 핵클 ABTest 진행하기
  8. 핵클 기능 플래그 진행하기

저번 글에서 ABTest가 무엇이고 대표적인 도구들을 알아봤습니다.

이번 글에서는 도구들 중 하나인 Hackle을 이용해 Spring 서버 환경에서 ABTest를 진행해 보겠습니다.

 

코드는 깃허브에서 확인 가능합니다.

 

GitHub - keepseung/Spring-Blog-Source: 스프링 부트를 사용해 어플리케이션을 만들때 필요한 기능들을 담

스프링 부트를 사용해 어플리케이션을 만들때 필요한 기능들을 담고 있습니다. . Contribute to keepseung/Spring-Blog-Source development by creating an account on GitHub.

github.com

핵클(Hackle)이란?

ABTest, 기능 플래그 등 여러 기능을 제공하는 서비스입니다.

핵클로 무엇을 할 수 있나?

  • 핵심 기능
    • ABTest
    • 기능 플래그
    • 데이터 분석 (리텐션, 퍼널)
  • 보조 기능
    • 이벤트 관리
    • 사용자 그룹 관리

핵클에서 제공되는 SDK

  1. 핵클에서는 제공되는 다양한 기능을 손쉽게 사용
  2. 다양한 플랫폼용 SDK를 제공
  3. 클라이언트와 서버 모두 ABTest를 진행
  4. 핵클에서 제공되는 SDK
    1. 클라이언트 측 SDK (안드로이드, iOS, 자바스크립트, 리액트, 리액트 네이티브, 유니티)
    2. 서버 측 SDK (자바, 코틀린, 파이썬, Node.js, PHP, Proxy, Ruby)

핵클 SDK로 할 수 있는 것

  • 테스트 그룹을 분배
    • 가설을 실험을 하려면 여러 버전이 필요. 고객의 트래픽을 분배 가능
  • 기능 플래그
    • 특정 기능을 개발 및 배포하는 한 뒤에 출시(진열)를 별도로 설정만으로 처리 가능
  • 사용자 이벤트 전송
    • 고객의 행동을 이벤트로 핵클로 전송, 이를 계산과 퍼널 분석에 사용
  • 타게팅
    • 실험에 참여시킬 고객을 특정(타게팅), ABTest에 참여 또는 기능만 노출 가능
  • 데이터 세부 분석
    • 특정 분석을 위해 고객의 속성, 정보를 별도로 정의, 이를 분석

핵클 SDK 진행하기 - 자바

SDK 연동하는 방법은 핵클 사이트에 자세히 나와있습니다.

먼저 다음 순서로 ABTest를 위한 준비를 합니다.

1. 핵클 가입 

2. 무료 플랜 사용

3. SDK 연동 정보 확인

핵클 ABTest 진행하기

가설에 맞춰 다양한 버전을 준비하고, 고객에게 특정 비율로 제공할 수 있습니다. 이를 기반으로 분석이 가능합니다.

 

1. ABTest 만들기

 

2. ABTest 실험키 확인

나중에 스프링 코드에서 필요합니다. (실험키 5)

 

3. Test 기기 등록

사용자 식별 값으로 그룹을 지정할 수 있습니다. 

    이제 ABTest를 위한 핵클 설정이 완료됐습니다.
    진행 상태, 실험키, 트래픽 할당 비율 등등을 확인할 수 있습니다.

 

4. Spring 프로젝트에서 의존성 추가 및 설정

build.gradle

dependencies {
	implementation 'io.hackle:hackle-server-sdk:2.15.0'
}

application.yml

abtest:
  hackle:
    sdk:
      server:
        key: 6WVayKi7p15t7eZWaRmj4rCd4gCgZTdS

 

5. ABTest를 위한 컨트롤러 작업

ABTestController.java

@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping(value = "/abtest")
public class ABTestController {
    public static final String ORDER_EVENT_NAME = "hello-click";
    private final HackleClient hackleClient;
    private final int EXPERIMENT_KEY = 5;

    @GetMapping(value = {"/hello", ""})
    public String abtest(@RequestParam Long userId, Model model) {

        Variation variation = hackleClient.variation(EXPERIMENT_KEY, userId.toString());
        log.info("ABTest group = {}, userId = {}", variation, userId);

        // 할당받은 그룹에 대한 로직
        if (variation == Variation.A) {
            // 그룹 A 로직
            model.addAttribute("data", "[A안] Hi Hackle ABTest");
        } else if (variation == Variation.B) {
            // 그룹 B 로직
            model.addAttribute("data", "[B안] Hello Hackle ABTest");
        }
        model.addAttribute("userId", userId);
        return "abtest";
    }

    @PostMapping("/hello")
    public String clickEvent(OrderEvent orderEvent, RedirectAttributes attributes) {
        /* 예시 1: 이벤트 키만 전송 */
        hackleClient.track(ORDER_EVENT_NAME, orderEvent.getOrderId().toString());

        /* 예시 2: 이벤트 키와 숫자 값을 함께 전송 */
        Event event = Event.builder(ORDER_EVENT_NAME)
                .value(orderEvent.getAmount().doubleValue()) // 이벤트 키와 함께 수집할 숫자 값을 value에 넣는다
                .build();

        hackleClient.track(event.toString(), orderEvent.getUserId().toString());
        log.info("Sent abtest event = {}", orderEvent);

        return "redirect:/abtest/click-result";
    }

    @GetMapping(value = "click-result")
    public String helloClickResult() {
        return "click-result";
    }
}

 

6. ABTest 결과 확인

트래픽 분배에 따른 A, B 그룹이 다르게 적용된 것을 확인할 수 있습니다.

B 그룹
A 그룹

 

노출 현황 그래프에서도 확인 가능합니다.

핵클 기능 플래그 진행하기

1. 기능 플래그를 생성 및 활성화하기

 

2. 기능 플래그를 위한 컨트롤러 코드 작성

@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping(value = "/function-flag")
public class FunctionFlagController {
    private final HackleClient hackleClient;
    private final int functionFlagKey = 4;

    @GetMapping(value = "/hello")
    public String functionFlag(@RequestParam Long userId, Model model) {

        boolean featureOn = hackleClient.isFeatureOn(functionFlagKey, userId.toString());
        model.addAttribute("featureOn", featureOn);

        return "function-flag";
    }

}

3. 기능플래그 적용 확인 및 테스트

* featureOn 값에 따라 프런트에선 다른 UI가 보이게 됩니다.

기능 플래그가 True인 유저
기능 플래그가 False인 유저

실시간 노출 현황에도 적용이 잘 됐는지 나타납니다.

 

여기까지 핵클 ABTest와 기능 플래그를 스프링 환경에 적용해 봤습니다.

반응형