다음을 통해 공유


JavaScript 기능 관리

feature-management-npm-package

JavaScript 기능 관리 라이브러리는 기능 플래그를 기반으로 애플리케이션 기능을 개발하고 노출하는 방법을 제공합니다. 새로운 기능이 개발되면 많은 애플리케이션에는 해당 기능을 사용하도록 설정해야 하는 시기와 조건 등 특별한 요구 사항이 있습니다. 이 라이브러리는 이러한 관계를 정의하는 방법을 제공하고 일반적인 JavaScript 코드 패턴에 통합되어 이러한 기능을 노출할 수 있도록 합니다.

기능 플래그는 JavaScript 애플리케이션이 기능을 동적으로 켜거나 끌 수 있는 방법을 제공합니다. 개발자는 조건문과 같은 간단한 사용 사례에서 기능 플래그를 사용할 수 있습니다.

JavaScript 기능 관리 라이브러리를 사용할 경우의 이점은 다음과 같습니다.

  • 기능 관리에 대한 일반적인 규칙
  • 진입 장벽이 낮음
    • JSON 개체와 지도 기반 기능 플래그 원본을 모두 지원합니다.
    • Node.js 및 브라우저 환경 모두에서 사용 지원
  • Azure 앱 구성을 사용하여 기능 플래그 수명 관리
    • 구성 값은 실시간으로 변경할 수 있습니다.
  • 간단한 시나리오에서 복잡한 시나리오를 다룹니다.
    • 선언적 구성 파일을 통해 기능 켜기/끄기 전환
    • 서버 호출을 기반으로 기능 상태를 동적으로 평가합니다.

JavaScript 기능 관리 라이브러리는 오픈 소스. 자세한 내용을 보려면 GitHub 리포지토리를 참조하세요.

참고 항목

기능 관리 라이브러리를 Azure 앱 Configuration과 함께 사용하는 것이 좋습니다. Azure 앱 구성은 애플리케이션 설정 및 기능 플래그를 중앙에서 관리하기 위한 솔루션을 제공합니다. 자세한 내용은 이 섹션을 참조하세요.

기능 플래그

기능 플래그는 이름과 기능을 활성화하는 데 사용되는 기능 필터 목록의 두 부분으로 구성됩니다.

기능 필터

기능 필터는 기능을 사용하도록 설정해야 하는 경우에 대한 시나리오를 정의합니다. 기능의 켜기 또는 끄기를 평가할 때 필터 중 하나가 해당 기능을 사용하도록 설정해야 한다고 결정할 때까지 해당 기능 필터 목록이 트래버스됩니다. 이 시점에서 기능은 사용하도록 설정된 것으로 간주되며 기능 필터를 통한 트래버스가 중지됩니다. 기능을 사용하도록 설정해야 함을 나타내는 기능 필터가 없으면 사용하지 않도록 설정된 것으로 간주됩니다.

예를 들어, Microsoft Edge 브라우저 기능 필터를 설계할 수 있습니다. 이 기능 필터는 HTTP 요청이 Microsoft Edge에서 오는 한, 연결된 모든 기능을 활성화합니다.

기능 플래그 구성

JavaScript에서 개발자는 일반적으로 개체 또는 맵을 기본 데이터 구조로 사용하여 구성을 나타냅니다. JavaScript 기능 관리 라이브러리는 두 가지 구성 접근 방식을 모두 지원하므로 개발자는 요구 사항에 가장 적합한 옵션을 유연하게 선택할 수 있습니다. 기본 FeatureManager 제공 ConfigurationObjectFeatureFlagProviderConfigurationMapFeatureFlagProvider을 사용하여 다양한 유형의 구성에서 기능 플래그를 읽을 수 있습니다.

const config = new Map([
    ["feature_management", {
        "feature_flags": [
            {
                "id": "FeatureT",
                "enabled": true
            },
            {
                "id": "FeatureU",
                "enabled": false
            }
        ]
    }],
    ["some other configuration", " some value"]
]);

import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const featureProvider = new ConfigurationMapFeatureFlagProvider(config);
const featureManager = new FeatureManager(featureProvider);

Azure 앱 구성의 기능 플래그 사용

