기능 플래그를 사용하여 실험 및 A/B 테스트 구성

App Lifecycle Manager 기능 플래그 할당은 트래픽 비율을 분할하여 애플리케이션을 테스트하는 데 도움이 됩니다. 이를 통해 일부 사용자는 애플리케이션의 한 버전을 보고 다른 사용자는 다른 버전을 볼 수 있으므로 어떤 버전이나 기능이 더 성공적인지 확인할 수 있습니다 (이 프로세스를 A/B 테스트라고도 함). 기능 플래그 할당을 사용하면 트래픽을 분할하는 방법을 정의하고 할당된 변형을 애플리케이션과 통합할 수 있습니다.

이 가이드에서는 변형을 정의하고, 트래픽 분할을 구성하고, 변형을 애플리케이션과 통합하는 방법을 보여줍니다.

추적 및 분석을 간소화하려면 변형에 설명이 포함된 문자열 ID (예: '실험', '기준')를 할당하고 코드 및 분석 파이프라인에서 이러한 이름을 직접 사용해야 합니다.

기본 요건

시작하기 전에 다음 사항을 확인하세요.

  1. 기능 플래그 배포 빠른 시작 또는 기능 플래그 사용 (독립형 빠른 시작)을 완료했습니다.
  2. App Lifecycle Manager 리소스를 관리하도록 구성된 Google Cloud CLI 환경

기능 플래그 할당 구성

실험용 기능 플래그를 구성하려면 다음 단계를 따르세요.

  1. 각 사용자의 일관된 환경을 보장하기 위해 고정 버킷팅에 사용될 무작위 속성 (예: userID)을 정의합니다.

      gcloud beta app-lifecycle-manager flags attributes create "user-id-attr" \
          --key="userID" \
          --attribute-value-type="STRING" \
          --location=global
    
  2. 할당을 사용하여 분할을 정의하고 (예: 50/50) 설명 변형 ID를 참조합니다.

    # Create a flag with explicitly named variants for the experiment and a 50/50 allocation referencing the custom IDs
    gcloud beta app-lifecycle-manager flags create "search-algo-test" \
      --key="search-algo-test" \
      --flag-value-type=BOOL \
      --location="global" \
      --unit-kind="demo-test-unitkind" \
      --variants='[
          {
          "id": "experimental",
          "booleanValue": true
          },
          {
          "id": "baseline",
          "booleanValue": false
          }
      ]'\
      --evaluation-spec='{
          "allocations": [{
              "id": "search-split-50-50",
              "randomizedOn": "userID",
              "slots": [
              {"variant": "baseline", "weight": 50},
              {"variant": "experimental", "weight": 50}
              ]
          }],
          "defaultTarget": "search-split-50-50",
          "attributes": ["projects/PROJECT_ID/locations/global/flagAttributes/user-id-attr"]
      }'
    
  3. 백엔드 서비스에서 OpenFeature SDK를 초기화하고 평가 컨텍스트에 userID를 삽입합니다. BooleanValueDetails(또는 언어에 해당하는 메서드) 메서드를 사용하여 애플리케이션에서 variantID (문자열)을 검색합니다. 이렇게 하면 불리언 값뿐만 아니라 설명이 포함된 이름을 기반으로 백엔드 로직을 전환할 수 있습니다.

    // 1. Prepare evaluation context
    evalCtx := map[string]any{"userID": currentUser.ID}
    
    // 2. Fetch evaluation details to get the variant name
    details, err := client.BooleanValueDetails(ctx, "search-algo-test", false, evalCtx)
    
    // 3. Execute logic based on the Variant ID (string name)
    if details.Variant == "experimental" {
        results = search.ExperimentalV2(query)
    } else {
        results = search.BaselineV1(query)
    }
    
  4. 감사 및 분석에서 문서가 자동으로 생성되도록 설명이 포함된 변형 이름을 사용하세요. 평가를 감사하려면 실적 측정항목과 함께 details.Variant 문자열을 로깅하세요.

     startTime := time.Now()
     // ... perform search ...
     duration := time.Since(startTime)
    
     // Audit: Log the descriptive variant name ("experimental" or "baseline")
     logger.Info("Search performed",
        "variant", details.Variant,
        "latency_ms", duration.Milliseconds(),
     )
    

    '실험' 그룹과 '기준' 그룹의 측정항목을 비교하면 전체 출시를 진행하기 전에 새 알고리즘이 백엔드 효율성 또는 검색 관련성을 개선하는지 수동으로 분석할 수 있습니다.

다음 단계