기능 플래그를 애플리케이션에 하드 코딩하는 대신, 기능 플래그를 애플리케이션 외부에 유지하고 별도로 관리하는 것이 좋습니다. 이렇게 하면 언제든지 플래그 상태를 수정하고 해당 변경 내용을 애플리케이션에 즉시 적용할 수 있습니다. Azure App Configuration 서비스는 모든 기능 플래그를 관리하기 위한 전용 포털 UI를 제공합니다. 자습서를 참조하세요.

또한 Azure 앱 Configuration 서비스는 JavaScript 클라이언트 라이브러리 @azure/app-configuration-provider를 통해 애플리케이션에 기능 플래그를 직접 제공합니다. 다음 예제에서는 라이브러리를 사용하는 방법을 보여줍니다.

App Configuration JavaScript 공급자는 개체에 기능 플래그를 Map 제공합니다. 기본 제공 ConfigurationMapFeatureFlagProvider 은 이 경우 기능 플래그를 로드하는 데 도움이 됩니다.

import { DefaultAzureCredential } from "@azure/identity";
import { load } from "@azure/app-configuration-provider";
import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const appConfig = await load("YOUR_APP-CONFIG-ENDPOINT",
                             new DefaultAzureCredential(), // For more information: https://learn.microsoft.com/javascript/api/overview/azure/identity-readme
                             {featureFlagOptions: { enabled: true }}); // load feature flags from Azure App Configuration service
const featureProvider = new ConfigurationMapFeatureFlagProvider(appConfig);
const featureManager = new FeatureManager(featureProvider);

참고 항목

Azure 앱 Configuration에서 기능 관리 라이브러리를 사용하는 방법에 대한 자세한 내용은 빠른 시작을 참조하세요.

기능 플래그 선언

다음 예제에서는 JSON 파일에서 기능 플래그를 설정하는 데 사용되는 형식을 보여줍니다.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "FeatureT",
                "enabled": true
            },
            {
                "id": "FeatureU",
                "enabled": false
            },
            {
                "id": "FeatureV",
                "enabled": true,
                "conditions": {
                    "client_filters": [
                        {
                            "name": "Microsoft.TimeWindow",
                            "parameters": {
                                "Start": "Wed, 01 May 2019 13:59:59 GMT",
                                "End": "Mon, 01 Jul 2019 00:00:00 GMT"
                            }
                        }
                    ]
                }
            }
        ]
    }
}

feature_management 섹션은 규칙에 따라 기능 플래그 설정을 로드하는 데 사용됩니다. feature_flags 섹션은 라이브러리에 로드되는 기능 플래그 목록입니다. 위 섹션에서는 세 가지 다른 기능을 볼 수 있습니다. 기능은 conditions 내에서 client_filters 속성을 사용하여 기능 필터를 정의합니다. 기능 필터FeatureT에서 정의된 필터 FeatureTtrue 없으므로 enabled 항상 반환됩니다 true . FeatureUFeatureT와 동일하지만 enabledfalse이므로 해당 기능이 항상 false를 반환합니다. FeatureVMicrosoft.TimeWindow라는 기능 필터를 지정합니다. FeatureV는 구성 가능한 기능 필터의 예입니다. 이 예에서 필터에 parameters 속성이 있음을 볼 수 있습니다. parameters 속성은 필터를 구성하는 데 사용됩니다. 이 경우 해당 기능이 활성화되는 시작 및 종료 시간이 구성됩니다.

feature_management 섹션의 자세한 스키마는 여기에서 확인할 수 있습니다.

고급: 기능 플래그 이름에는 콜론 ':'을 사용할 수 없습니다.

요구 사항 유형

기능 플래그의 requirement_type 속성은 기능 상태를 평가할 때 필터가 Any 또는 All 논리를 사용해야 하는지 결정하는 데 사용됩니다. requirement_type이 지정되지 않은 경우 기본값은 Any입니다.

  • Any는 기능을 사용하도록 설정하려면 하나의 필터만 true로 평가되어야 함을 의미합니다.
  • All은 기능을 사용하도록 설정하려면 모든 필터가 true로 평가되어야 함을 의미합니다.

Allrequirement_type은 트래버스를 변경합니다. 첫째, 필터가 없으면 기능이 사용하지 않도록 설정됩니다. 그런 다음 필터 중 하나가 해당 기능을 사용하지 않도록 설정해야 한다고 결정할 때까지 기능 필터가 트래버스됩니다. 기능을 사용하지 않도록 설정해야 함을 나타내는 필터가 없으면 사용하도록 설정된 것으로 간주됩니다.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "FeatureW",
                "enabled": true,
                "conditions": {
                    "requirement_type": "All",
                    "client_filters": [
                        {
                            "name": "Microsoft.TimeWindow",
                            "parameters": {
                                "Start": "Wed, 01 May 2019 13:59:59 GMT",
                                "End": "Mon, 01 Jul 2019 00:00:00 GMT"
                            }
                        },
                        {
                            "name": "Percentage",
                            "parameters": {
                                "Value": "50"
                            }
                        }
                    ]
                }
            },
        ]
    }
}

위의 예에서 FeatureWAllrequirement_type을 지정합니다. 즉, 기능을 사용하도록 설정하려면 모든 필터가 true로 평가되어야 합니다. 이 경우 지정된 기간 동안 50%의 사용자에게 이 기능이 사용하도록 설정됩니다.

소비

기능 관리의 기본 형태는 기능 플래그가 사용하도록 설정되어 있는지 확인한 다음 그 결과에 따라 작업을 수행하는 것입니다. 기능 플래그의 상태를 확인하는 작업은 FeatureManagerisEnabled 메서드를 통해 수행됩니다.

import { ConfigurationMapFeatureFlagProvider, FeatureManager } from "@microsoft/feature-management";
const featureProvider = new ConfigurationMapFeatureFlagProvider(config);
const featureManager = new FeatureManager(featureProvider);

const isBetaEnabled = await featureManager.isEnabled("Beta");
if (isBetaEnabled) {
    // Do something
}

기능 필터 구현

기능 필터를 만들면 정의한 기준에 따라 기능을 사용하도록 설정할 수 있습니다. 기능 필터를 구현하려면 IFeatureFilter 인터페이스를 구현해야 합니다. IFeatureFilter 에는 name 속성과 이름이 지정된 evaluate메서드가 있습니다. 구성 name 에서 기능 플래그 내에서 기능 필터를 참조하는 데 사용해야 합니다. 기능이 기능 필터에 대해 사용하도록 설정될 수 있음을 지정하면 evaluate 메서드가 호출됩니다. evaluatetrue를 반환하는 경우 해당 기능을 사용하도록 설정해야 한다는 의미입니다.

interface IFeatureFilter {
    name: string;
    evaluate(context: IFeatureFilterEvaluationContext, appContext?: unknown): boolean | Promise<boolean>;
}

다음 코드 조각에서는 이름으로 MyCriteria사용자 지정된 기능 필터를 구현하는 방법을 보여 줍니다.

    class MyCriteriaFilter {
        name = "MyCriteria";
        evaluate(context, appContext) {
            if (satisfyCriteria()) {
                return true;
            }
            else {
                return false;
            }
        }
    }

를 만들 때 사용자 지정 필터를 FeatureManager등록해야 합니다.

const featureManager = new FeatureManager(ffProvider, {customFilters: [new MyCriteriaFilter()]});

매개 변수가 있는 기능 필터

일부 기능 필터에는 기능을 켜야 하는지 여부를 결정하는 매개 변수가 필요합니다. 예를 들어, 브라우저 기능 필터는 특정 브라우저 집합에 대한 기능을 켤 수 있습니다. Edge 및 Chrome 브라우저에서는 기능을 사용하도록 설정하는 것이 바람직할 수 있지만 Firefox에서는 그렇지 않습니다. 이를 위해 매개 변수를 예상하도록 기능 필터를 설계할 수 있습니다. 이러한 매개 변수는 기능 구성에 지정되며 코드에서는 IFeatureFilter.EvaluateIFeatureFilterEvaluationContext 매개 변수를 통해 액세스할 수 있습니다.

interface IFeatureFilterEvaluationContext {
    featureName: string;
    parameters?: unknown;
}

IFeatureFilterEvaluationContext에는 parameters라는 속성이 있습니다. 이러한 매개 변수는 기능 필터가 기능 사용 여부를 평가하는 방법을 결정하는 데 사용할 수 있는 원시 구성을 나타냅니다. 브라우저 기능 필터를 다시 한 번 예로 사용하기 위해 필터는 parameters를 사용하여 기능을 위해 지정될 허용 브라우저 집합을 추출한 다음 요청이 해당 브라우저 중 하나에서 전송되고 있는지 확인할 수 있습니다.

기능 평가에 애플리케이션 컨텍스트 사용

기능 필터는 기능 플래그를 평가하기 위해 런타임 애플리케이션 컨텍스트가 필요할 수 있습니다. 를 호출 isEnabled할 때 컨텍스트를 매개 변수로 전달할 수 있습니다.

featureManager.isEnabled("Beta", { userId : "Sam" })

기능 필터는 호출될 때 isEnabled 전달되는 컨텍스트를 활용할 수 있습니다. 애플리케이션 컨텍스트는 두 번째 매개 변수 IFeatureFilter.Evaluate로 전달됩니다.

기본 제공 기능 필터

패키지TimeWindowFilterTargetingFilter와 함께 제공되는 두 가지 기능 필터가 FeatureManagement 있습니다.

기본 제공된 각 기능 필터에는 고유한 매개 변수가 있습니다. 다음은 예를 함께 보여 주는 기능 필터 목록입니다.

Microsoft.TimeWindow

이 필터는 기간을 기반으로 기능을 사용하도록 설정하는 기능을 제공합니다. End만 지정된 경우 해당 시간까지 기능이 사용되는 것으로 간주됩니다. Start만 지정된 경우 해당 시간 이후의 모든 지점에서 기능이 켜진 것으로 간주됩니다.

"client_filters": [
    {
        "name": "Microsoft.TimeWindow",
        "parameters": {
            "Start": "Wed, 01 May 2019 13:59:59 GMT",
            "End": "Mon, 01 Jul 2019 00:00:00 GMT"
        }
    }
]     

Microsoft.Targeting

이 필터는 대상 그룹 고객을 위한 기능을 사용하도록 설정하는 기능을 제공합니다. 대상 지정에 대한 자세한 설명은 아래의 대상 지정 섹션에 설명되어 있습니다. 필터 매개 변수에는 사용자, 그룹, 제외된 사용자/그룹, 기능에 액세스해야 하는 사용자 기반의 기본 비율을 설명하는 Audience 개체가 포함됩니다. Groups 섹션에 나열된 각 그룹 개체는 액세스 권한을 가져야 하는 그룹 멤버의 비율도 지정해야 합니다. 사용자가 Exclusion 섹션에 직접 지정된 경우 또는 사용자가 제외된 그룹에 있는 경우 기능이 사용하지 않도록 설정됩니다. 또한 사용자가 Users 섹션에 직접 지정되거나, 사용자가 임의 그룹 출시의 포함된 비율에 속하거나, 사용자가 기본 출시 비율에 속하는 경우 해당 사용자는 기능을 사용하도록 설정하게 됩니다.

"client_filters": [
    {
        "name": "Microsoft.Targeting",
        "parameters": {
            "Audience": {
                "Users": [
                    "Jeff",
                    "Alicia"
                ],
                "Groups": [
                    {
                        "Name": "Ring0",
                        "RolloutPercentage": 100
                    },
                    {
                        "Name": "Ring1",
                        "RolloutPercentage": 50
                    }
                ],
                "DefaultRolloutPercentage": 20,
                "Exclusion": {
                    "Users": [
                        "Ross"
                    ],
                    "Groups": [
                        "Ring2"
                    ]
                }
            }
        }
    }
]

대상 지정

대상 지정은 개발자가 사용자 기반에 새로운 기능을 점진적으로 롤아웃할 수 있도록 하는 기능 관리 전략입니다. 이 전략은 대상 그룹으로 알려진 일련의 사용자를 대상으로 지정한다는 개념을 바탕으로 빌드되었습니다. 대상 그룹은 특정 사용자, 그룹, 제외된 사용자/그룹, 전체 사용자 기반 중 지정된 비율로 구성됩니다. 대상 그룹에 포함된 그룹은 전체 멤버의 비율로 더 세분화될 수 있습니다.

다음 단계에서는 새로운 '베타' 기능에 대한 점진적 출시의 예를 보여 줍니다.

  1. 개별 사용자인 Jeff와 Alicia에게 베타에 대한 액세스 권한이 부여됩니다.
  2. 다른 사용자인 Mark가 옵트인을 요청하여 포함되었습니다.
  3. "Ring1" 사용자로 알려진 그룹의 20%가 베타에 포함되어 있습니다.
  4. 베타에 포함된 "Ring1" 사용자 수는 최대 100%까지 증가합니다.
  5. 사용자 기반의 5%가 베타에 포함됩니다.
  6. 출시 비율이 100%까지 올라가고 기능이 완전히 출시됩니다.

기능을 롤아웃하기 위한 이 전략은 포함된 Microsoft.Targeting 기능 필터를 통해 라이브러리에 기본 제공됩니다.

대상 지정 컨텍스트를 사용하여 사용자 대상 지정

대상 지정 필터는 대상 지정 컨텍스트를 사용하여 기능을 켜야 하는지 여부를 평가합니다. 이 대상 지정 컨텍스트에는 현재 평가 중인 사용자 및 사용자가 속한 그룹 등의 정보가 포함됩니다. 대상 지정 컨텍스트는 호출될 때 isEnabled 직접 전달되어야 합니다.

featureManager.isEnabled("Beta", { userId: "Aiden", groups: ["Ring1"] })

대상 지정 제외

대상 그룹을 정의할 때 사용자 및 그룹을 대상 그룹에서 제외할 수 있습니다. 제외는 기능이 사용자 그룹에 출시될 때 유용하지만 일부 사용자 또는 그룹을 출시에서 제외해야 합니다. 제외는 대상 그룹의 Exclusion 속성에 사용자 및 그룹 목록을 추가하여 정의됩니다.

"Audience": {
    "Users": [
        "Jeff",
        "Alicia"
    ],
    "Groups": [
        {
            "Name": "Ring0",
            "RolloutPercentage": 100
        }
    ],
    "DefaultRolloutPercentage": 0,
    "Exclusion": {
        "Users": [
            "Mark"
        ]
    }
}

위의 예에서는 JeffAlicia라는 사용자에 대해 기능이 사용하도록 설정되었습니다. Ring0이라는 그룹의 사용자에 대해서도 사용하도록 설정되어 있습니다. 그러나 사용자 이름이 Mark인 경우 그룹 Ring0에 속해 있는지 여부에 관계없이 기능이 사용하지 않도록 설정됩니다. 제외는 나머지 대상 지정 필터보다 우선 순위가 높습니다.

변형

새로운 기능이 애플리케이션에 추가되면 기능에 여러 가지 다른 디자인 옵션이 제안되는 경우가 있을 수 있습니다. 디자인을 결정하기 위한 일반적인 솔루션은 사용자 기반의 다양한 세그먼트에 기능의 다른 버전을 제공하고 사용자 상호 작용을 기반으로 버전을 선택하는 일종의 A/B 테스트입니다. 이 라이브러리에서 이 기능은 변형이 있는 기능의 다양한 구성을 나타냄으로써 사용하도록 설정됩니다.

변형을 사용하면 기능 플래그가 단순한 켜기/끄기 플래그 이상이 될 수 있습니다. 변형은 문자열, 숫자, 부울 또는 구성 개체일 수 있는 기능 플래그의 값을 나타냅니다. 변형을 선언하는 기능 플래그는 각 변형을 사용해야 하는 상황을 정의해야 합니다. 이에 대한 자세한 내용은 변형 할당 섹션에서 다룹니다.

대상 지정 컨텍스트를 사용하여 변형 가져오기

각 기능에 대해 FeatureManagergetVariant 메서드를 사용하여 변형을 검색할 수 있습니다. 변형 할당은 현재 평가 중인 사용자에 따라 달라지고 해당 정보는 전달한 대상 지정 컨텍스트에서 가져옵니다.

const variant = await featureManager.getVariant("MyVariantFeatureFlag", { userId: "Sam" });

const variantName = variant.name;
const variantConfiguration = variant.configuration;

// Do something with the resulting variant and its configuration

변형 기능 플래그 선언

일반 기능 플래그와 비교하여 변형 기능 플래그에는 variantsallocation이라는 두 가지 추가 속성이 있습니다. variants 속성은 이 기능에 대해 정의된 변형을 포함하는 배열입니다. allocation 속성은 이러한 변형을 기능에 할당하는 방법을 정의합니다. 일반 기능 플래그를 선언하는 것과 마찬가지로 JSON 파일에서 변형 기능 플래그를 설정할 수 있습니다. 다음은 변형 기능 플래그의 예입니다.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyVariantFeatureFlag",
                "enabled": true,
                "allocation": {
                    "default_when_enabled": "Small",
                    "group": [
                        {
                            "variant": "Big",
                            "groups": [
                                "Ring1"
                            ]
                        }
                    ]
                },
                "variants": [
                    { 
                        "name": "Big"
                    },  
                    { 
                        "name": "Small"
                    } 
                ]
            }
        ]
    }
}

변형 정의

각 변형에는 이름과 구성이라는 두 가지 속성이 있습니다. 이름은 특정 변형을 참조하는 데 사용되며 구성은 해당 변형의 값입니다. configuration_value 속성을 사용하여 구성을 설정할 수 있습니다. configuration_value는 문자열, 숫자, 부울 또는 구성 개체일 수 있는 인라인 구성입니다. configuration_value를 지정하지 않으면 반환된 변형의 configuration 속성이 undefined이 됩니다.

가능한 모든 변형 목록은 variants 속성 아래 각 기능에 대해 정의됩니다.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyVariantFeatureFlag",
                "variants": [
                    { 
                        "name": "Big", 
                        "configuration_value": {
                            "Size": 500
                        }
                    },  
                    { 
                        "name": "Small", 
                        "configuration_value": {
                            "Size": 300
                        }
                    } 
                ]
            }
        ]
    }
}

변형 할당

기능의 변형을 할당하는 프로세스는 기능의 allocation 속성에 따라 결정됩니다.

"allocation": { 
    "default_when_enabled": "Small", 
    "default_when_disabled": "Small",  
    "user": [ 
        { 
            "variant": "Big", 
            "users": [ 
                "Marsha" 
            ] 
        } 
    ], 
    "group": [ 
        { 
            "variant": "Big", 
            "groups": [ 
                "Ring1" 
            ] 
        } 
    ],
    "percentile": [ 
        { 
            "variant": "Big", 
            "from": 0, 
            "to": 10 
        } 
    ], 
    "seed": "13973240" 
},
"variants": [
    { 
        "name": "Big", 
        "configuration_value": "500px"
    },  
    { 
        "name": "Small", 
        "configuration_value": "300px"
    } 
]

기능의 allocation 설정에는 다음과 같은 속성이 있습니다.

속성 설명
default_when_disabled 기능이 사용하지 않도록 설정된 것으로 간주되는 동안 변형이 요청될 때 사용해야 하는 변형을 지정합니다.
default_when_enabled 기능이 사용하도록 설정된 것으로 간주되고 사용자에게 다른 변형이 할당되지 않은 상태에서 변형이 요청될 때 사용해야 하는 변형을 지정합니다.
user 변형과 해당 변형을 할당해야 하는 사용자 목록을 지정합니다.
group 변형 및 그룹 목록을 지정합니다. 사용자가 그룹 중 하나 이상에 속해 있으면 변형이 할당됩니다.
percentile 해당 변형이 할당되기 위해 사용자가 계산한 백분율이 맞아야 하는 변형 및 백분율 범위를 지정합니다.
seed percentile에 대한 백분율 계산의 기준이 되는 값입니다. 동일한 seed 값이 사용되는 경우 특정 사용자에 대한 백분율 계산은 모든 기능에서 동일합니다. seed가 지정되지 않으면 기능 이름을 기반으로 기본 시드가 만들어집니다.

기능이 사용하도록 설정되지 않은 경우 기능 관리자는 default_when_disabled로 표시된 변형을 현재 사용자에게 할당하며 이 경우에는 Small입니다.

기능이 사용하도록 설정된 경우 기능 관리자는 변형을 할당하기 위해 user, grouppercentile 할당을 순서대로 확인합니다. 이 특정 예에서 평가 중인 사용자의 이름이 Ring1인 그룹에서 Marsha인 경우 또는 사용자가 우연히 0에서 10번째 백분위수 사이에 속하는 경우 지정된 변형이 사용자에게 할당됩니다. 이 경우 할당된 모든 사용자는 Big 변형을 반환합니다. 이러한 할당 중 일치하는 것이 없으면 사용자에게 default_when_enabled 변형, 즉 Small이 할당됩니다.

할당 논리는 Microsoft.Targeting 기능 필터와 유사하지만 할당에는 없지만 대상 지정에는 존재하는 일부 매개 변수가 있으며 그 반대의 경우도 마찬가지입니다. 대상 지정과 할당의 결과는 관련이 없습니다.

변형으로 사용 안 함 상태 재정의

변형을 사용하여 기능 플래그의 사용하도록 설정 상태를 재정의할 수 있습니다. 재정의하면 변형에 기능 플래그의 평가를 확장할 수 있는 기회가 제공됩니다. 변형이 있는 플래그에서 is_enabled을(를) 호출하는 경우 기능 관리자는 현재 사용자에게 할당된 변형이 결과를 재정의하도록 구성되어 있는지 확인합니다. 재정의는 선택적 변형 속성 status_override를 사용하여 수행됩니다. 기본적으로 이 속성은 None으로 설정됩니다. 즉, 이 플래그가 사용 또는 사용 안 함으로 간주되는지에 따라 변형에 영향을 미치지 않습니다. status_overrideEnabled로 설정하면 변형이 선택될 때 사용하도록 설정할 플래그를 재정의할 수 있습니다. status_overrideDisabled로 설정하면 반대 기능이 제공되므로 변형이 선택될 때 플래그가 사용하지 않도록 설정됩니다. enabled 상태가 false인 기능은 재정의할 수 없습니다.

이진 파일 변형과 함께 기능 플래그를 사용하는 경우 status_override 속성이 유용할 수 있습니다. 이를 통해 백분위수 할당 및 시드와 같은 변형과 함께 제공되는 새로운 기능의 혜택을 활용하면서 애플리케이션에서 is_enabled와 같은 API를 계속 사용할 수 있습니다.

{
    "id": "MyVariantFeatureFlag",
    "enabled": true,
    "allocation": {
        "percentile": [
            {
                "variant": "On",
                "from": 10,
                "to": 20
            }
        ],
        "default_when_enabled":  "Off",
        "seed": "Enhanced-Feature-Group"
    },
    "variants": [
        {
            "name": "On"
        },
        {
            "name": "Off",
            "status_override": "Disabled"
        }
    ]
}

위의 예에서는 이 기능이 항상 사용하도록 설정되어 있습니다. 현재 사용자가 계산된 백분위수 범위 10~20에 있으면 On 변형이 반환됩니다. 그렇지 않으면 Off 변형이 반환되고 status_overrideDisabled와 같기 때문에 이제 기능이 사용하지 않도록 설정된 것으로 간주됩니다.

원격

기능 플래그 변경 내용이 배포되면 해당 변경 내용이 애플리케이션에 미치는 영향을 분석하는 것이 중요한 경우가 많습니다. 예를 들어, 다음과 같은 몇 가지 질문이 발생할 수 있습니다.

  • 내 플래그가 예상대로 사용하거나 사용하지 않도록 설정되어 있나요?
  • 대상 사용자가 예상대로 특정 기능에 액세스하고 있나요?
  • 특정 사용자에게 어떤 변형이 표시되나요?

이러한 형식의 질문은 기능 플래그 평가 이벤트의 발생 및 분석을 통해 답할 수 있습니다.

원격 분석 사용

기본적으로 기능 플래그에는 원격 분석이 내보내지지 않습니다. 특정 기능 플래그에 대한 원격 분석을 게시하려면 플래그가 원격 분석 내보내기에 대해 사용하도록 설정되었음을 반드시 선언해야 합니다.

json에 정의된 기능 플래그의 경우 telemetry 속성을 사용하여 사용하도록 설정합니다.

{
    "feature_management": {
        "feature_flags": [
            {
                "id": "MyFeatureFlag",
                "enabled": true,
                "telemetry": {
                    "enabled": true
                }
            }
        ]
    }
}

위의 코드 조각은 원격 분석에 사용하도록 설정된 MyFeatureFlag라는 기능 플래그를 정의합니다. telemetry 개체의 enabled 속성은 true로 설정됩니다. 플래그에 대한 원격 분석을 게시하려면 enabled 속성의 값이 true여야 합니다.

기능 플래그의 telemetry 섹션에는 다음과 같은 속성이 있습니다.

속성 설명
enabled 기능 플래그에 대해 원격 분석을 게시해야 하는지 여부를 지정합니다.
metadata 기능 플래그에 대한 사용자 지정 메타데이터를 평가 이벤트에 연결하는 데 사용할 수 있는 사전으로 모델링된 키-값 쌍의 컬렉션입니다.

사용자 지정 원격 분석 게시

를 만들 FeatureManager때 콜백 함수를 onFeatureEvaluated 등록할 수 있습니다. 이 콜백은 기능 플래그가 평가되고 해당 플래그에 대해 원격 분석을 사용할 때마다 호출됩니다. 콜백 함수는 기능 평가 결과를 매개 변수로 사용합니다.

다음 예제에서는 기능 평가 결과에서 추출된 정보를 사용하여 원격 분석을 보내고 기능 관리자에 등록하는 사용자 지정 콜백 함수를 구현하는 방법을 보여줍니다.

const sendTelemetry = (evaluationResult) => {
    const featureId = evaluationResult.feature.id;
    const featureEnabled = evaluationResult.enabled;
    const targetingId = evaluationResult.targetingId;
    const variantName = evaluationResult.variant?.name;
    const variantAssignmentReason = evaluationResult.variantAssignmentReason;
    // custom code to send the telemetry
    // ...
}
const featureManager = new FeatureManager(featureProvider, { onFeatureEvaluated :  sendTelemtry});

Application Insights 통합

JavaScript 기능 관리 라이브러리는 Application Insights SDK와 통합되는 확장 패키지를 제공합니다.

Application Insights는 웹Node.js 시나리오에 대해 다양한 SDK를 제공합니다. 애플리케이션에 대한 올바른 확장 패키지를 선택하세요.

애플리케이션이 브라우저에서 실행되는 경우 패키지를 설치합니다 "@microsoft/feature-management-applicationinsights-browser" . 다음 예제에서는 기본 제공 Application Insights 원격 분석 게시자를 만들고 기능 관리자에 등록하는 방법을 보여 줍니다.

import { ApplicationInsights } from "@microsoft/applicationinsights-web"
import { FeatureManager, ConfigurationObjectFeatureFlagProvider } from "@microsoft/feature-management";
import { createTelemetryPublisher, trackEvent } from "@microsoft/feature-management-applicationinsights-browser";

const appInsights = new ApplicationInsights({ config: {
    connectionString: "<APPINSIGHTS_CONNECTION_STRING>"
}});
appInsights.loadAppInsights();

const publishTelemetry = createTelemetryPublisher(appInsights);
const provider = new ConfigurationObjectFeatureFlagProvider(jsonObject);
const featureManager = new FeatureManager(provider, {onFeatureEvaluated: publishTelemetry});

// FeatureEvaluation event will be emitted when a feature flag is evaluated
featureManager.getVariant("TestFeature", {userId : TARGETING_ID}).then((variant) => { /* do something*/ });

// Emit a custom event with targeting id attached.
trackEvent(appInsights, TARGETING_ID, {name: "TestEvent"}, {"Tag": "Some Value"});

원격 분석 게시자는 원격 분석으로 사용하도록 설정된 기능 플래그가 평가될 때 Application Insights에 사용자 지정 이벤트를 보냅니 FeatureEvaluation 다. 사용자 지정 이벤트는 FeatureEvaluationEvent 스키마를 따릅니다.

다음 단계

애플리케이션에서 기능 플래그를 사용하는 방법을 알아보려면 다음 빠른 시작을 계속 진행합니다.

기능 필터를 사용하는 방법을 알아보려면 다음 자습서를 계속 진행합니다.